解决容器僵尸进程

在服务器上发现有大量的僵尸进程,通过进程号等信息发现是rancher中的rancher-agent容器中存在大量僵尸进程。


首先,进程号是一种资源,在宿主机中是有限的。存在大量僵尸进程的情况就可能会导致整个宿主机的进程号资源被全部占用,导致无法启动新的进程。


查看该容器的pids.max,发现其pid cgroups并没有限制,值为max。也就是该容器到最后会将进程号占用完,导致宿主机出现问题。


可以通过修改pids.max的方式,通过cgroup对其限制。但是显然这种情况是治标不治本的。那么,我们就需要知道该容器的僵尸进程是如何产生的。


僵尸进程一定需要父进程调用 wait() 或者 waitpid() 系统调用来清理,这也是容器中init 进程必须具备的一个功能。僵尸进程产生的原因可以简单理解为,父进程创建完子进程就不管了,没有执行上述的两种系统调用。


那么问题的源头就在于这些僵尸进程的父进程。而在本次案例中就是rancher-agent容器的init进程。该进程没有正确的管理其fork出的子进程,所以就出了问题。

既然已经清楚原因,那就好处理了。我们知道既然是父进程不负责,那我们就找一个负责的父进程。

Docker就对这方面提供了支持。用docker启动容器的时候加--init参数,容器就强制使用tini作为init进程了。tini的主进程里,就是不断在调用带WNOHANG 参数的 waitpid(),通过这个方式清理容器中所有的僵尸进程。

而在我发现这个问题的时间是2021年8月2号。此时搜索相关信息,发现github上有人在之前已经提交了issue,并且在2021年4月已经修改了代码,使用tini作为init进程。服务器升级了2021年4月后的rancher-agent镜像版本,问题解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值