3

我有一个 Docker 容器,它在本地运行时报告此资源使用情况:

docker run -i --rm -p 8080:8080 my-application

如您所见,容器使用 10.6MiB:

docker ps -q | xargs  docker stats --no-stream             
CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
b73afe5ee771        mystifying_neumann   0.00%               10.6MiB / 7.777GiB   0.13%               11.7kB / 2.38kB     0B / 0B             21

现在我在 Openshift 中运行该容器,设置以下内存限制:

        resources:
          limits:
            memory: 64Mi
          requests:
            memory: 64Mi

当 pod 启动时,我预计使用了 ~11MiB,总共使用了 64MiB。但是容器使用的是 53MiB !!!为什么会有这种差异?

在此处输入图像描述

4

1 回答 1

1

我终于在这两个参考文献中找到了这种差异的原因:

https://github.com/openshift/origin-web-console/issues/1315

https://access.redhat.com/solutions/3639191

总结一下:Docker 报告内存是添加了 rss 和 cache 等几个元素:

https://docs.docker.com/config/containers/runmetrics/#metrics-from-cgroups-memory-cpu-block-io

缓存 此控制组的进程使用的内存量,可以与块设备上的块精确关联。当您读取和写入磁盘上的文件时,此数量会增加。如果您使用“常规”I/O(打开、读取、写入系统调用)以及映射文件(使用 mmap),就会出现这种情况。它还解释了 tmpfs 挂载使用的内存,但原因尚不清楚。

rss 与磁盘上的任何内容都不对应的内存量:堆栈、堆和匿名内存映射。

Openshift 3.x 使用 Heapster 读取该信息,并且无法区分这两种类型的内存。

如果您检查在 Openshift 中运行的容器的 docker stats,您会发现预期的(较低的)值。

于 2020-03-31T13:41:40.910 回答