如何从cgroup路径手动获取Docker容器的CPU、内存相关统计指标
Docker 从 cgroup 路径获取容器资源指标的实现逻辑
以下内容均基于 cgroup v1 环境说明,你提到的/sys/fs/cgroup/cpu/docker/<容器ID>、/sys/fs/cgroup/memory/docker/<容器ID>是 cgroup v1 下 Docker 默认的容器 CPU、内存控制器挂载路径,所有指标均通过读取对应路径下的内核伪文件直接获取或计算得到:
CPU 类指标
['cpu_stats']['cpu_usage']['total_usage']/['precpu_stats']['cpu_usage']['total_usage']
读取CPU cgroup路径下的cpuacct.usage文件得到,该文件返回容器所有CPU核累计消耗的CPU时间,单位为纳秒。前者是当前采集时刻读取的实时值,后者是上一次采集任务执行时读取的历史值,二者的差值即为两次采集间隔内容器消耗的CPU总时间。['cpu_stats']['system_cpu_usage']/['precpu_stats']['system_cpu_usage']
读取全局/proc/stat文件中首行cpu对应的所有字段求和,转换为纳秒后得到整个系统所有CPU核累计的总运行时间。同样前者为当前采集值、后者为上一次采集的历史值,二者差值为两次采集间隔内系统的总CPU时间,和上述容器CPU时间差值配合即可计算出容器的CPU使用率。
内存类指标
['memory_stats']['usage']
读取内存cgroup路径下的memory.usage_in_bytes文件得到,单位为字节,统计当前容器进程组总共占用的内存大小,包含匿名页、页缓存、内核栈等所有内存类型的占用。['memory_stats']['stats']['cache']
读取内存cgroup路径下的memory.stat文件,匹配到cache字段对应的数值即为该指标结果,单位为字节,统计的是容器占用的页缓存内存大小。['memory_stats']['limit']
读取内存cgroup路径下的memory.limit_in_bytes文件得到,单位为字节,是给该容器配置的内存使用上限;如果启动容器时没有设置内存限制,该值会接近宿主机的总物理内存大小。
内容的提问来源于stack exchange,提问作者Umar Draz
相关产品推荐
相关产品推荐

