服务器内存告警?程序被 OOM Killer 无情杀掉?别急,不用重启、不用重新分区,一个文件就能搞定 Swap 扩容。
为什么需要 Swap?
Swap(交换空间)是 Linux 的"虚拟内存"。当物理内存吃紧时,内核会把不活跃的内存页挪到磁盘上,给活跃进程腾地方。
虽然磁盘比内存慢得多,但有 Swap 兜底,至少能:
- ✅ 避免进程被 OOM Killer 强制杀死
- ✅ 让内存密集型任务(如编译、数据分析)顺利跑完
- ✅ 为系统争取时间,等你扩容物理内存
实战:5 分钟创建文件 Swap
1️⃣ 创建 Swap 文件
推荐用 fallocate(瞬间完成),如果文件系统不支持再换 dd:
# 创建一个 4GB 的 swap 文件(按需调整 4G 这个值)
sudo fallocate -l 4G /swapfile
# 如果 fallocate 报错,用 dd 兜底(稍慢但兼容所有文件系统)
# sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress2️⃣ 设置安全权限
Swap 文件必须只能 root 读写,否则系统会拒绝挂载:
sudo chmod 600 /swapfile3️⃣ 格式化为 Swap 格式
sudo mkswap /swapfile看到类似 Setting up swapspace version 1, size = 4 GiB 就是成功了。
4️⃣ 立即启用
sudo swapon /swapfile验证一下:
sudo swapon --show
# 或
free -h如果看到 /swapfile 出现在列表里,🎉 恭喜你,Swap 已经在线了!
关键一步:开机自动挂载
刚才的操作重启后会失效,要写入 /etc/fstab:
sudo nano /etc/fstab在文件末尾添加一行:
/swapfile none swap sw 0 0⚠️ 千万别乱改已有的行! 改错可能导致系统无法启动。
保存后,先测试语法是否正确:
sudo mount -a
sudo swapon -a没报错就说明配置安全,下次重启会自动挂载。
进阶调优:Swappiness
Linux 默认的 swappiness 通常是 60,表示内核比较"积极"地使用 Swap。
你可以根据场景调整:
# 临时调整(重启失效)
sudo sysctl vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf| 值 | 适用场景 |
|---|---|
| 10-20 | 桌面/笔记本,优先保内存,减少卡顿感 |
| 60 | 默认,平衡策略 |
| 100 | 服务器后台任务,优先保内存给缓存 |
需要清理?一键卸载
如果以后不需要了,按这个顺序清理:
# 1. 关闭 swap
sudo swapoff /swapfile
# 2. 编辑 fstab,删除 /swapfile 那一行
sudo nano /etc/fstab
# 3. 删除文件
sudo rm /swapfile干净利落,不留痕迹。
⚠️ 避坑提醒
| 坑 | 解决方案 |
|---|---|
| Btrfs 文件系统 | 旧内核不支持 swap 文件,建议改用 swap 分区或 zram |
| SSD 寿命焦虑 | 频繁 Swap 确实会写盘,内存充足时建议降低 swappiness |
| Swap 大小 | ≤2GB 内存建议 2×RAM;2-8GB 建议 1×RAM;>8GB 建议 4-8GB 即可 |
总结
用文件做 Swap 是 Linux 最灵活的内存扩容方案:无需重启、无需分区、随时增减。无论是云服务器临时救急,还是本地开发机编译大项目,都能派上大用场。
下次再看到 Out of memory,别再只会加内存条了,先 fallocate 一个 Swap 文件顶上!💪
你平时是怎么处理 Linux 内存不足的? 欢迎在评论区交流 👇