bigywater.tech
ZooKeeper · 56

磁盘类型与提交延迟

ZooKeeper 的写延迟取决于事务日志所在磁盘的 fsync 速度。我只有一块 SSD,没法比较 SSD、机械盘、云盘,但可以弄清楚「fsync 到底占了写延迟的多少」,以及一个 macOS 上的坑:有的 fsync 并没有真正落盘。

0.020 vs 2.96 ms
macOS 上普通 fsync 与 F_FULLFSYNC 的中位耗时
3.01 → 0.32 ms
ZooKeeper 同步写 p50:有 fsync → 无 fsync
≈ fsync + 0.3 ms
这块盘上同步写延迟的经验公式

裸刷盘延迟

实测 · 本机执行输出
  APFS(本机系统盘的临时目录)                                               os.fsync 中位 0.020 ms(p99 0.045)| F_FULLFSYNC 中位 2.963 ms(p99 3.060)
  HFS+ 磁盘映像(/Volumes/ZKMED,同一块物理盘上的另一个文件系统)                      os.fsync 中位 0.084 ms(p99 0.197)| F_FULLFSYNC 中位 2.999 ms(p99 4.016)

ZooKeeper 的事务日志放在不同位置

实测 · 本机执行输出
  APFS(本机系统盘的临时目录)                                               同步写 p50 3.01 ms  fsync 平均 2.1277 ms
  HFS+ 磁盘映像(/Volumes/ZKMED,同一块物理盘上的另一个文件系统)                      同步写 p50 3.98 ms  fsync 平均 2.9002 ms

两个位置虽然是不同的文件系统,但物理上是同一块盘,所以差别很小(+1 ms 左右可能是 HFS+ 映像多了一层)。这不是「SSD 与机械盘的比较」。

fsync 是下限

实测 · 本机执行输出
  forceSync=no:同步写 p50 0.32 ms(几乎不含落盘时间)

  没有验证:机械硬盘、网络磁盘、云盘、带电池缓存的 RAID 卡——本机只有一块 SSD;上面只能说明「同步写延迟 ≈ fsync 延迟 + 其它开销(约 0.3 ms)」。

没有验证的部分

机械硬盘、网络磁盘、云盘、带电池缓存的 RAID 卡;Linux 上的 ext4 / xfs(本机是 macOS)。这些场景的 fsync 延迟差别很大,是 ZooKeeper 运维里最重要的变量之一——部署前应当用 fio 之类的工具测目标盘的 fsync 延迟。

分步演示

磁盘与写延迟
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。两个位置:本机 APFS 临时目录、256 MiB 的 HFS+ 磁盘映像(同一块物理盘);裸刷盘每种 500 次
    • 没有验证:机械盘 / 网络盘 / 云盘、Linux 文件系统、RAID 缓存、事务日志与快照放同一块盘还是分开的实测差别
    京ICP备2026067502号-1京公网安备11010502063487号