首页 > 解决方案 > Docker 容器内存使用似乎不正确

问题描述

我有一个使用 docker-compose 版本 2 安装的容器,它的内存限制为 32mb。

每当我运行容器时,我都可以像这样监控使用的资源:

docker stats 02bbab9ae853

它显示以下内容:

CONTAINER ID        NAME                                            CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
02bbab9ae853        client-web_postgres-client-web_1_e4513764c3e7   0.07%               8.078MiB / 32MiB    25.24%              5.59MB / 4.4MB      135GB / 23.7MB      0

对我来说看起来很奇怪的是内存部分:

8.078MiB / 32MiB    25.24%

如果在容器之外,我会列出我得到的 Postgres PID:

$ pgrep postgres
23051, 24744, 24745, 24746, 24747, 24748, 24749, 24753, 24761

如果我停止容器并重新运行上述命令,我将没有 PID。这清楚地证明了所有 PID 都是由停止的容器创建的。

现在,如果我重新运行容器并获取每个 PID 并计算它的 RSS 内存使用量,并将其与 python 方法相加,我没有得到〜8Mb docker 告诉我,但更高的值甚至不接近它(大约 100Mb 左右)。

这是我用来计算 RSS 内存的 python 方法:

def get_process_memory(name):
    total = 0.0
    try:
        for pid in map(int, check_output(["pgrep",name]).split()):
            total += psutil.Process(pid).memory_info().rss
    except Exception as e:
        pass
    return total

有人知道为什么 docker 声明的内存如此不同吗?

这对我来说当然是个问题,因为应用的内存限制看起来没有受到尊重。

我正在使用树莓派。

标签: python-3.xdockerdocker-compose

解决方案


那是因为 Docker 只报告来自 cgroups memory.stats 的 RSS,但您实际上需要总结缓存、RSS 和交换 ( https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt )。更多信息在https://sysrq.tech/posts/docker-misleading-containers-memory-usage/


推荐阅读