在 Linux 环境下,ZooKeeper 超时(session timeout / connection timeout)是非常常见的问题,通常不是单一原因造成的。下面按最常见到最不常见的顺序,系统梳理原因和排查思路。
ZooKeeper 对网络非常敏感。
典型表现
Connection loss
Session expired
Client session timed out, have not heard from server
常见网络原因
✅ 排查
ping zk_host
telnet zk_host 2181
tcpdump -i eth0 port 2181
ZooKeeper 是 单线程处理请求 的。
原因
现象
✅ 排查
jstat -gcutil <pid> 1000
看:
✅ 建议
-Xms2g -Xmx2g
-XX:+UseG1GC
客户端设置过短
常见错误:
new ZooKeeper(connectString, 2000, watcher); // 2秒太短
Linux 网络抖动 + GC = 必超时
✅ 推荐
sessionTimeout = 10s ~ 30sminSessionTimeout=4000
maxSessionTimeout=40000
ZooKeeper 强依赖磁盘
原因
现象
✅ 排查
iostat -x 1
dmesg | grep error
✅ 建议
dataDir 和 dataLogDir 分开原因
日志特征
LOOKING
ELECTION
✅ 检查
echo stat | nc localhost 2181
现象
✅ 排查
echo cons | nc localhost 2181
Too many open files
✅ 解决
ulimit -n 65535
并修改 /etc/security/limits.conf
ZooKeeper 对时间敏感
✅ 检查
date
ntpq -p
✅ 建议
✅ 网络通不通
✅ sessionTimeout 是否≥10s
✅ GC 是否过长
✅ 磁盘 IO 是否高
✅ leader 是否稳定
✅ 文件描述符够不够
你可以直接贴:
我可以精准定位是哪一种超时。