能,docker stats 直接显示 mem % 字段,但该百分比基于容器内存限制(--memory)计算,若未设置限制则分母为无穷大,结果不可信;真实参考应优先看 mem usage / limit。

docker stats 命令能直接看到内存占用率吗
能,但要注意它显示的是 MEM % 字段,这个百分比是基于容器的内存限制(--memory)计算的,不是宿主机总内存。如果启动容器时没设 --memory,Docker 默认不限制,此时 MEM % 会显示为 0.00% 或极小值,完全不可信。
常见错误现象:docker stats myapp 输出里 MEM % 长期卡在 0.12% 不动,但容器实际已占 1.8GiB —— 这大概率是因为没配内存限制,导致分母无穷大。
- 必须用
--memory启动容器,比如docker run --memory=2g nginx,docker stats才有真实参考价值 -
MEM USAGE / LIMIT字段比MEM %更可靠,优先看它,例如1.5GiB / 2GiB - 若只关心内存、不想要滚动刷新,加
--no-stream参数,输出单次快照
如何用 docker stats 查看指定容器的实时内存使用
执行 docker stats 本身会持续刷新,默认显示所有运行中容器。生产环境通常只想盯住某几个关键容器,避免信息干扰。
- 查单个容器:
docker stats web-api(用容器名)或docker stats a1b2c3d4(用前几位 ID) - 查多个容器:
docker stats api-db api-cache worker-01 - 隐藏标题行和自动刷新,适合脚本解析:
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}" api-db - 注意:容器名必须是
docker ps中显示的 Name,不是镜像名或服务名(如 Compose 中的 service 名)
为什么 docker stats 显示的内存值和 free -h 不一致
因为两者统计维度根本不同:docker stats 读的是 cgroup v1 的 memory.usage_in_bytes,反映该容器进程实际使用的内存量(含 page cache);而 free -h 看的是整个宿主机的可用内存,包含未被任何进程占用的空闲页、buffers、cached 等。
更关键的是:容器内存包含内核为它分配的 slab、page cache、匿名页等,其中部分 page cache 可能被其他容器或宿主机进程共享,所以不能简单相加。
- 不要拿
docker stats的内存总和去对比free -h的available,数值对不上是正常的 - 判断是否真缺内存,看
docker stats中是否频繁接近MEM USAGE / LIMIT的上限,以及dmesg | grep -i "killed process"是否出现 OOM Killer 日志 - 若需细粒度分析(比如区分 anon/rss/cache),得进容器用
cat /sys/fs/cgroup/memory/memory.stat,但需要容器开启memorycgroup 权限
docker stats 的内存数据有延迟或不准怎么办
docker stats 底层依赖 cgroup 的统计接口,本身延迟很低(毫秒级),但“不准”往往来自三个源头:容器未设内存限制、应用自身内存管理(如 JVM 堆外内存)、或 Docker daemon 缓存未及时更新。
- 先确认容器是否启用 memory cgroup:
docker inspect myapp | grep -A 5 Memory,检查HostConfig.Memory是否为非零值 - JVM 容器要额外关注
-XX:MaxDirectMemorySize和 native 内存,这些不计入 cgroup memory usage,但会耗尽宿主机内存 - 偶尔遇到
docker stats卡住或显示0B:重启dockerd一般可恢复,但更可能是容器进程已僵死,docker ps状态却还是Up,此时应结合docker container inspect myapp | jq '.State.Status'核实
docker stats 不显示 swap 使用量**。如果容器启用了 --memory-swap,而实际 swap 被大量使用,MEM USAGE / LIMIT 依然只算物理内存,你会误判为“内存充足”,直到 I/O 拖垮整个宿主机。查 swap 要手动读 /sys/fs/cgroup/memory/mycontainer/memory.memsw.usage_in_bytes。











