很多玩VPS的人都会遇到一个尴尬情况:内存不够用,但升级配置又太贵,给VPS增加SWAP,操作只需要几分钟,效果立竿见影,是低配服务器最划算的“自我救赎”,与其花钱升级套餐,不如先花五分钟把SWAP开起来应急,尤其适合预算有限的个人站长和刚开始接触服务器的新手。
为什么VPS内存不够怎么办?先从SWAP说起
我手里这台酷番云轻量服务器,2G内存,跑了Nginx、MySQL、WordPress和两个Python爬虫脚本,平时看着负载不高,但只要流量稍微上来一点,或者数据库查询慢半拍,OOM Killer就开始发威MySQL直接被系统杀掉,网站白屏,重启之后又重复这个循环,排查了大半天,日志里全是Out of memory: Kill process记录,这时候才意识到,真正的瓶颈根本不是CPU,是物理内存撞了天花板。
行业共识认为,SWAP是Linux系统里最被低估的“救命稻草”,它的本质是拿磁盘空间当内存用,把不活跃的内存数据临时挪到磁盘上,腾出物理内存给正在跑的进程,对VPS来说,这个方法尤其管用,因为大多数云厂商的内存定价都不便宜,而磁盘空间往往用不完。
当时我查了不少资料,发现不少国内用户搜索“VPS加SWAP设置步骤”时,都会扯到服务器卡顿、重启丢配置这些坑,其实只要按部就班地做完下面这几步,整个过程比我预想的要简单得多。
简单步骤为VPS增加SWAP:全程实操记录
以下操作在Ubuntu 22.04、Debian 12系统上通用,CentOS/Rocky系也能照搬,全程只需要一条SSH连接,不需要重启机器。
第一步:确认当前系统是否有SWAP
很多云服务商的默认镜像根本没开SWAP,先用这条命令确认一下:
free -h
如果你的输出里Swap那一行的total是0,那就说明这台机器处于“裸奔”状态,另外可以再用swapon --show看看是否已有swap文件存在,避免重复操作。
第二步:创建SWAP专用文件
创建一个名字叫swapfile的文件放在根目录,大小根据需求决定,我这次设置了2G,用fallocate一瞬间就能完成,比老教程里的dd命令快得多:
sudo fallocate -l 2G /swapfile
如果fallocate报错(某些老内核文件系统不支持),就退回传统写法:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
执行完可以用ls -lh /swapfile确认文件生成,看到2G的大小就说明没问题。
第三步:格式化并启用SWAP文件
先要把这个普通文件变成SWAP格式,否则系统不认:
sudo mkswap /swapfile
然后正式开启它:
sudo swapon /swapfile
这一步完成后,再跑一次free -h,就能看到Swap这一行的数字已经变了,说明SWAP已经在工作。
安全方面还差一步:这个文件里装的都是内存里的临时数据,权限必须收紧,不然有泄露风险,顺手把权限改成600(仅root可读写):
sudo chmod 600 /swapfile
第四步:写入fstab实现开机自动挂载
如果不做这一步,虚拟服务器重启之后,SWAP就自动失效了,前面几步全白做,用编辑器打开/etc/fstab,在末尾追加一行:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
执行完成可以再复查一遍:
cat /etc/fstab
看到文件末尾有上面那一行,就说明开机自启已经配置好了,这里最容易踩的坑就是漏掉这一步,很多人“重启之后内存又满了怎么办”的焦虑,基本都是这个原因。
第五步:调整swappiness换页策略参数
swappiness是Linux内核用来决定“多积极使用SWAP”的参数,取值范围从0到100,默认值通常是60,这个数值在内存不太够用的时候会稍微激进了一点,导致磁盘读写变多,系统响应发沉,做服务器的时候,我建议把它调低到10到30之间,尽量优先使用物理内存:
sudo sysctl vm.swappiness=10
这只是临时生效,永久生效需要写入配置文件:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
如果是宝塔面板用户,在“Linux工具箱”里可以找到一个“Swap”管理项,它的逻辑是让你填一个数字然后点一下按钮完事,方便是方便,但底层做的事情和上面这些命令一模一样,手动操作的好处是每一步都可见、可回滚,出问题也知道卡在哪。
SWAP设置多少合适?不同VPS配置的参考值
给VPS配SWAP,不是配得越大越好,SWAP太大会导致系统频繁读磁盘,速度反而比没有更难受,根据我自己的折腾经验以及网上不少运维同行的分享,不同物理内存的参考配置大概是这样:
| 物理内存大小 | 推荐SWAP大小 | 适用场景 |
|---|---|---|
| 512MB | 1G至2G | 单站点博客、轻量API服务 |
| 1G | 1G至2G | 个人网站、小型论坛(Discuz/WordPress) |
| 2G | 2G至3G | 跑MySQL+Web服务,低流量生产环境 |
| 4G及以上 | 2G至4G | 如果资源还紧张,优先加内存而不是堆SWAP |
这套组合的逻辑很简单:SWAP是航道,不是停车场,小内存机器可以通过SWAP避免进程被杀,但它的边际效应很明显一旦系统实际使用的内存超过物理内存很多倍,SWAP不但救不了场,反而会拖垮IO,如果你做的是数据库这类吃内存的重活,与其加SWAP,不如考虑升级物理内存。
具体怎么在两个变量之间取舍,这里还有一条经验:如果你的VPS跑的是低延迟应用(比如API服务),SWAP只是兜底,别指望它替代内存;如果是当备份机、测试机用,SWAP可以放开一点,毕竟便宜量又足。
SWAP会拖垮硬盘吗?真实使用后的性能感受
这是很多人在“要不要给VPS加SWAP”上纠结最多的问题,先说结论:磁盘确实会多出读写消耗,但没有传闻中的那么夸张,尤其是现代VPS大多用的是SSD,随机读写性能比老式机械盘强了不少,业内专家指出,只要不是把SWAP当物理内存用、让系统持续大量换页,带来的IO损耗是在云服务器可接受范围内的。
我的这台酷番云轻量服务器,在开启SWAP之后,用vmstat观察了三天,si(从磁盘交换入内存)和so(从内存交换出磁盘)的值大部分时间都很小,只有在跑apt update或者编译小项目时才会看到明显的换页活动,日常跑Nginx和PHP-FPM,几乎感受不到存在。
真正需要担心的是那些本身磁盘IO就非常局促的超低配VPS,比如某些单核512M的入门机型,连基础运行都卡,这时候强行加一个4G的SWAP,等于给本来就窄的路又加了一辆三轮车,所以在使用这一段路径时,可以参考这个顺序:
- 先看磁盘读写性能,用
dd命令测一下缓冲写入速度,连50MB/s都不到就别折腾SWAP了。 - 优先保证swapfile所在分区剩余空间充足,根目录快满了硬挤SWAP,等于给磁盘埋雷。
- 用
iostat或atop观察IO等待值(iowait),如果长期超过10%,说明IO已经告急,这时候买内存才是正路。
关于VPS增加SWAP的常见问题与解答
问:SWAP文件和SWAP分区有什么区别?
SWAP分区是磁盘上专门划出的一块独立区域,从系统安装时就固定好了,想调整大小就得折腾分区工具,SWAP文件则只是根目录下一个普通文件,通过内核挂载模拟成内存区域,想改大小删掉重新生成就行,新一代Linux系统基本都推荐用SWAP文件,原因就是省事、不干扰原有分区布局。
问:增加SWAP之后我的VPS会变快吗?
不会,SWAP解决的是“进程不被杀掉”的问题,不是“让计算更快”的问题,如果原来的内存勉强够用,加上SWAP之后你大概率感知不到速度变化;如果原来频繁触发OOM导致进程崩溃重启,你会发现网站稳定了不少,但这是“不崩溃”带来的体验提升,不是速度提升,真实场景是,遇到内存不足时,系统把不常用的内存页挪到SWAP,后续需要时再换回来,这中间会有微小延迟,但远比进程直接被干掉要好得多。
问:我用的宝塔面板,在里面的SWAP设置里填数字就能创建吗?
能,但有几个限制,宝塔面板的SWAP功能默认写死在根目录下,如果你的根分区空间所剩不多,面板不会主动提醒你,另外面板创建SWAP时也可以设置swappiness数值,但部分老版本没有这个选项,需要自己到/etc/sysctl.conf里手动调整,从实际使用角度看,宝塔面板的SWAP设置适合赶时间的时候用,手动SSH操作则适合需要精确控制swap大小和换页策略的场景,两种方式创建出来的swap文件效果没有实质差异。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/647134.html





