获取 Docker container 中的资源使用情况
Docker 是一种对程序环境进行封装并实现资源的隔离技术,可秒级启动,可瞬间启动千千万万个实例,这些优点让它在出现之初就受到极大的关注,其火爆程度就如今天的深度学习一般。人们拿到了锤子就到处找钉子,什么都想套上 Docker,连生产数据库都想用 Docker 来运行,少不了碰到很多钉子,磕磕碰碰才形成今天这个比较合理的各个使用场景。
在一个完善的系统中,我们总需要知道自己的服务使用了多少CPU,内存资源,想知道磁盘读写多少,网络流量如何。如果在 Docker 容器中执行 top,free 等命令会发现我们能看到CPU所有核的使用情况以及宿主机的内存占用,这并不是我们需要的,我们需要的是这个容器被限制了多少 CPU,内存,当前容器内的进程使用了多少。
要明白为何 top,free 显示的是宿主机的情况,以及如何获得容器的资源限制需要先理解 Docker 的两项基础技术:Namespace 和 cgroup。两者在 CoolShell 的博客里都已经讲解得非常清楚,这里只简单说明一下。Namespace 解决了环境隔离的问题,它将进程的PID,Network,IPC等和其它进程隔离开来,结合 chroot,让进程仿佛运行在一个独占的操作系统中。cgroup 则对进程能够使用的资源作限制,如在一台48核256G的机器上只让容器使用2核2G。
容器中CPU,内存,磁盘资源都是被 cgroup 限制和统计的,所有信息都放在
/sys/fs/cgroup
这个虚拟文件夹里,在容器里运行
mount
命令可以看到这些挂载记录
...
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)