Docker Stats显示的内存实际含义是什么?为何与进程RSS不符?
为什么
docker stats的容器内存统计比进程RSS小? 操作复现
先梳理下你做的操作和得到的结果:
- 启动测试容器:
docker run --name test -idt python:3 python -m http.server - 多维度内存验证:
- 主机端进程查询:
输出:root@shubuntu1:~# ps aux | grep "python -m http.server"root 17416 3.0 0.2 27368 19876 pts/0 Ss+ 17:11 0:00 python -m http.server - 容器内进程查询:
输出:root@shubuntu1:~# docker exec -it test ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.9 0.2 27368 19876 pts/0 Ss+ 09:11 0:00 python -m http. - Docker官方统计命令:
输出:root@shubuntu1:~# docker stats --no-stream testCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d72f2ece6816 test 0.01% 12.45MiB / 7.591GiB 0.16% 3.04kB / 0B 0B / 0B 1
- 主机端进程查询:
你发现的这个问题很典型:进程RSS换算后约19.13MB,但docker stats显示容器只用了12.45MB,数值反而更小。
核心原因:统计逻辑的差异
这本质是**ps的RSS统计和Docker基于cgroup的内存统计**对共享内存的处理方式不同:
ps的RSS包含所有映射的物理内存页(含共享库)
你的Python进程运行时会依赖系统级的共享库(比如libc、Python runtime的共享组件),这些库的内存页是被多个进程共享的——不仅容器内的进程能用,主机上的其他进程也可能在复用。但ps的RSS会把进程加载的所有物理内存页(包括共享库的部分)全部算进去,不管这些页是否被其他进程共享。docker stats只统计容器独占的内存资源
Docker的内存统计是基于Linux cgroup的内存计数器,它会智能剔除那些被容器外进程也在使用的共享内存页,只计算:- 容器内进程独占的内存页
- 只有容器内进程使用的共享内存页(比如容器内部自己安装的库)
简单说,ps是从单个进程的视角统计它“接触到”的所有物理内存,而docker stats是从容器资源隔离的视角统计这个容器真正“占用”的、无法被其他容器/主机进程复用的内存。
比如你这个场景里,Python进程依赖的系统共享库大概占了6-7MB左右,这部分在ps里被算进了RSS,但docker stats因为发现这些库也被主机其他进程使用,所以没有把这部分算到容器的内存使用量里,最终就出现了数值差。
补充术语说明
为了更清晰,再明确下两个关键指标的定义:
- RSS(Resident Set Size):任务已使用的未交换物理内存(单位:KB),别名rssize、rsz——包含进程加载的所有物理内存页,不管是否共享。
- MEM USAGE / LIMIT:容器正在使用的总内存(仅统计容器独占/专属的内存),以及允许使用的总内存上限。
内容的提问来源于stack exchange,提问作者atline
相关产品推荐
相关产品推荐

