You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Stats显示的内存实际含义是什么?为何与进程RSS不符?

为什么docker stats的容器内存统计比进程RSS小?

操作复现

先梳理下你做的操作和得到的结果:

  • 启动测试容器:
    docker run --name test -idt python:3 python -m http.server
    
  • 多维度内存验证:
    1. 主机端进程查询:
      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
      
    2. 容器内进程查询:
      root@shubuntu1:~# docker exec -it test ps aux
      
      输出:
      USER 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.
      
    3. Docker官方统计命令:
      root@shubuntu1:~# docker stats --no-stream test
      
      输出:
      CONTAINER 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的内存统计**对共享内存的处理方式不同:

  1. ps的RSS包含所有映射的物理内存页(含共享库)
    你的Python进程运行时会依赖系统级的共享库(比如libc、Python runtime的共享组件),这些库的内存页是被多个进程共享的——不仅容器内的进程能用,主机上的其他进程也可能在复用。但ps的RSS会把进程加载的所有物理内存页(包括共享库的部分)全部算进去,不管这些页是否被其他进程共享。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:14:22