Linux怎么查看进程的内存交换情况 Linux下smaps_rollup详解

冬磊姑娘_8723

冬磊姑娘_8723

2026-04-27

200人浏览

原创

判断进程是否被swap需看/proc/{pid}/smaps_rollup中swap和swappss字段:swap为0表示当前无页被换出,swappss反映进程实际承担的交换成本;两者持续非零增长表明内存严重不足。

linux怎么查看进程的内存交换情况 linux下smaps_rollup详解

怎么看进程有没有被 swap 出去

关键看 Swap 和 SwapPss 这两个字段,它们直接反映该进程有多少内存页被换出到 swap 分区。

执行 cat /proc/{pid}/smaps_rollup 后,搜索这两行:

  • Swap: 0 kB —— 表示当前没有物理页被换出(注意:不等于“永远不会被换出”,只是此刻没换)
  • SwapPss: 1234 kB —— 是 PSS 视角下的交换量,考虑了共享页的分摊,比 Swap 更贴近“这个进程实际承担的 swap 成本”

如果两者长期非零且持续增长,说明该进程正被内核频繁换入换出,是内存严重不足的信号。此时 free -h 中的 used swap 通常也接近上限。

smaps_rollup 里哪些字段和 swap 直接相关

除了 Swap 和 SwapPss,下面几个字段共同构成 swap 行为的上下文:

  • Anonymous:匿名映射页总量(如堆、栈、malloc 分配),这类页可被 swap;值越大,潜在 swap 风险越高
  • Private_Dirty:进程独占且已修改的内存,是 swap 的主要候选对象;若它高而 Swap 低,说明还没触发换出;若它高且 Swap 也在涨,说明内核已经开始回收
  • Rss 和 Pss 持续高于 MemAvailable(查 /proc/meminfo)时,swap 往往已是“进行时”而非“将来时”

注意:Shmem、File 类内存一般不可 swap(除非挂载了 tmpfs 并启用了 swap backing),所以它们高不影响 swap 压力判断。

为什么不能只看 top 或 ps 的 %MEM 判断 swap 风险

ps aux 和 top 显示的 %MEM 基于 Rss,但 Rss 不区分“是否已被 swap”——它只统计当前驻留物理内存的大小。一个进程 Rss 是 500MB,Swap 是 300MB,%MEM 仍按 500MB 算,完全掩盖了其 300MB 已离线的事实。

Zynq Linux Hardware Debug
Zynq Linux Hardware Debug

Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

下载

更危险的是:某些进程(如 JVM)会预分配大量虚拟内存(VmSize),但 Rss 很小,%MEM 看起来很低,却可能因 Anonymous 高、MemAvailable 低,一触发 GC 就瞬间推高 Swap。

所以,单靠 ps 或 top 定位 swap 问题,相当于用体温计测地震——读数稳定,不代表地壳没在滑动。

实操建议:快速筛查高 swap 风险进程

以下命令组合可一次性列出所有 Swap > 0 的进程及其关键指标:

adb shell "ps -A | awk '{print \$2}' | grep -E '^[0-9]+$' | while read pid; do \
  if [ -f /proc/\$pid/smaps_rollup ]; then \
    swap=\$(cat /proc/\$pid/smaps_rollup 2>/dev/null | grep '^Swap:' | awk '{print \$2}'); \
    [ \"\$swap\" != \"0\" ] && name=\$(cat /proc/\$pid/comm 2>/dev/null | head -c 15) && \
    pss=\$(cat /proc/\$pid/smaps_rollup 2>/dev/null | grep '^Pss:' | awk '{print \$2}') && \
    echo \"PID:\$pid \$(printf \"%-15s\" \"\$name\") Swap:\$swap kB Pss:\$pss kB\"; \
  fi; done | sort -k4 -nr"

要点:

  • 必须用 adb root(或 root shell),否则多数进程的 /proc/{pid}/smaps_rollup 不可读
  • 过滤掉 Swap: 0 的进程,避免噪音;真正要盯的是那些 Swap 在几十 MB 以上、且 Pss_Anon 占比超 80% 的进程
  • Android 上 smaps_rollup 从 API 29(Android 10)才稳定支持,旧设备需 fallback 到完整 smaps + awk 聚合,耗时高得多

最易被忽略的一点:swap 不是“开/关”状态,而是连续谱。一个进程 Swap 从 0 → 10MB → 100MB 的过程,往往比最终值更值得监控——因为它暴露的是内存压力的演化节奏,而不是某个静态快照。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

550

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

513

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

283

6

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4030

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3433

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2613

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6390

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6022

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习