小服务器总是在最糟糕的时候耗尽内存:一次 apt upgrade、一次 Docker 构建、深夜的备份。没有 swap 时,内核的 OOM killer 会挑一个进程杀掉,往往就是你的数据库。swap 文件是一条便宜的安全带,给这些峰值留一条出路。只需要五条命令。
1. 查看现状
swapon --show
free -h
如果 swapon --show 什么都没输出,说明还没有 swap。
2. 创建 swap 文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
chmod 600 很重要:swap 里可能留有内存中任何内容的碎片,包括机密信息,所以应当只有 root 能读取。如果 fallocate 报错 “operation not supported”,就改用 dd:
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
3. 让它永久生效
没有这一步,swap 会在重启后消失:
echo '/swapfile none swap sw 0 0' >> /etc/fstab
4. 调整 swappiness
让内核优先使用内存,主要在吃紧时才用 swap:
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swap.conf
sysctl --system
5. 验证
swapon --show
free -h
你应该能看到一个 2 GB 的 swap 设备,cat /proc/sys/vm/swappiness 应该输出 10。
该设多大?
- 1–2 GB 内存的服务器: 1–2 GB swap。
- 4 GB 或更多: 1–2 GB 作为安全网依然足够。
不要按“内存的两倍”来设 swap。在服务器上,swap 是用来吸收短暂峰值的,而不是用来运行内存装不下的负载。
swap 不是答案的时候
观察它几天:
vmstat 5
si 和 so 两列显示每秒从 swap 读入和写出的页数。偶尔有活动是正常的。如果持续不为零,说明服务器内存不足,所有东西都在等磁盘。这时的解决办法是加内存:参见 VPS 需要多少内存。在 EQVPS,你可以升级到更大的套餐而无需重装;你的数据原封不动。
评论
暂无评论。来做第一个吧。