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

psutil与cgroups显示的内存占用差异巨大的原因是什么?

问题

在Kubernetes单容器Pod中运行Python服务(Gunicorn进程为PID 1),使用psutil.Process().memory_full_info()监控内存得到如下输出:

pfullmem(rss=669609984, vms=5986619392, shared=229244928, text=4096, lib=0, data=3318370304, dirty=0, uss=658903040, pss=664651776, swap=0)

但通过cat /sys/fs/cgroup/memory.current查询到的cgroup内存值为474193920,与psutil输出的所有数值均不匹配,差异来源是什么?

回答

你遇到的数值不匹配,核心是两者的统计维度、范围和计算逻辑完全不同,具体原因如下:

  • 统计范围差异
    psutil的memory_full_info()仅统计单个Gunicorn进程(PID 1)的内存占用,而memory.current是统计整个容器cgroup组内所有进程的内存总和。哪怕你以为容器里只有Gunicorn,实际可能存在容器运行时注入的辅助进程(比如Gunicorn启动时的临时shell进程、或容器初始化残留的小进程),这些进程的内存会被cgroup计入,但不会被psutil针对PID 1的查询包含。

  • 内存计算规则差异
    cgroup的memory.current统计的是该cgroup内所有进程真正「独占+按比例共享」的内存:它会将多进程共享的内存按使用比例拆分归属,同时排除内核层面不属于该cgroup的页缓存。而psutil的RSS是把进程用到的所有常驻内存(包括完全共享的系统库内存等)全部计入进程内存,哪怕其他进程也在复用这部分内存,这就导致psutil的RSS数值会远高于cgroup的统计值。

  • 内核内存回收的影响
    cgroup的内存统计会自动剔除已经被内核回收的缓存页,这部分内存实际不会触发OOM;而psutil的RSS可能包含暂时未被内核回收的缓存数据,这部分内存会被算入进程内存,但不会被cgroup统计在内。

  • 采样精度与时机差异
    psutil是通过解析/proc/[pid]/smaps文件计算内存的,该文件的更新存在微小延迟;而memory.current是直接从内核cgroup内存控制器获取的实时数值,两者的采样时间差也会造成数值偏差。

内容的提问来源于stack exchange,提问作者Tobias Hermann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:37:28