服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-19 简米科技 3,480 字 8 分钟阅读

虚拟机增加swap分区后,性能提升还是系统卡顿?swap分区设置多大合适

导读给虚拟机增加swap分区,既可能让系统变流畅,也可能让系统卡到怀疑人生,核心取决于物理内存是否真的不够用,以及swap的默认策略是否被正确调整,很多人在虚拟机内存吃紧时,第一反应就是加swap,结果往往发现系统不仅没提速,反而出现频繁的卡顿,甚至比之前更慢,这不是swap没用,而是用错了时机和方法,虚拟机加sw……

给虚拟机增加swap分区,既可能让系统变流畅,也可能让系统卡到怀疑人生,核心取决于物理内存是否真的不够用,以及swap的默认策略是否被正确调整。很多人在虚拟机内存吃紧时,第一反应就是加swap,结果往往发现系统不仅没提速,反而出现频繁的卡顿,甚至比之前更慢,这不是swap没用,而是用错了时机和方法。

虚拟机加swap后卡顿的根源:磁盘与内存的速度鸿沟

要理解为什么swap会导致卡顿,需要先搞清楚内存和磁盘的定位差异,内存是数据的高速周转区,延迟在纳秒级;而虚拟机的磁盘,无论是虚拟化出来的vmdk文件,还是直通的物理盘,本质都是机械硬盘或SSD,延迟至少是内存的上千倍。

swap交换机制的本质是“拆东墙补西墙”

swap的原理很简单:当物理内存不足时,内核把暂时不用的内存页写到磁盘上,腾出空间给活跃进程;当进程需要这些数据时,再从磁盘读回内存,这个过程对用户透明,但对性能的影响是实打实的,如果系统频繁地在内存和swap之间搬运数据,CPU大部分时间都在等待I/O,就是典型的卡顿症状。

  • 系统响应变慢:点击应用没反应,鼠标转圈圈
  • CPU使用率低但系统卡:top显示CPU空闲,但系统就是不流畅
  • io wait飙升:vmstat里wa列数值居高不下

虚拟机场景下swap性能损耗被放大

物理机加swap,读写的还是直通硬盘;虚拟机加swap,写的是宿主机上的一个文件或分区,中间多了一层虚拟化开销,行业共识认为,KVM或ESXi环境下,swap的I/O路径更长,延迟更高,因此卡顿感往往比物理机更明显,尤其当宿主机本身磁盘I/O繁忙时,虚拟机swap操作会进一步加剧整体性能劣化。

哪些场景加swap确实能提升性能?先看内存压力再动手

不是所有情况下swap都是负优化,对于内存长期处于高位压满、进程随时可能被OOM killer杀掉的虚拟机,合理配置swap反而是保命手段。

虚拟机增加swap分区后,性能提升还是系统卡顿?swap分区设置多大合适

突发性内存尖峰,swap能兜底

如果你的虚拟机运行着一个偶尔才会出现内存峰值的中小型应用,比如每月跑一次的报表任务,或者每周编译一次的内核,那么加swap非常合适,平时物理内存足够,swap永远闲置;尖峰到来时,系统把一部分冷数据推到swap,给热点应用腾出空间,整体服务不会挂掉,这种情况下你几乎感觉不到swap的存在,但它默默消解了一次宕机风险。

内存持续性不足,加swap等于慢性死亡

如果你的虚拟机运行的是常驻内存服务,比如MySQL、Elasticsearch、Java应用程序,且物理内存长期不够用,这时候加swap是典型的错误做法,原因在于,这些服务的内存配额通常按实际需求设置,swap的存在会掩盖内存压力,让进程继续运行,但性能暴跌,数据库的每次查询可能都要从磁盘读回内存页,响应时间从毫秒级变成秒级,外部表现为系统重度卡顿。

操作层面可以这么判断:先用free -h看内存使用率,如果available长期低于总内存的20%,且没有显著波动,说明物理内存硬缺陷,加swap只是饮鸩止渴,该加内存条(或调大虚拟机内存配额)而不是加swap。

怎么给虚拟机增加swap分区才不卡?关键在优先级设置

既然swap不是不能加,就不能一敲命令就完事,默认情况下,Linux内核对swap的“热情”是过高的,这导致了大量无意义的换入换出,需要手动调整swappiness参数来限制内核的交换积极性。

第一步:创建swap文件(不是分区)

对于虚拟机,用文件做swap比分区灵活,且免去重新分区的风险。

dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

命令创建一个2GB的swap文件并激活,写入/etc/fstab实现开机自动挂载:

echo "/swapfile               none               swap    sw              0 0" >> /etc/fstab

虚拟机增加swap分区后,性能提升还是系统卡顿?swap分区设置多大合适

第二步:调整swappiness,默认值是你的卡顿元凶

大多数Linux发行版默认vm.swappiness=60,这意味着内存虽然不够,但内核会积极尝试使用swap,这个值对桌面用户友好,但对生产虚拟机不合理,业界普遍建议调整为10甚至更低。

sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.conf

设置了10,代表内核尽可能少使用swap,只有物理内存极度紧张时才动用它,这一步是加swap不卡的关键操作,很多运维介绍swap教程时省略了它,导致用户加了swap反而更卡。

第三步:观察与回退

调整完用swap -s或vmstat 1观察swap in/out和si/so的变化,如果si和so长期不为0,说明swap正在高频工作,系统压力仍然很大,此时应该考虑直接提升虚拟机的物理内存配置,而不是继续加swap。

事后排查:加了swap之后系统已经卡了怎么办

如果你已经加了swap,且现在系统处于卡顿状态,第一件事不是删swap,而是确认卡顿是否由swap引起。

快速定位swap占用大户

for file in /proc//status ; do awk '/VmSwap/{size=$2} END{print size, FILENAME}' $file ; done | sort -n | tail -5

这个命令列出swap占用最高的几个进程,如果是某个业务进程如Java进程吃掉了绝大部分swap,说明业务内存需求确实超出物理内存,需要给虚拟机扩充内存,或者调整业务内存参数。

如果是很多进程分散占用swap,且si/so持续大于0,说明系统处于颠簸状态(thrashing),这会直接导致卡顿,临时手段是把占用swap最多的进程手动重启或kill,等业务低峰期再动态调整内存。

动态移除swap文件,给虚拟机“降压”

如果确认swap弊大于利,可以安全卸载:

swapoff /swapfile
rm -f /swapfile

注意执行swapoff时,系统会把当前swap里的数据全部读回内存,如果物理内存依旧紧张,这一过程会加重卡顿,甚至有死机风险,建议先停止部分服务,或临时增加内存后,再进行移除操作。

虚拟机增加swap分区后,性能提升还是系统卡顿?swap分区设置多大合适

一个更好的替代方案:在宿主机层面调整内存分配

对于虚拟机swap卡顿,很多时候是宿主机资源分配策略不合理导致,如果你的环境是VMware vSphere或KVM,优先考虑给虚拟机预留足够内存,而不是靠guest内部swap救急。

虚拟化平台可以开启内存气球(memory ballooning)功能,让宿主机动态回收空闲内存分配给需要的虚拟机,但这套机制本身也有性能损耗,生产环境通常建议关闭ballooning,直接采用固定内存分配,这样做能显著减少虚拟机内部的swap使用频率,也让性能更可预测。

Q&A:关于虚拟机swap的常见疑问

虚拟机内存不够用加swap有用吗?

短期应急有一定作用,能避免服务因OOM被直接杀死,但如果你期待加完swap后性能与增加内存等同,是不现实的,swap的性能极限由磁盘速度决定,即便采用NVMe磁盘,和内存带宽仍有代差,因此用途上,swap适合兜底,不适合满足主要内存需求。

为什么我的虚拟机加了swap之后反而变卡了?

绝大多数原因是swappiness参数保持默认的60,内核倾向于主动交换出内存页,导致频繁磁盘读写,另一个原因是磁盘本身已处于较高负载,swap操作加剧了I/O竞争,建议按上面步骤调低swappiness并观察I/O等待指标,如果卡顿持续,说明物理内存缺口过大,删掉swap并升级内存。

SSD云服务器和机械硬盘虚拟机加swap的差异大吗?

差异很大,SSD的随机读写延迟通常在0.1-0.2ms,机械硬盘则要10ms以上,差距接近百倍,酷番云、简米云这类云服务器普遍采用SSD存储,加swap后效果还能接受;但本地机械硬盘的虚拟机,swap触发时的卡顿感会非常明显,几乎不可用,地域上,国内云厂商的CPU绑定实例和不绑定实例性能差异也很大,但swap方面的核心瓶颈始终在存储层。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱