作者回复: 谢谢 @莫名! 很好的解释!
作者回复: > 问题一 在kuberenetes下,kubelet还是调用 containerd/runc去启动容器的,每个容器的父进程是containerd-shim, 最终shim可以回收僵尸进程。 > 问题二 docker倒是也做了这件事。 用docker启动容器的时候 加--init参数,起来的容器就强制使用tini作为init进程了。 > 问题三 Linux进程要响应SIGKILL并且执行signal handler,只有在被进程调度到的时候才可以做。对于zombie进程,它已经是不可被调度的进程了。
作者回复: @上邪忘川, 谢谢你的总结
作者回复: 对的
作者回复: @Helios, 对于容器或者说pod, 我们加了pids cgroup的限制,pids.max 对于每个容器一般就是以千为单位了,这个值还是很容易达到上限的。 我们在线上看到的大量Z进程,实际的情况要复杂一些,一个进程有多个线程,主进程处于Z状态,而还有一个线程处于D状态,但是从表象查看进程状态的时候,看到都是<defunct>进程了(Z)。由于有了D的线程在里面,这时候waitpid(), 任何信号对这些进程都无效了。 这一讲,我是把Z进程的概念单独说了一下,对于D进程,它会引起其他的一些现象,我会在后面讲到。
作者回复: docker 自己没有自动清理的功能。如果是kubernetes/kubelet是会做清理。
作者回复: 我觉得刚才 @上邪忘川的回复挺好的 3.清理僵尸进程的两个思路 (1)kill掉僵尸进程的父进程,此时僵尸进程会归附到init(1)进程下,而init进程一般都有正常的wait()或watipid()回收机制。 (2)利用dumb-init/tini之类的小型init服务来解决僵尸进程
作者回复: kata是基于VM的,它里面的僵尸进程不会影响到宿主机。
作者回复: 对容器设置pids Cgroup限制,一般需要容器云平台来做,在启动容器的时候就自动的设置好,类似cpu/memory Cgroup的设置。 像Kubernetes的类似这么做, https://github.com/kubernetes/kubernetes/commit/ecd6361ff0e8421332a50e55fcba17b823d5d338
作者回复: ulimit对于shell session中的总进程数量做限制,pids cgroup对于控制块中的cgroup.procs/tasks 中的进程数目做限制。都会起效,看哪个先达到限制值。