
怎么快速查看当前Swap使用情况
直接用 free -h 最省事,第二行 Swap 列的 used 和 total 值一眼就能看出用了多少、还剩多少。注意别只看第一行 Mem,那是物理内存,和 Swap 无关。
如果想更细粒度地看每个 Swap 设备(比如多个 swapfile 或 swap partition),运行 swapon --show=NAME,TYPE,SIZE,USED,PRIORITY。它会列出所有启用的 Swap 源,包括是文件还是分区、优先级多少——优先级高的会先被使用。
常见误区:cat /proc/swaps 虽然也能看,但不显示已用百分比,也不自动换算单位,容易误判大小。
Swap 一直被占用,是不是内存不够或有泄漏
不一定。Linux 内核会主动把部分休眠进程的匿名页移到 Swap,哪怕物理内存还很空闲,这是正常策略,目的是腾出更多 page cache 提升 I/O 性能。
判断是否真有问题,重点看两点:
-
free -h中available值是否持续很低(远低于free) - 系统是否频繁触发
swapin/s和swapout/s(用vmstat 1看第5、6列)——持续高于 100 就可能影响响应 - 用
top或htop按SWAP列排序,看哪些进程占 Swap 最多;特别留意长期驻留且 RSS 很小但 SWAP 很大的进程
Swap 使用率 80% 不代表异常,但若伴随高延迟、kswapd0 占满一个 CPU 核,那才值得深挖。
要不要手动清理 Swap 缓存
不要用 swapoff -a && swapon -a 强制清 Swap——这会把所有 Swap 数据硬拉回内存,极可能导致 OOM kill 进程,尤其是内存吃紧时。
真正安全的做法只有两个:
- 让内核自己回收:设置
/proc/sys/vm/swappiness为较低值(如10),减少主动换出倾向(临时改用echo 10 > /proc/sys/vm/swappiness,永久写入/etc/sysctl.conf) - 释放特定缓存:如果只是想腾点空间,
echo 3 > /proc/sys/vm/drop_caches只清 page cache 和 slab,不影响 Swap 中的数据,也无风险
没有“清理交换内存缓存”这种独立操作——Swap 里的数据不是缓存,是进程堆/栈的真实副本,删了就丢了。
Swap 分区 vs swapfile,哪个更容易排查和管理
swapfile 更灵活,推荐新部署用。它支持在线增删(fallocate 创建 + mkswap + swapon),还能放在 LVM 或 btrfs 上;而传统 swap 分区一旦建错,调整要重分区,风险高。
但要注意两点:
- swapfile 必须是普通文件,不能在 tmpfs、overlayfs 或加密文件系统上创建,否则
swapon会报Invalid argument - 用
chown root:root和chmod 600严格限制权限,否则swapon会拒绝启用(报错swapon: not superuser or invalid permissions)
排查时,swapon --show 输出里 TYPE 是 file 还是 partition 一目了然,后续操作路径也不同——swapfile 要删文件+同步 fstab,swap partition 要确认没挂载再用 mkswap 重刷。








