首页/系统/Linux 内核与性能调优速查/smaps_rollup 进程内存汇总
内存与 OOM58 条

smaps_rollup 进程内存汇总

/proc/<pid>/smaps_rollup 汇总 Rss/Pss/Shared/Private 等字段,读取开销远小于全量 smaps,适合定期采样做差定位增长。

文件是什么

/proc/<pid>/smaps_rollup 汇总该进程所有内存映射的统计量:Rss、Pss、Shared_Clean/Shared_Dirty、Private_Clean/Private_Dirty、Anonymous、Swap 等字段一次给出。相比逐段读取 smaps(大进程可能产生几十 MB 文本),它的读取开销小得多,因此适合按固定间隔采样再做差分,用来判断内存是在增长还是波动,是定位泄漏的第一步。

基本信息

接口路径/proc/<pid>/smaps_rollup(内核 4.14 起提供)
关键字段Rss、Pss、Private_Dirty、Anonymous、Swap、Locked
Pss 口径共享页按共享者数量分摊,更接近进程的真实占用
权限要求与目标进程同用户或 root
配套工具pmap -x(下钻到具体段)、/proc/<pid>/status 的 VmRSS、cgroup memory.stat
采样建议间隔 1-5 分钟连续取 3 次以上

典型使用场景

  • 判断进程内存是否在增长:定时采样做差比单次读数可靠得多
  • 评估真实占用:Pss 对共享库较多的进程更公平,避免高估
  • 区分增长来源:私有脏页增长指向应用分配,共享部分增长多与库或映射有关
  • 与容器 cgroup 指标交叉验证,确认增长是否传导到限额
  • 作为泄漏排查的起点,再配合 pmap 定位具体内存段

采样对比

采样对比
cat /proc/12345/smaps_rollup  # 一次拿到全部汇总统计
grep -E '^(Rss|Pss|Private_Dirty|Anonymous|Swap)' /proc/12345/smaps_rollup  # 只看关键字段
for i in 1 2 3; do date; grep -E '^(Rss|Pss|Anonymous)' /proc/12345/smaps_rollup; sleep 60; done  # 连续采样看趋势
sudo pmap -x 12345 | sort -k3 -rn | head  # 按 RSS 排序下钻到具体内存段
cat /proc/12345/status | grep -E 'VmRSS|VmSwap'  # 与 status 口径交叉核对
cat /sys/fs/cgroup/myapp.slice/memory.current  # 容器视角确认整体用量变化

关键字段读法

字段含义判读要点
Rss常驻内存总量最直观的当前占用
Pss共享页按比例分摊后的占用评价单进程真实用量更公平
Private_Dirty私有脏页应用真实分配的典型证据
Anonymous匿名页总量持续增长多与应用内存分配相关
Swap已换出的量换出增多说明物理内存吃紧
对比采样要选择负载相近的时段(例如都取业务低峰),并把采样时间点与业务事件对齐记录,否则页缓存波动与垃圾回收周期很容易被误读为泄漏。
读取需要与目标进程相同的用户权限或 root,容器内可见范围还受命名空间限制。跨容器或查看宿主机进程时,需要相应的特权视角。

易错点

  • 直接读取完整 smaps:文件可能极大,采样本身就会带来开销,优先用 rollup
  • 两次采样负载差异大就下结论:缓存波动与 GC 周期会干扰判断,应固定采样时段
  • 只看 Rss 单字段:结合 Pss 与 Private_Dirty 才能判断共享内存的分摊情况
  • 忽略权限与命名空间:读不到文件时容易误判为进程异常或没有内存信息
  • 把 rollup 与 status 的字段直接等同:两者口径存在细节差异,对比时要说明来源

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌