python-3.x - 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 声明的内存如此不同吗?
这对我来说当然是个问题,因为应用的内存限制看起来没有受到尊重。
我正在使用树莓派。
解决方案
那是因为 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/
推荐阅读
- angular - 如何在多个阶段的 Gitlab CI/CD 中不重复自己
- python - 如何从不同维度预测句子?
- python - 检查数据框列是否有负值
- php - PHP计算器:答案为0时未定义溢出
- node.js - 使用动态路径创建 aws lambda 函数
- python - UDF 在 PySpark 中运行两次
- python - u"权限 ({0}) 无效。".format( - 尝试安装 pip 时出错
- r - 在 R 中绘制 LASSO 模型的交互效果
- c# - Asp.net Core:无法访问已处置的对象(不同的错误)
- linux - 无法在 Kali Linux 上为 TP-Link WN821N 构建 RTL8192EU 驱动程序