说实话这种内存吃紧的情况中小团队真的太常见了,不管是测试机还是临时救急的低配生产过渡机,预算不够直接升级物理内存的时候,加个合适的虚拟内存(swap)是最快最实用的临时方案,长期用的话也能当个小缓冲。不过可别以为随便敲两个命令就行,我刚入行的时候就踩过一个大坑,差点让一台核心小站的响应慢到直接被用户投诉丢流量。
那时候是2020年吧,接了个亲戚朋友开的社区团购小程序的活,初期用的是2C4G的腾讯云轻量应用服务器,订单量上来后每天晚上8点到10点高峰期就卡得要死,后来临时加了个128G的swap——没错你没看错,是128G,我当时脑子抽了直接把轻量云送的100G系统盘剩下的空间全划成swap了,结果高峰期磁盘IO直接飙到100%,小程序打开的时间从几秒变成了几十秒,后来赶紧找客服扩容了50G的数据盘,重新划了8G的swap才救回来。
这里一定要敲黑板第一个避坑提醒:swap不是越大越好,多数生产和测试场景下,swap的大小设置为物理内存的1-2倍就够了,超过4G物理内存的话,最多设置8G就行。太多了的话,系统会频繁地把物理内存里的内容换进换出swap,也就是常说的“swap颠簸”,反而会严重拖慢系统的响应速度。
先说说主流的Linux系统怎么加临时swap吧,临时swap重启后就会失效,适合测试临时方案或者应急场景,操作也很简单,以CentOS 7/9和Ubuntu 22.04/24.04通用的方式为例:
首先得确认下当前有没有swap,用free -h命令就行,显示的Swap那一列如果全是0或者没有的话就说明没有。如果有的话想先关掉旧的临时swap再开新的,可以用swapoff /旧的swap文件路径。
然后创建一个swap文件,比如我刚才说的最多8G,那就创建8G的:
fallocate -l 8G /swapfile
不过有些云服务器的精简版系统可能没有fallocate命令,没关系,用dd命令也可以,不过dd命令速度会稍微慢一点,记得把count设对就行:
dd if=/dev/zero of=/swapfile bs=1G count=8
接下来设置swap文件的权限,这个步骤绝对不能省,如果权限不对的话系统是不会识别这个swap文件的,而且会有安全风险,权限必须设为600:
chmod 600 /swapfile

然后把这个文件格式化成swap格式:
mkswap /swapfile
最后开启swap就行:
swapon /swapfile
现在再用free -h看一下,应该就能看到Swap那一列有可用空间了。
临时的说完了,再说说永久生效的swap,适合长期做缓冲的场景,只需要在刚才临时操作的基础上,把swap文件的信息加到/etc/fstab文件里就行。这里要注意第二个避坑提醒:编辑/etc/fstab的时候一定要小心小心再小心,最好先备份一份,用cp /etc/fstab /etc/fstab.bak命令备份,编辑错了的话重启服务器会直接进不了系统的单用户模式之外的界面,新手运维很容易在这里栽跟头。
备份好之后用vi或者vim打开/etc/fstab文件,在文件的最后一行加上:
/swapfile swap swap defaults 0 0
加完之后:wq保存退出,然后用mount -a命令检查一下有没有语法错误,如果没有任何输出的话就说明没问题了,下次重启服务器swap也会自动生效。
最后再提一下,如果想调整系统使用swap的频率的话,可以修改vm.swappiness这个内核参数,默认值是60,意思是当物理内存使用到40%的时候就开始使用swap。这个参数可以根据自己的业务场景调整,比如如果是数据库服务器的话,更推荐把这个参数调小一点,比如10或者5,因为数据库更依赖物理内存的速度;如果是日常的应用服务器的话,保持默认的60或者稍微调小到30都可以。
调整临时的vm.swappiness参数用sysctl vm.swappiness=10就行,永久生效的话需要编辑/etc/sysctl.conf文件,在最后一行加上vm.swappiness=10,然后用sysctl -p命令生效。
你们在运维工作中有没有遇到过类似的内存不足或者swap配置的坑?欢迎在评论区分享你的排查经验。

评论列表 (0条):
加载更多评论 Loading...