开发同学反馈某一个开发环境的机器卡的要命,我登录一看,内存已经被耗的差不多,但是一看top又看不出来哪个进程占用了很多的内存,如图:
换ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -nrk5
看也没看出来个之乎者也。
发现这个服务器里有两个容器,但是很奇怪,用docker stats却无法获得他们的基础值:
明明容器都是up状态啊,于是我就尝试链接到其中一台,发现报错:rpc error: code = 14 desc = grpc: the connection is unavailable
,而且不能restart和kill,如图:
使用docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --debug
,发现里面是这样:
后来在https://github.com/moby/moby/issues/30984 这个文章下面找到了一个跟我情况差不多的哥们,也是docker stats
命令失效。解决方法是重启docker进程:systemctl restart docker.service
,果然,重启之后在手动启动上面两个容器,容器就可以正常访问了:
服务器的内存情况也得到了一定的缓解:
后来跟开发复盘,原来是这个机器上一次死机了,没法关闭容器,只能直接在阿里云控制台重启,而正常的流程应该是先关闭容器再重启的。