swap 要不要开、开多大
发布时间:2025-12-03 15:59       
更新时间:2025-12-03 21:48
swap 要不要开?把结论放在前面:小内存的云主机应该开,大内存机器可以调低使用倾向,但一般不建议彻底关掉。
swap 是干什么的
它是磁盘上划出的一块区域,内存吃紧时内核把不活跃的页挪过去腾地方。没有 swap 的机器,内存一满内核就启动 OOM killer 直接杀进程,数据库半夜被杀一次,代价远大于平时慢那么一点。swap 相当于给系统留了一条缓冲带。内存 2G 的入门机型最容易体会到这份价值:高峰时多出的那点缓冲,往往就是"变慢"与"进程被杀"之间的差别。
开多大
经验参考:2G 以下内存的机器,swap 给到内存的两倍;2G 到 8G,给 2 到 4G 兜底;8G 以上主要靠调参而不是堆容量。数据库这类明确不希望被换出的应用,swap 不必大,swappiness 要调小。内存规格升级后,记得回头修 swap 大小与这个参数,配置跟着规格走,不是一次性设定。
用文件方式加上 swap
dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
再往 /etc/fstab 加一行 /swapfile none swap defaults 0 0,重启后依然生效。查看现状用 free -h 和 swapon --show,改完记得复核一眼。调整之后想让新配置立即接管:swapoff -a && swapon -a 重新挂载;要撤掉某个 swap 文件,swapoff 后删文件并清掉 fstab 对应行。
swappiness 怎么调
取值 0 到 100,默认 60,表示内核有多积极地把页换出去。跑数据库的机器建议调到 10 甚至 1:echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf,然后 sysctl -p /etc/sysctl.d/99-swappiness.conf 生效。写进 sysctl.d 的参数重启不丢,只 echo 到 /proc/sys 的改法重启就没了。数值越低,内核越倾向用内存扛着而不是换出。改完 sysctl vm.swappiness 直接读当前值确认;vmstat 1 里的 si、so 两列是实时换入换出速率,偶发不为零不必紧张,持续走高才说明真的在用。
怀疑进程被 OOM 杀过,dmesg | grep -i "killed process" 一查便知,日志里写明牺牲者与当时水位。真正该长期盯的是监控里 swap 的使用曲线,长期高位说明该加内存了,而不是该调参了。