权重落盘慢 35 倍不是盘坏了,是分片太碎:每文件固定开销 3.7 毫秒

性能 · 约 5 个命令 / 3 分钟自查L0整理于 2026-11-03 有效期 180d

同一块 NVMe、同一总量 1200MB,只改文件切法:1200 个 1MB 小文件 4.45 秒,3 个 400MB 大文件 0.12 秒,差 35-37 倍。中间两档单调递增(1049 / 3102 MB/s),是台阶不是抖动。每文件固定开销在 1MB 档约 3.7 ms、400MB 档约 0.04 ms,与数据量无关。换到 800GB 权重的场景,这笔固定开销就是 49.4 分钟 vs 1.4 分钟,差 48 分钟纯等,还很容易被误诊成下载坏了或盘坏了。

权重分片safetensors写盘NVMe落盘模型下载磁盘O_DIRECTfsync部署

这条适用于

版本指纹

Linux ext4 根分区;单进程 os.O_DIRECT + fsync;O_DIRECT 需 4K 对齐缓冲区

具体做法

【实测条件】单进程 Python,os.O_DIRECT 打开 + 每文件 fsync,同一块 NVMe(ext4 根分区),同一总量 1200MB,只改文件数与单文件大小,每档重复 2 次。2026-11-03 采集。

【四档阶梯】
1200 个 × 1MB:4.450 / 4.448 秒 → 269.7 / 269.8 MB/s
300 个 × 4MB:1.144 / 1.184 秒 → 1049.3 / 1013.7 MB/s
75 个 × 16MB:0.387 / 0.394 秒 → 3102.5 / 3049.0 MB/s
3 个 × 400MB:0.125 / 0.120 秒 → 9577.0 / 9984.3 MB/s

两端差 35-37 倍,两次重复读数几乎一样,中间两档单调递增 —— 这是台阶,不是抖动。

【两档之间的换算】1MB→16MB 速率涨 11.5 倍(269.7→3102.5 MB/s),16MB→400MB 再涨 3.1 倍(3102.5→9577.0)。文件放大 400 倍、速率只涨 35 倍,所以台阶是「两级陡、中间平」的形态,不是线性。

【每文件固定开销】1MB 档每文件摊约 3.7 ms,400MB 档只摊约 0.04 ms,相差两个数量级。这 3.7 ms 与数据量无关,是元数据、块分配、同步的固定成本。

【已排除的两种解释】
① dd 进程 fork 开销:换成单进程 Python 循环不 fork,结果一样(4.448 秒 vs 0.120 秒),排除。
② 页缓存:全程 O_DIRECT + 每文件 fsync,绕过了页缓存,排除。

【换成权重的账】800GB 权重(LongCat-2.5 按 W4A4 推算的体积):
按 269.7 MB/s 落盘 → 49.4 分钟
按 9577 MB/s 落盘 → 1.4 分钟
差 48 分钟。这 48 分钟是纯等,叠加在下载时间之外;而且很容易误诊 —— 你会先怀疑下载坏了、校验没过、盘坏了,实际只是文件切得碎,盘在等你把上千个 inode 一个个建出来。

【参考仓库形态】GLM-5.2 的发布形态是 295 个文件、合计 1506.69 GB,平均单文件约 5GB,落在阶梯右侧,不吃亏。但不是每个仓库都这样:很多模型按 2GB 或 4GB 切分片,再加 tokenizer 与 config 的一堆小文件,一个 800GB 的模型按 1GB 一片就是 800 个文件。

【对照基准】⚠️ 400MB 档跑出 9577-9984 MB/s(约 9.5-10.0 GB/s),高于这块盘同机 4GB 单文件 sustained 写的 6.5-6.8 GB/s(约 9,600 MB/s 那一档要打折)。判断是 1200MB 总量太小、写进了盘上 SLC 缓存或 DRAM,没跑到掉速段 —— 所以「大文件 9.5 GB/s」这个绝对值要打折,但「小文件慢 35 倍」的比值稳(两场景总量与缓存条件相同,差异只来自切法)。

【对照基准】同机 4GB 单文件(各 3 次):direct 写 6.5-6.8 GB/s、读 9.6-9.9 GB/s(各 3 次)。第二台同条件写 3.7-4.7、读 8.6 GB/s,两台同型号读速差 15%,属硬件个体差异。

失效边界
只测了一台机器(ext4 根分区),未在多台复跑四档。只测写不测读 —— 读侧测速时接口用错(返回 0 字节),数据作废,所以读侧是否有同样的台阶未验证。9577 MB/s 这个绝对值高于同机 4GB 单文件写的 6.8 GB/s,判断是 1200MB 总量偏小、写进盘上缓存区未跑到掉速段,绝对值需打折看;但「小文件慢 35 倍」的比值是稳的(两场景总量与缓存条件相同)。
← 看到「KV 省 75%」别急着信:去 config 数层数,30 秒能验算完Arete-27B 装得下吗:混合注意力省 75% KV,但省不动权重 →

← 返回全部排错方案