前些日子有几台机器的资源不够用了,fork新进程和创建新线程都失败了,报Resource temporary unavailable,于是查了下机器的所有进程的线程数(ps H),看到有几个进程的线程数达到了1w个以上,把机器的资源耗尽了。但是由于这些进程都是跑在docker容器中,所以无法把已知的Pid和容器号进行对应,于是查询了一些资料后,总结了下经验。
我们已知某个进程的Pid,则我们可以通过
docker inspect -f '{{.State.Pid}} {{.Id}}' $(docker ps -q) | grep <Pid>
来查找对应的容器号。
inspect命令应该大家都比较熟悉,输出一些容器信息的,通过format flag可以指定输出的格式,指定输出的内容。于是我们可以通过容器信息里的State.Pid
获取真实的Pid,然后同时获得容器Id然后做一次过滤,这样就能知道容器的Id了。
当然这是理想的情况,实际上我们在写docker file的时候,往往我们的实际进程是由父进程创建出来的,那么我们通过上述的命令,只能获取父进程的容器号,子进程号是无法查询到对应的容器的。遇到这种情况,我们必须查看进程的信息:
cat /proc/<pid>/stat
来查询父进程信息,第四列就是父进程ID。不过由于跑在docker容器里的进程都是docker的子进程,所以假设某个进程的父进程是docker-runc,那么该进程就可以查询出容器号了。
有了这个信息,那么通过最上面的执行就可以查询到我们的容器号了。