服务器Swap分区优化:从创建到调优的完整操作
当服务器物理内存不够用时,系统会把一部分不常用的内存页临时挪到磁盘上的Swap分区,腾出RAM给活跃进程。Swap不能替代内存,它只是兜底手段:磁盘速度远低于内存,一旦频繁读写Swap,程序响应会明显变慢。
因此优化Swap的目标是“够用、少用、可控”,而不是把它当成免费内存。
本文适合内存较小、偶发内存峰值或担心进程被OOM杀掉的Linux服务器用户。
下面所有命令需要root权限或sudo,操作前请确认磁盘有足够剩余空间,并了解创建Swap文件会占用相应磁盘容量。
先确认现状和磁盘余量
动手前先看清当前状态,避免重复创建或空间不足。
free -h
swapon --show
cat /proc/swaps
df -h /
free -h看内存和Swap总量,swapon --show列出已启用的Swap设备,df -h /确认根分区剩余空间。
如果swapon --show已有输出,说明Swap已启用,可跳过创建步骤,直接看后面的参数调优。
常见判断:Swap为0且内存经常吃紧,建议补一块;
Swap已有但free -h里Swap的used长期很高,说明内存确实不足,应先排查是哪个进程占用,而不是单纯加大Swap。
创建并启用Swap文件
下面以创建一个2GB的Swap文件为例。
大小可按内存和磁盘情况调整,常见做法是内存较小时设为内存的1到2倍,但磁盘紧张时不要盲目加大。
# 创建2GB空文件(count=2048,每块1M)
fallocate -l 2G /swapfile
# 如果文件系统不支持fallocate,改用:
# dd if=/dev/zero of=/swapfile bs=1M count=2048
# 设置仅root可读写,权限过宽会导致启用失败
chmod 600 /swapfile
# 格式化为Swap
mkswap /swapfile
# 启用
swapon /swapfile
每步的预期结果:fallocate或dd执行后ls -lh /swapfile能看到文件大小;mkswap会输出“Setting up swapspace”并显示UUID;swapon无报错即成功。
最后用swapon --show复查,应能看到/swapfile这一行。
避坑:权限必须是600,
否则swapon会提示“insecure permissions”并拒绝启用;fallocate在部分文件系统上创建的文件可能无法被Swap识别,
此时改用dd方式重新创建。
配置开机自动挂载
上面启用的Swap重启后会失效,需要写入/etc/fstab。
# 先备份
cp /etc/fstab /etc/fstab.bak
# 追加一行
echo '/swapfile none swap sw 0 0' >> /etc/fstab
改完不要急着重启,先用下面命令校验fstab有没有写错,避免配置错误导致系统启动异常:
mount -a
swapon --show
mount -a没有报错、swapon --show仍显示Swap,说明配置正常。
回滚方式:把/etc/fstab.bak覆盖回去,再执行swapoff /swapfile即可。
调整swappiness控制使用倾向
vm.swappiness决定内核有多积极地把内存页换到Swap,取值0到100。
值越高越倾向使用Swap,值越低越倾向保留内存。
默认常见为60,很多服务器场景会调低到10左右,减少不必要的磁盘交换。
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改(立即生效,重启失效)
sysctl vm.swappiness=10
# 永久生效
cp /etc/sysctl.conf /etc/sysctl.conf.bak
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
注意:swappiness=0并不等于完全禁用Swap,在内存严重不足时系统仍可能使用。
不要为了追求“纯内存”把它设成0,反而可能让OOM更容易触发。
具体数值要结合业务实测,不存在通用最优值。
验证效果与后续观察
优化后需要确认三件事:Swap已启用、参数已生效、系统没有异常交换。
free -h
swapon --show
cat /proc/sys/vm/swappiness
cat /proc/meminfo | grep -i swap
free -h看Swap总量和已用量,/proc/meminfo里的SwapCached、SwapFree能反映交换活跃度。
如果Swap used持续增长、vmstat 1中si和so长期不为0,说明内存确实紧张,应优先排查高占用进程,而不是继续加Swap。
常见问题:swapon报“Invalid argument”通常是文件创建方式或格式有问题,用dd重建再mkswap;
重启后Swap消失,多半是/etc/fstab没写或写错,用mount -a排查;
调整swappiness后无变化,检查是否写进了/etc/sysctl.conf并执行了sysctl -p。
服务器Swap分区优化本质上是在内存和磁盘之间做取舍。
先补齐Swap保证兜底,再通过swappiness控制使用倾向,最后靠监控确认系统是否真的健康,这套流程比单纯“加大Swap”更可靠。