内存与 OOM58 条

swapoff 的风险与步骤

关闭 swap 会把已换出的页全部读回物理内存;若余量不足将触发 OOM,操作前必须核对 MemAvailable 与 Committed_AS。

swapoff 在做什么

swapoff 会先把指定 swap 设备上已换出的页全部读回物理内存,然后关闭该设备。风险就藏在这一步:如果当前可用内存不足以容纳这些页,回迁过程中会触发高强度回收甚至 OOM。因此它属于高风险操作,执行前必须核对可用内存、承诺量与 swap 已用量,并预留维护窗口。

基本信息

命令形式swapoff /dev/<设备> 或 swapoff -a(关闭全部)
前提检查free -h、/proc/meminfo 的 MemAvailable 与 Committed_AS、/proc/swaps
耗时取决于已换出数据量,几 GB 可能持续数分钟并伴随 IO 抖动
后续动作同步评估 vm.swappiness 与 OOM 保护(oom_score_adj)
可回滚性可再次 swapon,但代价是重新换出,且期间内存压力已发生
适用平台Linux(util-linux 提供 swapoff)

典型使用场景

  • 更换 swap 方案:先关闭旧设备,再启用新的 swap 文件或 zram
  • 验证 swap 对性能的影响:关闭做对照实验,量化延迟变化
  • 数据库等不允许换出的服务,在维护窗口内降低不确定性
  • 清理误创建或不再需要的 swap 分区与文件
  • 平台要求宿主禁用 swap(部分容器运行时的推荐配置)时执行

检查与执行

检查与执行
free -h  # 先看可用内存与 swap 已用量,判断回迁是否安全
awk '/^(Committed_AS|CommitLimit|SwapTotal|SwapFree)/{print}' /proc/meminfo  # 承诺与 swap 水位
cat /proc/swaps  # 确认设备名与已用空间,别看错目标
sudo swapoff /swapfile  # 关闭单个设备;swapoff -a 会关闭全部
swapon --show  # 关闭后确认结果
awk '/^pswpin|^pswpout/{print}' /proc/vmstat  # 观察换页计数是否停止增长

执行前检查表

检查项命令通过标准
可用内存free -hMemAvailable 足以覆盖 swap 已用量并留余量
承诺余量/proc/meminfo 的 Committed_AS 与 CommitLimit两者差距明显,说明超额分配空间充足
swap 已用/proc/swaps已用量越小越安全,越大越需要窗口与监控
执行窗口变更流程避开业务高峰与批处理时段,并通知相关方
已换出数据越多,回迁时的内存峰值与耗时越高。几 GB 的 swap 使用量在机械盘或高负载存储上可能持续数分钟,期间业务延迟会明显抖动,需要有人在现场监控。
关闭 swap 只是取消了缓冲区,并没有增加内存。操作后应重新评估 vm.swappiness 与关键进程的 OOM 保护策略,避免下一个内存高峰直接触发终止。

易错点

  • 不看 SwapFree 直接批量换出:大使用量下内存瞬间吃紧,OOM 终止往往在几秒内发生
  • 以为 MemAvailable 刚好覆盖就安全:回迁期间还有其他分配需求,需要留出明显余量
  • 关闭后不调整策略:原本靠换页兜底的服务在下一个高峰直接被杀
  • 忘记 /etc/fstab 中仍有 swap 行:重启后又挂上,或开机时报错影响启动
  • 在内存已经紧张时执行:没有任何缓冲空间,属于典型的自我制造故障

数据来源与参考

  • util-linux 文档 swapoff(8)
  • Linux 内核 Documentation/admin-guide/mm/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌