文件是什么
/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,容器内可见范围还受命名空间限制。跨容器或查看宿主机进程时,需要相应的特权视角。