Linux Swap 虚拟内存配置详解:swap 文件/分区、swappiness 调优,低配 VPS 告别 OOM


一、什么是 Swap,你的服务器真的需要它吗

Swap 也叫虚拟内存,是硬盘上一块专门划出来、被系统当作"内存"来用的区域。当物理内存(RAM)不够用时,操作系统会按 LRU 等算法把内存里一段时间不被访问的数据页搬到 Swap,腾出物理内存给正在运行的程序;需要时再从 Swap 读回来。简单说,Swap 是内存的"备用仓库",防止 OOM(内存耗尽被内核直接 kill)导致进程秒挂。

很多人装了 VPS 就不管 Swap,尤其是低配机型,2G 内存顶多挂个 Nginx + MySQL + PHP 就吃紧。合理配置 Swap 能显著提升稳定性,但也要避免两个极端:完全不放 Swap,内存一冲高就 Apache/MySQL 崩;或是 Swap 调得过大又把磁盘写满、频繁换页拖慢性能。

二、先看看当前 Swap 状态

用下面命令一次性看清内存与 Swap 的使用情况:

free -h
swapon --show

free -h 里的 Swap 一行显示总容量、已用、可用;swapon --show 会列出当前启用的 swap 分区/文件。如果没有输出,说明服务器目前完全没有启用 Swap。

三、创建 Swap 文件(推荐)

比起分区,扩展 Swap 文件更灵活、不用动磁盘分区表,适合大多数 VPS。以创建 2G 的 swap 文件为例:

# 1. 创建文件,bs*count 控制大小
sudo fallocate -l 2G /swapfile
# 若 fallocate 不可用则用 dd
# sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

# 2. 收紧权限,避免被普通用户读取
sudo chmod 600 /swapfile

# 3. 格式化为 swap
sudo mkswap /swapfile

# 4. 启用
sudo swapon /swapfile

此时再 free -h 或 swapon --show 就能看到 swap 生效。为了让重启后仍生效,把它写进 /etc/fstab:

/swapfile    none    swap    sw    0    0

四、调整 swappiness 让 Swap 更聪明

swappiness 是 0~100 的内核参数,表示内核"多倾向"使用 Swap:值越大越积极换页到磁盘,越小越尽量留在物理内存。默认一般是 60,对建站服务器往往偏高。对内存充足、追求响应速度的机器建议适中间值 10,对内存紧张的低配 VPS 可以保持 30~60:

# 临时生效
sudo sysctl vm.swappiness=10

# 永久生效,写入 sysctl 配置
echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

修改后无需重启,想验证生效可以直接 cat /proc/sys/vm/swappiness。

五、Swap 用满了怎么办:清 swap 与扩容

当 vmpressure、free -h 显示 Swap 长期接近打满,说明物理内存确实不够,该扩容或加内存了。清空 swap 时注意:swapoff 要求先把 swap 里的内容全部搬回内存,若内存已满会失败甚至造成短暂卡顿,所以要先确保内存有富余:

free -h                # 确认 Mem.available 足够
sudo swapoff /swapfile # 先停用
sudo swapon /swapfile  # 重新挂载即空

扩容量时直接把旧文件增大再重新 mkswap 即可:

sudo swapoff /swapfile
sudo fallocate -l 4G /swapfile   # 甚至可先 rm 再新建
sudo mkswap /swapfile
sudo swapon /swapfile

六、如何判断 Swap 是否在拖慢性能

Swap 不是"越不用越好",真正要警惕的是持续的换页压力。可以看:

top          # 看第 4 行 total/free 与第 3 行 si/so 换页
vmstat 1 5   # si/so 两列持续高位,说明频繁写入磁盘

若 si/so 长期不为 0,说明内存严重不足、系统在反复换页,此时应优先升级物理内存或关掉不必要进程,而不是单纯加大 Swap。

写在最后

Swap 配置是 VPS 上性价比最高、也最容易被忽略的优化之一。一套标准的做法是:用 swap 文件代替分区、权限设 600、建议大小与内存相当(如 2G 内存配 2~4G swap)、swappiness 调到 10 左右、并把 /etc/fstab 和 sysctl 配置写死实现开机自动生效。低配服务器加上 Swap 后,MySQL 和编译任务基本告别被 OOM 秒杀的噩梦。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

crontab 定时任务详解:五段式时间语义、数据库备份实战、%转义与故障排查全攻略

Let's Encrypt 免费 SSL 证书申请与自动续期全攻略:ACME 协议 + certbot 一键让网站挂上 HTTPS

评 论
更换验证码