我在 Linux 上的 Docker 容器中运行一个进程,其内存限制为 2GByte。(该容器以 启动docker run --memory=2g
。)
这是top
运行一段时间后的结果。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9016 root 20 0 7342132 4.652g 4.224g S 100.0 7.4 18828:28 blah
以下是 的输出docker stats
:
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
d7032e5928b6 100.02% 2.076 GB/2.147 GB 96.68% 345 MB/199.1 MB
然后,重新启动后top
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5653 root 20 0 2787800 1.328g 1.030g S 100.0 2.1 0:37.57 blah
docker stats
:
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
10cefdce241f 99.97% 320.4 MB/2.147 GB 14.92% 36.34 kB/22.48 kB
RES
因此,这与-非常粗略地匹配SHR
,这对我来说有些道理 - 但是对于长期运行的容器的输出的等效计算并不以相同的方式匹配。
top
Docker 在这里到底在计算什么?我能以某种方式将其与 或其他工具的输出进行匹配吗 ?
答案1
docker stats 还包括文件缓存内存。它将根据请求释放,但会被视为已使用。
答案2
Docker 统计数据报告容器 cgroup 中的内存和 CPU 使用情况。这将与一些顶级统计数据相关联,但并不完全相同,因为进程中的内存包括共享内存、映射到文件系统对象的内存等。cgroup 将汇总该容器内所有进程的使用情况。要查看容器内的 cgroup 使用情况,您可以查看以下文件/sys/fs/cgroup/memory/
:
$ docker run -it --rm --name memtest -m 2g busybox /bin/sh
/ # cat /sys/fs/cgroup/memory/memory.usage_in_bytes
1519616
/ # cat /sys/fs/cgroup/memory/memory.limit_in_bytes
2147483648