AWS EKS节点中dockerd高CPU占用问题排查咨询
排查AWS EKS节点dockerd高CPU占用的思路
结合你给出的节点信息和top输出,dockerd占了242.9%的CPU,节点负载也处于较高水平(load average 8+),既然内存和磁盘都正常,可以从这些方向入手排查:
可能的核心原因
- 容器频繁创建/销毁:如果节点上有Pod反复重启(比如健康检查失败、应用崩溃),dockerd会不断处理容器创建、销毁、镜像拉取/清理的循环操作,直接拉高CPU
- 容器日志爆炸:某个容器疯狂输出日志(比如误开debug级别日志、程序报错循环打日志),dockerd负责收集和写入这些日志,大量IO处理会消耗大量CPU
- Docker版本过旧:你使用的docker://18.6.1是2018年的老版本,存在不少已知的性能bug,比如特定场景下的内存泄漏、CPU占用异常飙升
- 存储驱动性能瓶颈:如果用了aufs这类老旧存储驱动,或者overlay2配置不当,dockerd在处理镜像层、容器文件系统时会额外消耗CPU
- CNI网络插件交互异常:Calico/Flannel等网络插件和dockerd的通信出现问题,比如频繁发送网络配置请求,也会导致dockerd CPU占用过高
具体排查步骤
先排查容器层面的异常
- 执行
docker stats实时查看所有容器的资源占用,重点关注有没有容器的NET I/O/BLOCK I/O异常高,或者状态频繁变化 - 用
kubectl get pods -o wide | grep <你的节点IP>检查节点上的Pod,看是否有高重启次数(RESTARTS列数值大),这类Pod会让dockerd反复执行容器生命周期操作
- 执行
分析dockerd自身日志
- 执行
journalctl -u docker -f实时查看dockerd日志,看是否频繁出现pulling image、creating container、removing container这类重复操作,或者存在镜像拉取失败、容器启动报错等信息
- 执行
检查容器日志输出情况
- 进入容器日志目录(通常是
/var/log/containers/),用ls -lh查看哪个日志文件增长最快,或者直接tail -f <日志文件名>,确认是否有容器在疯狂输出日志
- 进入容器日志目录(通常是
验证存储驱动配置
- 执行
docker info | grep Storage Driver,如果是aufs,建议换成overlay2(Amazon Linux 2默认支持overlay2,性能更优);如果已经是overlay2,检查磁盘挂载是否有异常
- 执行
查看Kubelet与dockerd的交互
- 执行
journalctl -u kubelet -f,观察Kubelet是否频繁向dockerd发送容器创建/销毁请求,比如因Pod调度频繁、健康检查失败导致的重复操作
- 执行
考虑升级Docker版本
- 18.6.1确实过于老旧,AWS EKS有对应K8s版本(1.12.7)的兼容Docker版本列表,你可以升级到19.03.x这类较新版本,很多老版本的性能问题已经被修复
深入分析dockerd线程
- 用
top -H -p 5028(你的dockerd PID是5028)查看dockerd的各个线程CPU占用,找到占用最高的线程,再结合strace -p <线程PID>分析该线程的具体操作(比如是否在频繁读写文件、网络通信)
- 用
临时缓解措施
如果暂时没法彻底排查,可以先驱逐节点上的Pod到其他节点:
kubectl drain <节点名> --ignore-daemonsets
然后重启dockerd:
systemctl restart docker
观察CPU是否能降下来,这也能验证是否是临时负载导致的问题
内容的提问来源于stack exchange,提问作者zangw
相关产品推荐
相关产品推荐

