在 Linux 上部署和调优 ZooKeeper(ZK)性能,通常从 系统层面、JVM 层面、ZK 配置层面、运维与架构层面 四个方面入手。下面给你一套比较实用的调优思路。
ZK 对延迟非常敏感,swap 会导致 STW 和抖动。
# 临时关闭
swapoff -a
# 永久关闭(注释 /etc/fstab 中 swap 行)
ZK 连接数多时会受限于 fd。
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
确认:
ulimit -n
mount -o noatime,nodiratime /dev/sdb /data/zk
# 减少 time_wait
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 提高网络吞吐
net.core.somaxconn = 4096
不要太大,避免 GC 停顿
# zookeeper-env.sh
export JVMFLAGS="-Xms4g -Xmx4g"
经验值:
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Xloggc:/data/zk/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
dataDir=/data/zk/data
dataLogDir=/data/zk/log
事务日志必须单独磁盘
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=200
防止单客户端打爆 ZK
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
避免磁盘被快照占满
zookeeper.forceSync=no
⚠️ 会牺牲一定一致性,仅适合可容忍丢失场景
peerType=observer
重点看:
工具:
mntr 命令echo mntr | nc localhost 2181
| 问题 | 原因 | 解决 |
|---|---|---|
| 延迟高 | GC / 磁盘 IO | G1 + SSD |
| Leader 频繁切换 | 网络抖动 | syncLimit 调大 |
| 连接数爆 | 客户端泄漏 | maxClientCnxns |
| 磁盘满 | 快照未清理 | autopurge |
如果你愿意,可以告诉我:
我可以给你一套 针对性配置模板。