一、什么是 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 秒杀的噩梦。
