判断swap是否频繁进出应看vmstat的si/so值而非free -h的swap used,si/so持续非零(如>100 kb/s)才表明交换活跃,其中si持续>0更危险,反映缺页中断频繁导致卡顿。

swap是否正在频繁进出,得看si/so,不是看used
free -h里Swap行的used值是累计写入量,哪怕进程已退出、页还没回收,它也一直挂着。真正反映“当前交换有多忙”的,只有vmstat输出里的si(swap-in)和so(swap-out)两列——单位是KB/s,数值持续非零才说明内核正高频搬运页。
常见误判:Swap used 1.8G / 2.0G 就以为系统卡,结果vmstat 1 5跑出来si和so全是0,说明只是历史残留,没实际压力。
-
vmstat 1每秒刷新一次,盯住最后两列;连续3秒si或so> 100 KB/s,基本可判定交换活跃 - 如果
so高但si低,可能是某进程刚被换出、还没触发访问,暂时不伤响应 -
si持续 > 0 是更危险的信号——说明缺页中断频繁,CPU在等磁盘读swap,用户操作会明显卡顿
/proc/[pid]/smaps里的Swap:才是进程级真实换出量
top或htop的SWAP列是VIRT - RES粗算的,包含未分配虚拟内存、MAP_NORESERVE区域、共享库COW页,根本没进swap。唯一可信的是遍历/proc/[pid]/smaps里所有以Swap:开头的行,累加第二列(单位KB)。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 必须遍历整个文件,不能只取第一个
Swap:行——堆、栈、.so映射段各自独立计数 - 命令示例:
awk '/^Swap:/ {sum += $2} END {print sum+0}' /proc/1234/smaps(+0防空输出报错) - 结果为0 ≠ 进程没用过swap:可能刚换入,或换出的是file-backed页(如普通mmap文件),这类不计入
Swap:
查谁在拖慢swap,别只看top的SWAP列
想定位真正在刷swap的进程,top默认SWAP字段不可信。更可靠的做法是结合vmstat确认活跃度后,再筛VmSwap值高的进程:
- 先跑
vmstat 1确认si/so持续 > 0 - 再执行:
for pid in /proc/[0-9]*; do [ -f "$pid/status" ] || continue; swap=$(grep VmSwap "$pid/status" 2>/dev/null | awk '{print $2}'); [ "$swap" != "0" ] && echo "$pid $swap $(ps -p $(basename $pid) -o comm= 2>/dev/null)"; done | sort -k2 -nr | head -10 -
VmSwap来自/proc/[pid]/status,单位KB,比smaps求和更快,适合快速筛查 - 注意跳过内核线程(
comm为空)和PID 1,它们的VmSwap恒为0
swapon --show只告诉你设备信息,不反映活跃度
swapon --show输出的USED列和/proc/swaps里的used字段,都是累计写入量,和free -h的used本质一样。它能告诉你swap是partition还是file、优先级多少、总大小,但完全无法回答“此刻swap是不是在狂吐数据”。
- 多设备场景下,
PRIO决定哪个先用——高优先级设备填满前,低优先级的USED始终为0,容易误判闲置 -
swapon --show=NAME,USED,SIZE配合awk算百分比时,注意USED单位是字节,SIZE单位也是字节,别混用KB/MB - 如果
swapon --show无输出,说明swap根本没启用,free -h里Swap total一定为0
真正麻烦的从来不是“swap用了多少”,而是“页在磁盘和内存之间来回搬了多少次”。si/so持续非零,才是该动手查进程或加内存的明确信号。










