我有一个使用 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/