执行 swapoff 提示 Cannot allocate memory 的本质是剩余 RAM 不足容纳待换回的 swap 数据,需先释放内存(sync、drop_caches、调低 swappiness、杀进程)、分批关闭 swap、必要时临时启用 overcommit,再调优 swappiness 和监控 swap 使用以预防。

当执行 swapoff 时提示 Cannot allocate memory,本质是:系统需把当前 swap 中所有页数据“换回”物理内存,但剩余可用 RAM 不够容纳这些数据,内核拒绝操作以避免崩溃。
先释放内存再关闭 Swap
核心思路是腾出足够空闲内存,让 swap 数据有地方可放:
- 运行
sync强制将缓存写入磁盘,减少 dirty page 占用 - 执行
echo 3 > /proc/sys/vm/drop_caches清空 pagecache 和 slab(仅影响 clean 缓存,不丢数据) - 若仍有压力,可临时降低 swappiness:
sysctl vm.swappiness=10,减少新页面向 swap 写入 - 检查并终止明显占用内存的非关键进程(如
htop查看 RES 最高者)
分批关闭多个 Swap 设备
如果系统配置了多个 swapfile 或 swap 分区,不要用 swapoff -a 一次性关全部:
- 用
swapon --show列出所有 swap 设备及其大小 - 优先关闭最小、使用率低的 swap(如刚创建未使用的 swapfile)
- 逐个执行
swapoff /dev/sdXn或swapoff /path/to/swapfile,每次后观察free -h确认内存余量
启用内存 overcommit 作为应急手段
仅限紧急恢复场景,不建议长期开启:
- 查看当前策略:
cat /proc/sys/vm/overcommit_memory - 临时设为 1(允许内核假装内存充足):
sysctl vm.overcommit_memory=1 - 此时
swapoff可能成功,但后续内存申请可能触发 OOM killer - 操作完成后应尽快还原:
sysctl vm.overcommit_memory=0
避免下次再卡住
根本上减少 swap 数据堆积:
- 调低 swappiness(如设为 10),让内核更倾向保留内存而非换出
- 确保 swap 总容量合理(通常 ≥ 物理内存,服务器可设为 1.5–2 倍)
- 监控 swap 使用率,
watch -n 2 'free -h'或vmstat 2观察 si/so 列 - 定期清理内存泄漏进程,避免 swap 被长期填满
这个问题不是命令本身出错,而是系统在保护自己。关键是给内存“腾地方”,而不是硬等它自己完成。

















