Docker容器内存使用情况似乎不正确

时间:2018-11-29 00:57:51

标签: python-3.x docker docker-compose

我有一个使用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声明的内存如此不同吗?

这对我来说当然是个问题,因为所应用的内存限制似乎没有得到遵守。

我正在使用Raspberry PI。

1 个答案:

答案 0 :(得分:0)

这是因为Docker仅报告来自cgroups memory.stats的RSS,但实际上您需要总结缓存,rss和swap(https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt)。有关https://sysrq.tech/posts/docker-misleading-containers-memory-usage/

中的更多信息