在 CentOS 上优化 ZooKeeper 性能,通常需要从系统层面、JVM 层面、ZooKeeper 配置层面以及运维架构层面综合考虑。下面给你一套比较实用的优化思路。
ZooKeeper 对 磁盘写入延迟 非常敏感。
dataDir)和事务日志目录(dataLogDir)一定要分开mkfs.xfs /dev/sdX
mount -o noatime,nodiratime /dev/sdX /data
Swap 会导致 ZooKeeper 出现长时间 GC 停顿。
# 临时
sysctl vm.swappiness=0
# 永久
echo "vm.swappiness=0" >> /etc/sysctl.conf
ZooKeeper 连接数较多时需要大 fd。
# /etc/security/limits.conf
zookeeper soft nofile 65536
zookeeper hard nofile 65536
# /etc/sysctl.conf
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 4096
-Xms4g -Xmx4g
或 2~8G,视节点规模而定推荐 G1GC(ZK 3.5+ 更友好):
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled
示例:
export JVMFLAGS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
tickTime=2000
initLimit=10
syncLimit=5
如果网络稳定,可适当减小
tickTime(如 1000)
maxClientCnxns=60
避免磁盘爆满:
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
# 如果不需要四字命令监控可以限制
4lw.commands.whitelist=stat,ruok,conf,isro
peerType=observer
echo stat | nc localhost 2181
echo mntr | nc localhost 2181
重点看:
zk_avg_latencyzk_max_latencyzk_outstanding_requests/var/log/zookeeper/zookeeper.log
常见问题:
Fsync 慢 → 磁盘问题tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
如果你愿意,可以告诉我:
我可以给你一套针对你业务的精准优化方案。