Docker 容器中可用的实际内存是多少?
What is the real memory available in Docker container?
我已经 运行 mongodb 服务通过 docker-这样写:
version: '2'
services:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
mem_limit: 4GB
如果我 运行 docker 统计数据,我可以看到分配了 4 GB:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
cf3ccbd17464 michal_mongo_1 0.64% 165.2MiB / 4GiB 4.03% 10.9kB / 4.35kB 0B / 483kB 35
但是我 运行 这个命令从我的笔记本电脑中获取了 32 GB 的 RAM:
~$ docker exec michal_mongo_1 free -g
total used free shared buff/cache available
Mem: 31 4 17 0 9 24
Swap: 1 0 1
那么mem_limit如何影响内存大小呢?
free
(以及 top
等其他实用程序)不会在 memory-constraint 容器内报告正确的数字,因为它从未命名空间的 /proc/meminfo
收集信息。
如果您想要实际限制,您必须使用 /sys/fs/cgroup
下的 cgroup
pseudo-filesystem 填充的条目。
例如:
docker run --rm -i --memory=128m busybox cat /sys/fs/cgroup/memory/memory.limit_in_bytes
real-time 使用信息可在 /sys/fs/cgroup/memory/memory.stat
下找到。
您可能需要 resident-set-size (rss
),例如(在容器内):
grep -E -e '^rss\s+' /sys/fs/cgroup/memory/memory.stat
更多 in-depth 解释,另请参阅 this article
我已经 运行 mongodb 服务通过 docker-这样写:
version: '2'
services:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
mem_limit: 4GB
如果我 运行 docker 统计数据,我可以看到分配了 4 GB:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
cf3ccbd17464 michal_mongo_1 0.64% 165.2MiB / 4GiB 4.03% 10.9kB / 4.35kB 0B / 483kB 35
但是我 运行 这个命令从我的笔记本电脑中获取了 32 GB 的 RAM:
~$ docker exec michal_mongo_1 free -g
total used free shared buff/cache available
Mem: 31 4 17 0 9 24
Swap: 1 0 1
那么mem_limit如何影响内存大小呢?
free
(以及 top
等其他实用程序)不会在 memory-constraint 容器内报告正确的数字,因为它从未命名空间的 /proc/meminfo
收集信息。
如果您想要实际限制,您必须使用 /sys/fs/cgroup
下的 cgroup
pseudo-filesystem 填充的条目。
例如:
docker run --rm -i --memory=128m busybox cat /sys/fs/cgroup/memory/memory.limit_in_bytes
real-time 使用信息可在 /sys/fs/cgroup/memory/memory.stat
下找到。
您可能需要 resident-set-size (rss
),例如(在容器内):
grep -E -e '^rss\s+' /sys/fs/cgroup/memory/memory.stat
更多 in-depth 解释,另请参阅 this article