我有一个使用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。
答案 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/
中的更多信息