小内存救星:4条命令加Swap治好OOM

小内存救星:4条命令加Swap治好OOM

Swap 设置Linux 虚拟内存OOM killerswappiness 调优小内存服务器
📶 入门

对于 ¥38/年的 2核2G 服务器(价格查询于 2026-10-02),一跑编译或者启动数据库,很容易遭遇 OOM (Out of Memory) killer 强制杀进程。给系统加个 Swap,划出一块硬盘当虚拟内存,就能把濒临崩溃的服务救回来。

分配多少 Swap:一张表看懂档位

给系统分配 Swap 不是越大越好。硬盘的读写延迟比物理内存高几个数量级,把 2G 的机器硬加 16G Swap 只会导致系统卡死在频繁的 IO 等待中。

物理内存大小建议 Swap 大小工程判断依据
小于等于 2GB内存的 2 倍基础系统和必备服务的最低缓冲线
2GB 到 8GB等同于内存给数据库和日常请求留足突发溢出空间
8GB 到 16GB4GB 固定值超过 4GB 的换页通常意味着业务必须加物理内存
16GB 以上2GB 到 4GB 之间仅作为异常日志或偶发内存泄漏的最后一重保险

明确了大小,我们以最典型的 2G 内存分配 2G Swap 为例,开始执行具体的命令配置。

检查系统现状:别盲目重叠挂载

盲目添加 Swap 容易造成多个虚拟内存分区挂载混乱。动手前先验证系统目前的内存和 Swap 状态,确认是否已经有厂商预装的交换空间。

free -h
sudo swapon --show

如果 swapon 没有返回任何内容,且 free 命令输出的 Swap 行为 0B,说明系统没有启用虚拟内存。你可以放心往下进行,在文件系统里划出一块专用的空间。如果已有挂载,请先评估原有空间是否够用,避免叠加多个 Swap 降低内核寻址效率。

创建并锁定 Swap 文件:避开稀疏分配坑

使用 dd 命令划出一块连续的磁盘空间。我们不用 fallocate 是因为它在 Btrfs 等写时复制(CoW)文件系统上容易创建出有孔的稀疏文件,导致后续激活失败。

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile

执行完毕后用 ls -lh /swapfile 检查确认文件大小为 2.0G,且权限变成了 -rw-------。Swap 里存着应用内存数据的明文片段,甚至可能包括登录凭据和密钥。只有 root 保留读写权限,其他非授权用户就读不到这些敏感数据。

激活与持久化:写入系统文件表

给刚才划出的文件打上 Swap 专属头标记并当场启用。

sudo mkswap /swapfile
sudo swapon /swapfile

这两条命令跑完,内核就开始使用这 2G 空间应对内存压力。为了保证服务器重启后虚拟内存依然生效,需要把挂载规则写入 /etc/fstab。

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo findmnt --verify --verbose

只有当 findmnt 输出 0 parse errors, 0 errors, 0 warnings 时才算安全。错误的 /etc/fstab 语法会让系统在下次重启时卡在急救模式(Rescue Mode)直接起不来。

调优 swappiness:减少无意义换页

Ubuntu 24.04 默认的 vm.swappiness 参数是 60,这个值偏向于桌面环境,系统会很积极地把内存数据扔给硬盘。服务器上我们需要让系统尽量榨干物理内存,不到最后关头别去读写硬盘。

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.d/99-swap.conf
sudo sysctl --system

通过降低 swappiness 到 10,系统会优先把内存留给应用进程。同时把 vfs_cache_pressure 降到 50,能让系统更久地缓存文件系统的元数据,提升文件频繁查找时的命中率。

常见问题(FAQ)

Swap 会不会伤 SSD 导致寿命缩短? 会增加写入量,但现代 SSD 的 TBW(写入总量)在常规服务器负载下足够撑过质保期。相比于进程被 OOM 随机杀掉导致的业务中断,一点硬盘寿命损耗可以接受。

如果加了 Swap 还是很卡,要不要直接加内存? Swap 只是防止进程崩溃的缓冲垫,解决不了根本的算力缺口。如果你发现 free -h 里的 Swap 长期被占满,说明业务真实需求已经超过了当前机型。这时候必须花钱升级物理内存,详见旧文:2核2G能跑哪些软件。

不需要 Swap 时怎么安全删除? 先用 sudo swapoff /swapfile 卸载当前文件,然后从 /etc/fstab 里删掉对应的挂载行。最后执行 sudo rm /swapfile,就能干净利落收回这 2G 磁盘空间。

最小可行清单:只做 3 件事

如果你不想陷入复杂的调优细节,请确保完成以下最核心的 3 步:

  1. 先用 dd 划文件:别用 fallocate 碰运气。
  2. 挂载后查 findmnt:确保 fstab 没有语法错误,避免服务器重启起不来。
  3. 设置 swappiness=10:阻止内核过度换页把系统拖慢。

参考链接:

  • How to Add Swap Space on Ubuntu