我在 AWS 中的一堆主机上运行 Docker,作为 ECS 集群的一部分,在过去几周内,Docker 守护进程开始间歇性崩溃。我没有在系统级别(内核、操作系统、Docker 等)进行任何更改,总体工作负载是相同的。
系统将正常运行数天,对 CPU、内存或 IO 没有任何明显压力。在某些时候,dockerd-default
进程崩溃并且负载飙升至> 100,因为(我相信)进程被阻塞。我无法从中恢复,我唯一的选择是终止该实例。
在守护进程崩溃时,
dmesg
表明内核无法调度该进程:
Apr 11 13:46:06 ip-172-31-84-92 kernel: [1356823.587223] INFO: task dockerd-default:1548 blocked for more than 120 seconds.
ps
显示进程处于以下Dsl
状态:
1055 ? Dsl 5684:45 /usr/bin/dockerd-default --bip=10.192.0.1/16 --fixed-cidr=10.192.0.0/16 --group=docker --pidfile=/var/run/docke.pid --storage-driver=overlay --raw-logs
我已经lsof
对这个过程进行了测试,试图找出什么文件句柄可以阻止所有内容,但没有什么是显而易见的。此外,没有太多磁盘 IO,所以我认为从这个角度来看我不会受到限制。
所以,这是我的问题:
- 有人遇到过类似的事情吗?
- 有什么方法可以在不终止实例的情况下恢复?
- 对于调试的后续步骤有什么建议吗?
作为参考,以下是各个组件的版本:
Ubuntu:14.04.5 LTS
内核:4.14.12-041412-generic
Docker:18.06.1-ce