ZooKeeper 的写延迟取决于事务日志所在磁盘的 fsync 速度。我只有一块 SSD,没法比较 SSD、机械盘、云盘,但可以弄清楚「fsync 到底占了写延迟的多少」,以及一个 macOS 上的坑:有的 fsync 并没有真正落盘。
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)
APFS(本机系统盘的临时目录) 同步写 p50 3.01 ms fsync 平均 2.1277 ms HFS+ 磁盘映像(/Volumes/ZKMED,同一块物理盘上的另一个文件系统) 同步写 p50 3.98 ms fsync 平均 2.9002 ms
两个位置虽然是不同的文件系统,但物理上是同一块盘,所以差别很小(+1 ms 左右可能是 HFS+ 映像多了一层)。这不是「SSD 与机械盘的比较」。
forceSync=no:同步写 p50 0.32 ms(几乎不含落盘时间) 没有验证:机械硬盘、网络磁盘、云盘、带电池缓存的 RAID 卡——本机只有一块 SSD;上面只能说明「同步写延迟 ≈ fsync 延迟 + 其它开销(约 0.3 ms)」。
机械硬盘、网络磁盘、云盘、带电池缓存的 RAID 卡;Linux 上的 ext4 / xfs(本机是 macOS)。这些场景的 fsync 延迟差别很大,是 ZooKeeper 运维里最重要的变量之一——部署前应当用 fio 之类的工具测目标盘的 fsync 延迟。