在Docker的使用过程中,特别是生产环境下,一定会遇到某个(些)容器的进程占用主机CPU资源过高的问题。那么,如何知道是哪个容器的哪个进程导致CPU利用率过高哪?
首先,熟悉Docker的朋友应该知道:Docker中的进程是通过命名空间(namespace)进行隔离的,也就是意味着,Docker中的进程对于主机来说是可见的,只是通过命名空间(namespace)将彼此隔离起来了,这样就节约了大量的主机资源(如果是虚拟机还得先在内存里分配好操作系统才能再分配进程。相关的瓜如果大家不熟(悉)请大家自行网补)。
所以,容器里的进程在主机上就是个普通的进程,有进程的各类属性(进程ID、进程名称等)。那么如何知道主机上的某个进程在哪个容器里哪?
第一步,找到CPU利用率高的进程及进程ID。
运行top命令,找到进程ID:
第二步:运行如下命令找到进程所在容器的进程ID
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i &&echo ID=$i; done |grep -A 10 <容器的进程在主机上的进程ID>
第三步:运行如下命令查看容器的名称:
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "容器对应的主机进程ID"
从上图中可以看到,进程oracle在容器“oracle11gxe”中,可进入该容器中进行相关处置。