Zookeeper与Marathon Docker容器CPU占用100%问题求助
排查Docker环境下Marathon/ZooKeeper闲置时CPU占满问题
看起来你遇到了Docker部署Marathon和ZooKeeper后闲置时CPU拉满的棘手问题,结合你的环境配置和现象,我整理了几个针对性的排查与解决方向:
先明确是哪个容器的进程在“搞事情”
因为ZooKeeper和Marathon都是Java编写的,先锁定问题来源:
- 用
docker top <容器ID>分别查看两个容器的进程列表,对比你top里的PID 7055,找到对应的容器 - 或者直接运行
docker stats实时监控两个容器的CPU使用率,看哪个容器的数值先飙升到100%
针对Marathon v1.1.0的旧版本问题排查
Marathon v1.1.0是2017年的老版本,存在不少已知的性能bug:
- ZooKeeper会话重连循环:如果Marathon的ZK连接参数配置不合理(比如超时时间过短),会导致它不断尝试重连ZK,触发CPU飙升。可以检查Marathon配置中的
zk-session-timeout、zk-connection-timeout,尝试调大到10000ms左右 - 线程泄漏bug:这个版本存在后台线程泄漏的问题,闲置时线程持续运行占用CPU。最直接的解决方式是升级Marathon到较新的稳定版(比如v1.8.x或更高),新版本修复了大量这类性能问题
排查新版ZooKeeper的兼容性问题
你用了最新版ZooKeeper,和老版本Marathon可能存在适配问题:
- ZooKeeper 3.5+引入了新特性,老版本Marathon的ZK客户端可能无法正确适配,导致频繁通信错误和重试。可以尝试降级ZK到3.4.x版本(比如3.4.14),这个版本和Marathon v1.1.0的兼容性更好
- 查看ZK日志:
docker logs <zookeeper容器ID>,如果里面有频繁的连接错误、会话超时日志,大概率是触发Marathon重试的根源
Docker环境层面的调整
- 升级Docker版本:你用的docker-ce 18.03.0和docker-compose 1.21.0都是比较老的版本,和Ubuntu 17.10可能存在兼容性问题。建议升级到docker-ce 20.10.x这类稳定新版本,同时同步升级docker-compose到对应兼容版本
- 临时限制容器CPU:如果暂时没时间解决根源问题,可以先在
docker-compose.yml里给容器加CPU配额,避免影响主机:services: marathon: # 其他配置... deploy: resources: limits: cpus: '0.5' zookeeper: # 其他配置... deploy: resources: limits: cpus: '0.5'
深入分析Java进程堆栈
如果上面的方法都没解决,可以进一步深挖Java进程的运行情况:
- 进入问题容器:
docker exec -it <容器ID> bash(如果容器里没有JDK,需要先安装) - 用
jstack <PID>导出线程堆栈,查看哪个线程占用了大量CPU - 用
jstat -gcutil <PID> 1000监控GC情况,如果YGC(年轻代GC)或FGC(老年代GC)频繁,说明内存配置不合理,可以调整JVM参数(比如启动命令加-Xmx512m -Xms512m)
内容的提问来源于stack exchange,提问作者harpratap
相关产品推荐
相关产品推荐

