对于 ¥38/年的 2核2G 服务器(价格查询于 2026-10-02),一跑编译或者启动数据库,很容易遭遇 OOM (Out of Memory) killer 强制杀进程。给系统加个 Swap,划出一块硬盘当虚拟内存,就能把濒临崩溃的服务救回来。
分配多少 Swap:一张表看懂档位
给系统分配 Swap 不是越大越好。硬盘的读写延迟比物理内存高几个数量级,把 2G 的机器硬加 16G Swap 只会导致系统卡死在频繁的 IO 等待中。
| 物理内存大小 | 建议 Swap 大小 | 工程判断依据 |
|---|---|---|
| 小于等于 2GB | 内存的 2 倍 | 基础系统和必备服务的最低缓冲线 |
| 2GB 到 8GB | 等同于内存 | 给数据库和日常请求留足突发溢出空间 |
| 8GB 到 16GB | 4GB 固定值 | 超过 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 步:
- 先用
dd划文件:别用fallocate碰运气。 - 挂载后查
findmnt:确保fstab没有语法错误,避免服务器重启起不来。 - 设置
swappiness=10:阻止内核过度换页把系统拖慢。
参考链接:
- How to Add Swap Space on Ubuntu