- 博客(59)
- 收藏
- 关注
原创 gcsfuse的symlinks模拟:Legacy和Standard两种方法
GCS为对象存储,其对象的命名空间是扁平的(bucket, name) -> bytes + metadat,没有inode,也没有symlink的概念。因此FUSE需要一种机制来让对象存储模拟文件存储的symlink。metadata 有 goog-reserved-file-is-symlink==true?直接取 gcsfuse_symlink_target 的 value。来兼容Legacy和Standard两种symlink实现方式。:构造SymlinkInode结构体,通过。
2026-09-10 14:46:02
181
原创 gcsfuse的gzip
透明解压(transparent decompression)是HTTP客户端库(Go的net/http)在客户端完全没有要求的情况下,自动完成了gzip的协商与解码,让上层代码“看不见”压缩的存在。代码从resp.Body读到的已经是解压后的明文字节,仿佛压缩从未发生过。“透明”的另一面是“不可见”。它同时抹掉了三个证据:响应头里的,以及解压动作本身。除了问题时看到的不是报错,而是字节数对不上这种静默错位。
2026-09-08 19:56:41
127
原创 ceph index-less桶可以用radosgw-admin bucket rm吗
不行。对 indexless bucket 会"成功"退出(exit 0),但。
2026-08-26 14:57:24
202
原创 gcsfuse与中断FUSE_INTERRUPT
发起某个请求的那个进程被信号打断了,请尽快终止那个在途请求“。// 指向被中断的原始请求的唯一 ID它由内核发起,携带一个unique字段,指明要终止的是哪一个在途请求。核心语义是“尽力而为的提示”, daemon可以终止该请求,也可以无视它继续做完。发送中断后,内核仍然会等待daemon恢复原始请求。本质上gcsfuse 中的的参数时在“POSIX中断语义(可被Ctrl-C打断)“与”远端写操作的原子性/一致性“之间做的一个全局粗粒度的取舍。默认对所有操作类型的中断都是”不理会中断“。
2026-08-25 15:24:30
259
原创 一些我开发过程中用到的AI配置
当用户询问某个概念/术语时,回答应遵循三段式结构:1. What — 这个概念是什么(定义、本质);2. Why — 为什么需要这个概念(它解决了什么问题、存在的动机);3. How — 如何设计和实现的,为什么这样设计而不是那样设计(设计决策、trade-off 分析)。
2026-08-06 20:41:38
185
原创 gcsfuse的generation以及412 PreconditionFail
上文中提到了gcsfuse中针对gcs返回的的利用,从而用于处理本地打开一个文件后,还未关闭,远端已经修改了这个文件这种场景。由于这是和后端存储服务端相关的功能,因此需要详细分析一下现在gcs go sdk的设计和gcsfuse的使用情况。写过一片文章分析ceph里412的处理,但是还是不够直观,因此又查看gcsfuse和gcs go sdk的代码以及官方文档,从而拼凑一下这里的设计思路和实现思路。
2026-08-01 15:30:35
333
原创 ceph中的412 precondition failed错误码
在 Ceph RGW 中的设计是一个从 HTTP 协议层出发,逐步向内层渗透的经典案例。它从纯粹的 HTTP 条件头校验(RFC 7232 协议合规)起步,逐步被复用用于内部状态校验(版本控制互斥、过期时间匹配、数据同步冲突解决),最终形成了一种“状态预期不满足”的通用语义。这种设计的优雅之处在于调用方可以用统一的方式处理"不是真正错误"的场景,但代价是语义边界变得模糊——有时 412 意味着客户端应该重试,有时意味着操作应该被静默跳过,有时仅仅意味着一个参数越界。
2026-07-30 10:35:50
256
原创 gcsfuse的TypeCache
在gcsfuse中,TypeCache的存在是为了解决一个文件系统模拟对象存储的根本gap: 对象存储的目录是由'/'prefixto在时需要判断一个字路径是文件还是目录,或不存在。在早期设计中,是独立维护了一个typeCache,每次lookUp先查询typeCache拿到cachedType,再据此决定取GCS查什么。
2026-07-27 14:26:23
188
原创 gcsfuse的statCache的正缓存与负缓存
StatObject请求需要经由网络去访问远端对象存储,是个耗时的操作,因此需要将其缓存下来。缓存有两种,一种是正向缓存,在请求了StatObject(或类似的请求),拿到了元数据之后将这个对象的元数据进行缓存;一种是负向缓存,在调用了DeleteObject(或类似的请求),记录在缓存中,表明这个对象是不存在的,无需再对这个对象发起StatObject请求。为什么需要负向缓存?是因为一个条目的存在性也是需要发起网络请求才能确认。
2026-07-23 17:34:47
236
原创 Google Cloud Storage以及对应CSI使用分层命名空间(HNS)桶时对 AI/ML 检查点性能的优化
特性命名空间模型原生分层命名空间,文件夹为一等资源实体扁平命名空间 + 前缀模拟目录,仅支持有限分层能力Blob 存储附加 HNS 层,元数据与数据分离存储检查点重命名速度比扁平存储桶快 20 倍,原子性操作,无中间状态非原子操作,时间复杂度 O (n),性能随对象数量线性下降原子操作,但存在元数据同步开销,延迟比 GCS HNS 高约 40%初始 QPS比扁平存储桶提升 8 倍,冷启动 10 分钟达 100,000 写入 QPS。
2026-05-09 14:17:33
434
原创 深度解析 Google Cloud Storage 分层命名空间(HNS)对 AI/ML 检查点性能的优化
特性命名空间模型原生分层命名空间,文件夹为一等资源实体扁平命名空间 + 前缀模拟目录,仅支持有限分层能力Blob 存储附加 HNS 层,元数据与数据分离存储检查点重命名速度比扁平存储桶快 20 倍,原子性操作,无中间状态非原子操作,时间复杂度 O (n),性能随对象数量线性下降原子操作,但存在元数据同步开销,延迟比 GCS HNS 高约 40%初始 QPS比扁平存储桶提升 8 倍,冷启动 10 分钟达 100,000 写入 QPS。
2026-05-08 16:15:58
464
原创 GCSFuse Profiles - SRE 运维指南
本指南覆盖 GCSFuse profile 的运维层面:监控、故障排查、容量规划以及与 profile 优化系统相关的事件响应。
2026-05-08 09:35:35
371
原创 GCSFuse Profiles - 用户指南
覆盖:使用 5 分钟 TTL 而非无限# 覆盖:禁用 range read 缓存Profile 先应用所有默认值,然后你的显式覆盖在其上生效。
2026-05-08 09:34:59
411
原创 GCSFuse Profiles - 设计规约
GCS 上的 AI/ML 工作负载具有高度特定的 I/O 模式,与通用场景截然不同。实现最优性能需要协调 6+ 个配置参数,它们之间的交互关系并不直观。用户不应需要深入理解 GCSFuse 内部机制才能获得高性能的 AI/ML 工作负载。
2026-05-07 18:20:39
837
原创 GCSFuse Profile 机制设计动机分析
从维度读模式顺序大读随机/range readrange read写模式顺序大写几乎不写顺序大写目录操作隐式目录列表缓存rename数据变化频率低(数据集固定)极低(模型不变)中(新 ckpt 周期产生)三个 profile 恰好覆盖了 AI/ML 管道的三个阶段:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;模型更新训练。
2026-05-07 18:20:05
295
原创 gcs-fuse-csi-driver Profiles Recommender sre ops guide
SRE、平台运维工程师: 日志分析、故障排查、容量规划、告警配置。
2026-05-07 12:13:17
195
原创 gcs-fuse-csi-driver Profiles Recommender user guide
Profiles Recommender 是一个自动缓存调优系统。你的 Bucket 大小(对象数量和数据总量)所在节点的硬件类型(GPU / TPU / 通用节点)可用内存和临时存储容量自动计算最优的stat cache和file cache配置,无需你手动计算和设置。一句话总结: 把性能调参的认知负担从你转移到系统。metadata:labels:此时推荐器将设置 file cache = -1 (unlimited) 并跳过介质选择,让 gcsfuse 使用你提供的缓存卷。
2026-05-07 12:12:29
241
原创 从能用到性能:gcsfuse 中`CreateEmptyFile` 配置项的设计演进分析
根据代码分析,我将从设计初衷、实现对比和优化演进三个维度来回答您的问题。添加到 localFileInodes map。删除 localFileInodes 条目。创建 LocalFileInode。写入 TempFile (本地)创建 TempFile 缓冲区。对象存储 GCS/COS。创建 FileInode。立即可见的 inode。写入 TempFile。POSIX 兼容 ✅。
2026-03-17 15:44:04
382
原创 kubectl get pod 的 READY 和 STATUS 列数据来源详解
字段数据来源更新者更新时机READY 列每次探针执行后STATUS 列(基础)Kubelet容器状态变化时STATUS 列(覆盖1)Kubelet/驱逐管理器特殊事件(如驱逐)STATUS 列(覆盖2)Scheduler调度门控生效时STATUS 列(覆盖3)KubeletInit 容器状态变化STATUS 列(覆盖4)Kubelet应用容器状态变化STATUS 列(覆盖5)KubeletCompleted→Running 判断STATUS 列(覆盖6)API Server删除请求时。
2026-03-11 21:05:44
471
原创 rpmrebuild重新打包rpm
本文介绍使用rpmrebuild工具重新打包RPM的方法,适用于临时修改配置文件或替换二进制的情况。主要步骤包括:安装必要工具、设置构建目录、提取原始RPM内容、修改文件及spec文件,最后使用rpmbuild重新打包生成新的RPM包。该方法避免了重新编译,适合快速测试需求。
2026-03-10 16:00:13
115
原创 gcsfuse中的锁与偏序理论
工程在获取顺序(从先到后):先获取 后获取关键推论规则含义不同时持有多个 handle 锁同类锁之间不可比较,因此不能同时持有不同时持有多个 inode 锁同上先 handle 锁后 inode 锁(H < I),所以持有 H 时可以获取 I先 inode 锁后 FS 锁(I < FS),所以持有 I 时可以获取 FS不能先 FS 锁后 inode 锁因为 (I < FS),反向获取会违反偏序不能先 inode 锁后 handle 锁因为 (H < I),反向获取会违反偏序。
2026-03-05 20:43:36
398
原创 ceph t版本的ratelimit
Ceph T版本增强了服务端流控能力,新增对LIST/DELETE操作的独立频控,解决了对象存储常见性能瓶颈问题。基于令牌桶算法实现六维度限速(读写/带宽/LIST/DELETE),采用固定精度放大因子保证低频请求处理。设计特点包括:双缓冲GC机制管理计数器、延迟扣减带宽限制、最大欠债上限等。限速范围支持用户/桶/全局/匿名多级控制,但需注意RGW实例级执行带来的分布式限制问题。该功能通过503响应直接拒绝超限请求,不提供排队或流量整形能力。
2026-02-11 17:17:07
621
原创 AI训练存储系统的架构选型演变:对象存储为后端的文件系统概论
本文分析了AI训练存储系统的演进路线,从单机直连到当前主流的对象存储+缓存架构。重点比较了文件存储和对象存储的差异,并探讨了两种将对象存储挂载为文件系统的设计流派:直接映射型(如S3FS)和元数据分离型(如JuiceFS)。前者通用性强但性能受限,后者性能优异但数据不透明。文章指出当前最优方案是"对象存储+高性能文件网关"的分层架构,通过本地缓存和独立元数据服务来解决对象存储的性能瓶颈。最后对比了两种设计流派的优缺点,为AI训练存储选型提供了技术参考。
2026-01-19 15:18:15
949
原创 juicefs-csi中pod mount的annotation与label分析
本文分析了JuiceFS CSI驱动中PodMount模式的annotation与label设计,重点阐述了三种关键标识符的作用及实现原理
2025-08-03 13:12:18
799
原创 macbookpro m3本地部署DeepSeek模型
macbookpro m3有着十分强大的性能。在deepseek如火如荼的当下,可以尝试在本地部署并使用。还可以将自己的文档作为语料喂给deepseek,使其能成为自己专属的AI助手。本文介绍使用ollama在本地部署deepseek模型,并使用chatbox优化访问的步骤。
2025-02-05 11:08:28
1565
2
原创 使用centos8在docker环境下编译ceph reef并使用s3cmd与awscli测试
最新的ceph版本为Reef,想要体验一下,并且能够使用gdb来打断点查看。起一个centos8容器。
2024-10-14 16:58:17
526
1
原创 时间向前跳变导致Ambari-agent心跳上报失败
在分布式系统中,节点间时间同步是业务正常运行的前提。一般自己搭建ntp server来作为时间同步服务器,其他节点可以使用crontab定期通过ntpdate来进行时间同步。ambari是一套完善的集群管理系统。主要工作方式为:ambari-server作为服务端,管理各个ambari-agent端的信息收集、命令下发等操作,此时便可以通过自定义扩展模块,来实现自定义业务的管理(如ceph集群管理)。agent端将定期上报心跳和相关状态信息,来向server端知会该节点的存活状态,若一定时间内serve
2021-06-19 15:47:53
1191
原创 程序员什么时候开始写简历?最好从刚上大学开始!
作为一个程序员,有时需要帮助搜集候选人简历,然后感叹,真是受到了各种奇葩简历的精神污染啊。简历也就一两页纸,百十来字,有格式问题的(句号逗号用不对的、半角全角分不清的、段落不分粘成一堆的、甚至错别字一坨的),也有内容问题的(没有大纲线路的、过分简略不知道做了啥的、过分细节没有重点的、各种“精通”的)。像是这样的简历,除非有什么亮点十分突出,否则一般都是不会看第二眼的。刚好前段时间也在跳槽,整个都结束后,考虑到也是校招季,想着把自己理解的简历要点和常见的坑列出来给各位同学们,抛砖引玉,看能否给大家一些启发
2020-08-23 21:11:24
1526
原创 性能指标:队列深度、IOPS与时延
队列深度,更显然地说是指未完成的(outstanding)的I/O数目,或指测试工具中的"threads"表示的数目。这是性能测试的一个关键指标。具体地讲,这些概念是指测试工具一次下发的最大I/O数目,而不管测试工具、OS等的限制。对于测试工具(如vdbench)来讲,一个请求从主机下发到存储,存储完成后返回到主机,这才算是这个I/O的一个完整周期。对接深度是指主机始终维持的,未返回到主机中的请求数目。在深入理解之前,需要先理解IOPS和时延(latency)。按定义来讲,每个“thread”是指一次
2020-06-11 16:14:47
11076
原创 Designing Data-Intensive Applications翻译
一. 可用性, 可扩展性, 可维护性应用程序现在的应用程序已经从计算密集型转变为数据密集型. CPU的算力已经很少是这些应用程序的限制条件,更多的是所需处理的数据的数量, 复杂度以及数据变化的速度.…考虑一下数据系统(Data System)通常我们认为数据库, 队列, 缓存,等等是一些不同类别范围的概念, 尽管可能数据库和消息队列看起来很多相似的地方-- 例如它们都用于某时存储一些数据-...
2020-03-08 22:47:32
863
原创 数据包的超时管理:TTL
TTL的起源在各种需要进行数据包传送的场景下,数据包一般都有一个超时管理机制:Time To Live,即TTL。为什么需要这么一个机制呢?举个例子,在IP协议发送数据包的时候,可能会经过多个路由转发环节。若其中的某个环节出了问题,就可能造成这个数据包一直在数个路由器中反复转发。这样既不能正确到达目的地,也无法及时释放这些资源。如何来避免这种情况发生呢?给每个数据包都加上一个超时时间即可,...
2020-01-10 20:54:39
2520
原创 事件驱动设计模式
在进行事件方面的代码编写中,Reactor设计模式是经典、重要的一种设计模式。参考【1】 《Pattern-Oriented Software Architecture, Volume 4: A Pattern Language for Distributed Computing》,第11章《Reactor》【2】 《Redis设计与实现》 第12章 《事件》【3】 《设计模式》...
2019-12-24 11:19:10
953
原创 神奇的位操作们
位操作是一种灵活、强大的编程技巧。最简单的使用场景,是将多个字段压到一个字段中,这样可以使用更少的交互来传递更多的内容。这在LBA编址上很常见,如一个LBA应该编码进去lunId, poolId, 是否压缩,lun中逻辑地址。也常用在信息收发上:如socket中的包头,将多种信息压缩到一个头中一次收发。此处需要注意的是位的偏移长度,以及在实现的时候需要注意将每个字段强转为待压字段的长度单位...
2019-12-23 19:19:35
273
原创 函数的执行、调用、堆栈与递归
前提先需要简要叙述一下一个C程序的运行流程。我们知道基本的冯诺依曼计算机体系:CPU–内存–外存。CPU中具有一些寄存器可以用来暂存要操作的对象,并存储处理结束后的数据。程序编译完成之后,当内核通过exec函数来执行C程序是,在调用main前会先调用一个特殊的启动例程,该例程将会将段页式内存管理数据总线、控制总线参考【1】 UNIX环境高级编程【2】 汇编语言,第三版...
2019-12-17 16:30:39
360
原创 C/C++基础:函数/指针/多态
变量内存地址与指针我们知道内存是一块能够存储数据的区域。从本质上来讲,存储器被划分为若干个存储单元,每个存储单元都有一个固定的编号,即内存地址。计算机的最小信息单位为1bit,但是作为内存的最小处理单位是字节,即8bit(【1】p4)。变量的存取方式int a = 100;如上所示,在声明了一个int型的变量。此时,编译器会为其申请一块int大小的内存区域,并在这块内存区域中放入值100...
2019-12-17 11:06:52
787
原创 分布式存储系统中重删功能的设计
什么是重删一般有哪几种重删设计思路:在线重删,各自优缺点离线重删,各自优缺点对于全闪的特性(磨损)重删设计方案的选择无重删时的I/O路径是什么样的数据存取位置的管理:元数据有重删时I/O路径是什么样的重删的原理:管理方式的变更:需要增加一个哈希值-物理地址的元数据表来管理由重删功能引发的逻辑地址-物理地址表项的变更: 一个逻辑地址现在可以对应多个物理地址插入流程,非重复数据...
2019-12-12 11:39:12
1557
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅