Linux怎么查看进程的SWAP占用 Linux下smaps统计交换空间详解

阿涛小哥_7997

阿涛小哥_7997

2026-06-07

655人浏览

原创

/proc/[pid]/smaps 中的 swap: 行是唯一准确反映进程实际换出到交换分区的匿名页大小(kb),而 top 或 ps 的 swap 列基于过时估算(如 virt-res),包含未分配虚拟内存、写时复制页等,不可信;/proc/[pid]/status 中的 vmswap 在新内核中已废弃。

linux怎么查看进程的swap占用 linux下smaps统计交换空间详解

直接看 /proc/[pid]/smaps 里的 Swap: 行,这是当前进程实际被换出到 swap 的物理内存页数(单位:KB),不是估算值,也不是 VIRT-RES 差值。

为什么 top 或 ps 显示的 “SWAP” 列不可信

旧版 top(如 CentOS 6 之前)用 VIRT - RES 粗略估算 swap 占用,但这个差值包含未分配的虚拟地址、mmap(MAP_NORESERVE) 区域、甚至共享库的私有写时复制页——它们根本没进 swap。CentOS 7+/proc/[pid]/status 中的 Swap: 字段已废弃,smaps 才是唯一准确来源。

  • top 按 f → 启用 SWAP 字段,显示的是过时算法结果,尤其在启用 zswap 或 zram 时完全失真
  • ps 的 vsz 和 rss 都不反映真实 swap 使用量
  • 真正换出的页只记录在 /proc/[pid]/smaps 每个内存段末尾的 Swap: 行里,需累加

如何用 shell 快速汇总所有进程的 Swap 占用

核心命令靠遍历 /proc/[0-9]*/smaps 并提取 Swap: 值求和,注意过滤权限错误和 PID 有效性:

for i in $(cd /proc; ls -d [0-9]* 2>/dev/null | awk '$1 > 100'); do
  awk '/^Swap:/ {sum += $2} END {if (sum > 0) print "'$i'", sum/1024 "M"}' "/proc/$i/smaps" 2>/dev/null
done | sort -k2hr | head -10
  • ls -d [0-9]* 比 grep "^[0-9]" 更安全,避免匹配到 sys 或 self
  • awk '$1 > 100' 排除内核线程(PID 通常 ≤ 100),减少干扰
  • 2>/dev/null 屏蔽 Permission denied(如 systemd-journal 进程)
  • 输出单位转为 MB,按数值降序排,取前 10

smaps 中 Swap: 的实际含义与常见误读

Swap: 行数值是该内存段中**已被换出且尚未换入**的匿名页(anonymous pages)数量,单位 KB。它不包括:

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载
  • 文件映射页(file-backed pages):即使被换出,也不计入此字段,因为它们可从磁盘文件重新加载
  • 共享内存(shm)、tmpfs:这些区域不会被 swap,除非启用了 vm.swappiness=0 且内存极度紧张
  • zswap 压缩后驻留内存的页:这部分虽逻辑上属于 swap,但 smaps 仍记为 0,因未真正落盘
  • 刚 fork 但未写入的子进程页:写时复制(COW)未触发前,父进程的 Swap: 不变

所以一个进程 Swap: 为 0,不代表它没触发过换出——可能刚换入,或换出的是 file-backed 页;而 >0 则确凿说明它正在消耗 swap 设备的真实 I/O 带宽。

排查高 Swap 进程时容易忽略的关键点

看到某个进程占了 500MB swap,别急着 kill。先确认三件事:

  • 查 cat /proc/[pid]/status | grep -E "VmSize|VmRSS|VmSwap":如果 VmSwap 存在且非 0,说明内核确实统计了它;若不存在,说明该字段已在较新内核中移除,必须依赖 smaps
  • 运行 vmstat 1 5 观察 si/so:若持续 > 0,说明换入换出活跃;若全为 0,那 500MB 可能是历史残留(比如大进程刚退出,页未回收)
  • 检查 cat /proc/sys/vm/swappiness:值为 0 时,内核仅在内存严重不足时才 swap;值为 100 时则激进换出,此时高 Swap: 不一定代表问题,而是策略使然

最危险的信号不是 swap 占用高,而是 si + so 持续大于 100 KB/s —— 那说明磁盘在疯狂搬运页,响应延迟已开始恶化。

相关文章

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

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

下载

相关标签:

linux

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

相关专题

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

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

2025.09.05

510

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

3950

4

如何安装LINUX
如何安装LINUX

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

2023.06.29

3373

10

linux find
linux find

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

2023.06.30

2533

5

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

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

2023.07.05

6130

7

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

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

2023.07.06

5762

7

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

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

共0课时 | 0人学习