NAS 测出 10MB/s 别急着换盘:一个同步落盘标志让它慢 7.3 倍
同一个 NAS、同一块网、同一个 512MB 文件,四种写句柄写法:强制同步落盘 10.6 MB/s、纯无缓冲 76.9、普通缓冲加末尾刷盘 62.5、本机盘对照 2048。A 与 B 只差一个 FILE_FLAG_WRITE_THROUGH,吞吐差 7.3 倍——你测到的是网络往返,不是带宽。同一个 NAS 回答「盘值不值得换」用 76.9,「下载要多久」用 62.5,混用就会白花钱或把工期算短。
NAS写入测速WRITE_THROUGHSMB刷盘O_DIRECT带宽口径存储模型下载排错这条适用于
- 有一台 Windows 主机与一个网络盘(SMB 映射)
- 能写 512MB 临时文件,且能控制句柄打开标志
- 同一文件、同一路径可重复跑(用于对照四种写法)
版本指纹
Windows FILE_FLAG_NO_BUFFERING / FILE_FLAG_WRITE_THROUGH;SMB 映射盘;对照需同盘同文件同大小
具体做法
【实测条件】同一台 Windows 主机、同一个 512MB 文件、同一个局域网 NAS(SMB 映射),只改写句柄的打开标志,四种写法各复跑。2026-11-04 00:20 采集。
【四写法】
A. FILE_FLAG_NO_BUFFERING + FILE_FLAG_WRITE_THROUGH:48.223 秒 → 10.6 MB/s
B. 只留 FILE_FLAG_NO_BUFFERING:6.66 秒 → 76.9 MB/s
C. 普通缓冲 + 末尾 FlushFileBuffers:8.194 秒(含 flush 1.568 秒)→ 62.5 MB/s
D. 本机盘同写法对照:0.25 秒 → 2048 MB/s
A 与 B 只差一个标志位,7.3 倍。
【为什么】WRITE_THROUGH 要求每一块都同步落盘确认。在本地盘上这只是多一次 flush;在网络盘上,它变成「每写一小段就做一次网络往返 + 一次刷盘」——你测到的是 RTT,不是带宽。D 那一行佐证了这一点:同样的写法打在本机盘上是 2048 MB/s,所以 10.6 不是编码问题,是往返次数。
【对判断的影响】大量网络盘评测、论坛结论、甚至一些工具的默认输出,跑的就是 A 那种口径。于是你看到「NAS 只有 10MB/s」,得出「NAS 不能当存储盘」,然后去买更贵的盘、换 2.5G 交换机、或者干脆放弃 —— 而真实带宽一直在 76.9。
反过来的坑更贵:用 B 那种乐观口径测出 76.9,觉得「放模型没问题」,结果真实下载器落盘带着刷盘语义,实际只有 62.5 到 10.6 之间。按 76.9 算的 800GB 落盘是 2.9 小时,按 62.5 算是 3.6 小时 —— 差了 25%。
【判读三档】
10 MB/s 上下 → 八成是强制同步落盘。别急着换盘,去掉那个标志再测一次。
60-80 MB/s → 千兆网 + SMB 的正常水平,瓶颈多半在网络不在盘。
200 MB/s 以上 → 起码是 2.5G 网,这时才轮得到讨论盘本身的性能。
【结论】同一个 NAS 两个问题要用两个数:「这块盘值不值得换」看 76.9,「下载模型要多久」看 62.5。混用就是白花钱或把工期算短。
只在 Windows + SMB 口径下测过。Linux 上 NFS 的刷盘语义不同,O_DIRECT 与 fsync 的组合又是另一套,这套数字不能直接搬。没测并发——单线程单队列的 76.9 既不代表多线程能线性放大,也不代表会掉。NAS 硬件规格未知,所以只能说「这个标志位值 7.3 倍」,不能说「这台 NAS 的真实带宽是 76.9」。「大量评测跑的是 A 口径」是经验判断,未做样本统计。