ZooKeeper 的写延迟主要是什么?答案是 fsync。这篇用三个实验验证:去掉 fsync 会怎样、fsync 慢时日志长什么样、并发时多个事务怎么共用一次 fsync。
默认(forceSync=yes) 同步写 p50 3.02 ms | 异步写 9422 次/秒 | fsync 平均 1.6717 ms / 最大 17 ms | 平均批大小 15.3336 | fsync 警告 0 条 -Dzookeeper.forceSync=no 同步写 p50 0.27 ms | 异步写 8074 次/秒 | fsync 平均 0.0 ms / 最大 0 ms | 平均批大小 1.0121 | fsync 警告 0 条
forceSync=no 只用来说明 fsync 占了多少,不建议在生产环境使用。
-Dzookeeper.fsync.warningthresholdms=1 同步写 p50 3.00 ms | 异步写 8566 次/秒 | fsync 平均 1.4684 ms / 最大 15 ms | 平均批大小 15.2651 | fsync 警告 726 条 警告原文示例: fsync-ing the write ahead log in SyncThread:0 took 5ms which will adversely effect operation latency.File size is 671088
300 次串行同步写之后:avg_sync_processor_batch_size = 1.0 , cnt_fsynctime = 301 再异步写 20000 次之后:avg_sync_processor_batch_size = 15.0937 , cnt_fsynctime = 1345 (20000 个事务只多出 1044 次 fsync)