docker stats 命令输出中的 "MEM USAGE / LIMIT " 列状态是什么?

what does "MEM USAGE / LIMIT " column state in docker stats command output?

我从图像创建了一个 docker 容器,大小为:~90 MB

容器 运行 没问题。 我想知道容器必须在其主机上使用多少 RAM。所以我 运行 "docker stats" 命令,它显示以下输出:

CONTAINER ID        NAME                   CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
66c266363746        sbrconfigurator_v0_2   0.00%               32.29MiB / 740.2MiB   4.36%               0B / 0B             15.1MB / 4.1kB      10

此处显示内存使用情况如下:

MEM USAGE / LIMIT
32.29MiB / 740.2MiB

我不知道这 740.2 MB 内存是什么意思,是否意味着 740.2 MB 内存已分配给此容器,即此容器是否正在使用 740.2 MB 内存.

请帮助我了解此容器必须使用多少 RAM(主机的机器)。 主机是 Linux, Ubuntu.

内存限制显示在 OOM 终止容器之前允许容器使用的内存量 docker。如果你没有在容器上设置内存限制,它默认为 docker 主机上的所有可用内存。对于 Win/Mac,Docker,这是分配给嵌入式 VM 的内存,您可以在设置中对其进行调整。你可以在 compose 文件中设置内存限制,或者直接在 docker run cli:

$ docker run -itd --name test-mem -m 1g busybox /bin/sh
f2f9f041a76c0b74e4c6ae51dd57070258a06c1f3ee884d07fef5a103f0925d4

$ docker stats --no-stream test-mem
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O BLOCK I/O           PIDS
f2f9f041a76c        test-mem            0.00%               360KiB / 1GiB       0.03%               5.39kB / 0B 3.29MB / 0B         1

在上面的例子中,busybox 没有使用 1GB 的内存,只有 360KB。

在不设置限制的情况下,可以转换 GiB 中的内存限制 (GiB*1024 = KB),以显示与您在 free 命令中看到的主机总内存非常接近的内容。不确定两者之间的微小差异是否会导致内核或其他开销。

90MB的图像大小只是磁盘上的大小,与占用的内存(RAM)没有太大关系。

当您在 Linux 上启动 Docker 容器时,例如:

$ docker run -itd --name test busybox /bin/sh
74a1cb1ecf7ad902c5ddb842d055b4c2e4a11b3b84efd1e600eb47aefb563cb3

Docker会在cgroups fs中创建一个目录,一般挂载在/sys/fs/cgroup容器的long ID下。

/sys/fs/cgroup/memory/docker/74a1cb1ecf7ad902c5ddb842d055b4c2e4a11b3b84efd1e600eb47aefb563cb3/

为了缩短路径我会这样写

/sys/fs/cgroup/memory/docker/$(docker inspect -f "{{.Id}}" test)  

相反。该目录包含内核的纯文本文件数 read/written。

当您 运行 Docker 容器没有 -m / --memory 标志时,容器将能够分配您系统上的所有可用内存,这将等于:

$ numfmt --to=iec $(cat /sys/fs/cgroup/memory/docker/memory.max_usage_in_bytes)

当您指定内存限制时,例如-m 1g

$ docker run -itd --name test -m 1g busybox /bin/sh

Docker 将限制写入文件 memory.limit_in_bytes:

$ numfmt --to=iec $(cat /sys/fs/cgroup/memory/docker/$(docker inspect -f "{{.Id}}" test)/memory.limit_in_bytes)
1.0G

这告诉 Linux 内核对容器实施硬内存限制。如果容器试图分配超过限制的内存,内核将调用臭名昭著的 OOM 杀手。

“MEM USAGE”可能是从 memory.usage_in_bytes 中读取的,它是实际内存使用的近似值。

$ numfmt --to=iec $(cat /sys/fs/cgroup/memory/docker/$(docker inspect -f "{{.Id}}" test)/memory.usage_in_bytes)
312K

根据cgroups documentation,可以从memory.stat文件中获得更精确的值。

If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) value in memory.stat(see 5.2).

您必须在其中对这 3 行求和。通常 memory.usage_in_bytes 是足够好的估计。