
给服务器加个SWAP分区,这事儿听起来挺简单对吧?就跟给手机插张内存卡似的。但很多朋友一通操作下来,发现要么没生效,要么系统变得更慢了,甚至直接开不了机,对着黑屏的服务器欲哭无泪。今天咱们就来唠唠,在设置和排查SWAP时,那些最容易踩的坑。
最常见的一个错误,就是用dd命令辛辛苦苦创建了一个几个G的swap文件,然后用mkswap格式化了,感觉大功告成。结果用free -h一看,SWAP那一栏还是个大鸭蛋。
漏了哪一步?swapon。这就好比你把U盘格式化成FAT32了,但没把它插到电脑上,系统当然用不了。创建并格式化后,必须用swapon /your/swapfile命令手动激活它,这次重启前才能用。很多教程把这步和永久挂载混在一起讲,新手就容易懵。
上面说的swapon是临时的,重启就没了。想永久生效,得修改/etc/fstab文件。这里的坑,那可真是“一字千金”。
很多人直接复制粘贴网上的命令,比如:
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
看起来没毛病,对吧?但如果你的swap文件不叫/swapfile,而是像/var/swap或者/home/swapfile呢?这行代码一写进去,下次重启,系统就会疯狂地找一个根本不存在的/swapfile来挂载,结果就是卡在启动界面,进不了系统。我见过不止一个运维兄弟,因为这事儿半夜爬起来救火。
正确做法:先用cat /etc/fstab看看里面有没有别的swap条目,然后一字不差地把你的swap文件路径写进去。改之前,最好先cp /etc/fstab /etc/fstab.bak做个备份,这是保命的习惯。
另一个反直觉的坑是关于swappiness这个参数的。它控制内核有多“积极”地把内存数据挪到SWAP里,范围是0到100。默认一般是60。
很多人觉得,我内存小,SWAP就是救命稻草,得让它拼命干活啊!于是把swappiness调到90甚至100。结果发现,系统确实不怎么杀进程了,但整体响应慢得像幻灯片。
为啥?因为硬盘(哪怕是SSD)的速度和内存比,也是自行车和高铁的区别。内核过于积极地把还在用的数据换出到硬盘,程序每次需要这些数据时,都得等硬盘“吭哧吭哧”读回来,能不卡吗?这相当于为了缓解“内存不足”的咳嗽,吃了副让全身肌肉无力的药。
对于大多数普通应用,把这个值调到10-30之间是个更稳妥的选择。意思是:“内存老弟,你尽量自己扛,实在扛不住了再找SWAP老哥帮忙。”这样能在避免OOM(内存溢出)杀死进程和保持系统流畅度之间取得平衡。
设好了,参数也调了,怎么验证?光看free -h不够,你得看它“动了”没有。
两个命令特别有用:
sudo swapon --show:清晰列出所有激活的SWAP空间,包括文件和分区,还有优先级,一眼就能看出你设置的对不对。vmstat 1:这个命令每隔1秒刷新一次系统状态。重点看si(swap in,从SWAP读入内存)和so(swap out,从内存写入SWAP)这两列。如果它们长期大于0,尤其是so持续很高,说明你的内存是真不够用了,SWAP正在频繁读写,这时候就该考虑加内存,而不是单纯依赖SWAP了。说到底,SWAP就是个应急的“安全气囊”,它不是提升性能的“涡轮增压”。设置对了,它能防止系统突然崩溃;设置错了,或者过度依赖它,反而会拖慢整个系统。下次再配SWAP的时候,多留个心眼,检查检查路径,掂量掂量参数,或许就能省下不少折腾的功夫。
参与讨论
所以到底是用swap文件好还是单独分个区好?有人比较过吗?
这个swappiness参数解释得太到位了,我之前就调太高导致卡顿。
差点因为fstab写错路径搞崩服务器,现在看到这文章后背发凉。