swapoff -a前必须确保free内存≥swap使用量,否则触发oom killer;关闭后需手动swapon恢复,vm.swappiness=0仅降低换出倾向而非禁用swap。

swapoff -a 之前必须确认 free 内存 ≥ swap 使用量
直接执行 swapoff -a 会强制把所有换出到磁盘的数据搬回物理内存。如果当前 free 值(不含 buffers/cache)小于 SwapUsed,系统会触发 OOM Killer,可能杀掉数据库、Web 服务等关键进程。
正确做法是先运行:free -h,看 Mem 行的 free 列是否 ≥ Swap 行的 used 列;
再用 swapon -s 确认 swap 设备路径(如 /dev/dm-1 或 /swapfile);
最后才执行 swapoff /dev/dm-1(不要盲目用 -a,尤其多 swap 设备时易误关)。
释放后必须显式 swapon,否则 swap 空间不恢复
很多人以为 swapoff 后系统会自动重挂,其实不会。swap 关闭后 free -h 显示 Swap total 为 0,此时若不手动 swapon,后续内存压力上升时无法缓冲,OOM 风险反而更高。
操作顺序固定为三步:
-
swapoff /dev/dm-1(等待直到free -h中 Swap used 变为 0) swapon /dev/dm-1-
swapon -s验证是否重新出现在列表中
如果使用的是文件型 swap(如 /swapfile),确保该文件权限仍是 600,否则 swapon 会报错 swapon: /swapfile: insecure permissions 0644, 0600 suggested。
vm.swappiness=0 不等于禁用 swap,只是降低倾向
设成 vm.swappiness=0 后,内核仍会在内存极度紧张(比如只剩几百 MB 可用)或触发休眠(hibernate)时使用 swap。它只影响“何时开始换出”的阈值,不改变 swap 的存在本身。
临时生效:sysctl vm.swappiness=0
永久生效:向 /etc/sysctl.conf 追加 vm.swappiness=0,再运行 sysctl -p。
注意:某些发行版(如 RHEL 8+/CentOS 8+)默认启用 zram 或 zswap,它们会压缩内存页并驻留 RAM,此时 swappiness 对实际 swap I/O 影响变小,需配合 cat /sys/module/zswap/parameters/enabled 一并检查。
别用 drop_caches 清 swap,它只清 pagecache/buffers
echo 3 > /proc/sys/vm/drop_caches 完全不影响 swap 使用量。它只清理内核缓存(pagecache、dentries、inodes),对已换出到磁盘的进程数据毫无作用。
常见误操作链:
看到 free -h 中 available 值低 → 错误认为是缓存占满 → 执行 drop_caches → swap 依然 100% → 问题未解。
真正该查的是哪些进程在用 swap:for file in /proc/*/status; do awk '/VmSwap|Name/{printf "%s %s\n", $2, $3}' "$file" 2>/dev/null; done | sort -k2 -n -r | head -10
输出里第二列数字就是各进程占用的 swap KB 数,定位到大头再针对性 kill 或重启服务。
swap 占满本质是内存分配行为与内核回收策略的失配,不是“脏数据堆积”。强行清空不解决根源,反而掩盖了进程泄漏、JVM 堆配置过小、或容器内存 limit 设置不当等问题。











