python-3.x - Docker 容器内存使用似乎不正确

标签 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 声明的内存如此不同吗?

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

我正在使用树莓派。

最佳答案

这是因为 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/

关于python-3.x - Docker 容器内存使用似乎不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530333/

相关文章:

python - 如何从列表中获取二维列表但在另一个列表中定义形状

docker - Redis Windows 错误 : connect ECONNREFUSED 127. 0.0.1:6379 但应用程序正在运行

docker-compose IOError : Can not access file in context

python - 通过聚合查找 pandas 组中的频繁项的最有效方法是什么

python-3.x - 不使用字符串方法查找字符串最后一个单词的长度 - Python

python - 未知格式代码 'x'

docker - 自反docker镜像构建的健全性检查?

mysql - Sails 不会填充大型查询

mysql - Sequelize 无法从 Node/express 应用程序同步到 docker 容器中的 MySQL (ECONNREFUSED)

docker - Dockerfile卷:本地更改未反射(reflect)在Docker中