小内存云服务器必备:给 Ubuntu 配置 Swap 并调优 swappiness
入门级云服务器常常只有 1~2G 内存,跑个 Docker 容器、编译一下前端项目,或者 pip 安装一个带 C 扩展的包,就可能触发 OOM(内存耗尽),进程被内核直接杀掉。最省钱的缓解办法是配置 Swap(交换空间):当物理内存不够时,把暂时不用的内存页换到磁盘上。本文以 Ubuntu 24.04 为例,介绍如何用交换文件配置 Swap,以及如何调优相关参数。
一、先确认当前状态
free -h
swapon --show
如果 swapon --show 没有任何输出、free -h 里 Swap 一行全是 0,说明系统还没有交换空间。很多云厂商的公共镜像默认不开 Swap,需要自己加。
再顺手看一下磁盘剩余空间,交换文件会占用对应大小的磁盘:
df -h /
二、创建交换文件
内存 2G 左右的机器,一般配置 1~2G Swap 足够。下面创建一个 2G 的交换文件:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
几点说明:
fallocate速度很快。如果文件系统不支持(个别情况下swapon会报 “invalid argument”),可以改用sudo dd if=/dev/zero of=/swapfile bs=1M count=2048。chmod 600很重要,交换文件里可能包含任意进程的内存内容,不能让普通用户读取。- 执行完再用
swapon --show检查,应该能看到/swapfile一行。
三、开机自动挂载
上面的操作重启后会失效,需要写入 /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
修改 fstab 之前建议先备份:sudo cp /etc/fstab /etc/fstab.bak。写错 fstab 可能导致系统启动异常,改完可以用 sudo findmnt --verify 做一次检查。
四、调优 swappiness
vm.swappiness 控制内核使用 Swap 的积极程度,取值 0~200(老内核为 0~100),Ubuntu 默认是 60。对于服务器,我们希望尽量用物理内存,只在真正紧张时才换出,通常调低到 10 左右:
cat /proc/sys/vm/swappiness # 查看当前值
sudo sysctl vm.swappiness=10 # 立即生效
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf # 永久生效
另一个可以顺带调整的参数是 vm.vfs_cache_pressure,它决定内核回收目录项和 inode 缓存的倾向,默认 100。设置为 50 可以让文件元数据缓存保留得更久,对频繁读取小文件的场景有帮助:
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.d/99-swap.conf
sudo sysctl --system
五、观察效果
配置好之后,可以用下面的命令观察内存和交换的使用情况:
free -h
vmstat 5
vmstat 输出中的 si、so 两列分别表示每秒从 Swap 换入、换出的数据量。如果这两列长时间持续不为 0,说明机器在频繁换页,性能会明显下降,这时 Swap 只是“续命”,真正的解决办法是优化程序内存占用或升级内存规格。
想知道哪些进程用了 Swap,可以执行:
for f in /proc/[0-9]*/status; do awk '/^Name/{n=$2} /^VmSwap/{print $2, n}' "$f"; done 2>/dev/null | sort -rn | head
六、调整或删除 Swap
如果以后想改大小,先关闭再重建:
sudo swapoff /swapfile
sudo rm /swapfile
然后重新执行第二步即可。如果彻底不用了,记得把 /etc/fstab 中对应的一行删掉。
七、小结
- Swap 不能代替内存,但能在内存短暂吃紧时避免进程被 OOM 直接杀掉,对 1~2G 的小规格云服务器很实用。
- 推荐使用交换文件,大小灵活、不用重新分区。
- 服务器场景把
swappiness调低到 10 左右,兼顾稳定和性能。 - 用
vmstat关注si/so,持续换页就该考虑优化程序或升级规格了。
按上面步骤操作大约五分钟,就能让小内存服务器在编译、装包、跑容器时稳定不少。
- 点赞
- 收藏
- 关注作者
评论(0)