在云服务器中,是否开启 swap 交换分区取决于内存负载与业务特性,通常建议内存充足时关闭以提升性能,内存紧张时适量开启作为应急缓冲,但不应依赖 swap 替代物理内存扩展。
不少初次接触云服务器的用户,面对系统默认的 swap 配置,常常拿不准是该保留还是禁掉,这个问题的答案并不绝对,因为 swap 在物理机时代是内存不足的救星,但到了云环境里,它却可能成为拖累磁盘 I/O 的隐形杀手,下面从实际场景出发,拆解 swap 的取舍逻辑和具体操作。
云服务器 swap 开启还是关闭?不同场景下的选择
swap 的本质是用磁盘空间模拟内存,当物理内存不够时,系统会把不活跃的内存页换到磁盘上,腾出空间给活跃进程,在云服务器上,磁盘通常是云盘,性能远低于本地 SSD,而且云盘的 IOPS 和带宽都有上限,swap 频繁读写,会直接拉高磁盘延迟,进而影响整体应用响应速度。
内存充足时:关闭 swap 更稳妥
如果你的云服务器内存使用率常年低于 70%,且业务没有突发高峰,直接关闭 swap 是最干净的做法,系统不会因为内核触发 swap 而浪费 CPU 资源在换入换出上,磁盘 I/O 也能完全留给业务日志、数据库读写等核心操作,多数云厂商在默认镜像里已经把 swap 关掉了,正是基于这个考虑。
具体操作:
- 查看当前 swap 状态:
free -h或swapon --show。 - 临时关闭:
swapoff -a。 - 永久关闭:编辑
/etc/fstab,找到包含 swap 的行,整行注释掉或删除,然后重启或swapoff -a生效。
内存紧张时:swap 可以作为应急手段
如果应用长期占用 80% 以上内存,或者你跑的是低配实例(1GB、2GB 内存),又想临时应付峰值流量,适当开启 swap 能避免 OOM(内存溢出)导致进程被系统杀掉。行业共识认为,在这类场景下 swap 可以充当最后的保险丝,但必须控制其大小和利用频率。

建议:
- swap 大小设置为物理内存的 1 到 2 倍,但不要超过 4GB,否则磁盘空间浪费大且换入换出效率急剧下降。
- 调整
swappiness参数,控制内核使用 swap 的积极程度,默认值 60,在云服务器上建议降到 10 或 0,只有当内存真的快耗尽时才触发 swap。
设置方法:
echo 10 > /proc/sys/vm/swappiness
要永久生效,在 /etc/sysctl.conf 中添加 vm.swappiness=10。
数据库等高性能场景:swap 能避则避
数据库(MySQL、PostgreSQL、Redis)对内存和磁盘 I/O 极其敏感,swap 一旦被触发,数据页的换入换出会导致查询延迟从毫秒级飙到秒级。业内专家指出,在数据库实例上开启 swap 几乎等同于主动降级性能,如果你遇到数据库响应变慢,先检查 swap 使用情况,很可能就是 swap 在搞鬼。
对于这类场景,正确做法是:
- 根据业务峰值预留足够内存,或使用云厂商的弹性伸缩服务自动扩容。
- 如果预算有限,可以关闭 swap 并调整
vm.overcommit_memory为 2,严格控制内存分配,避免过度申请导致 OOM。
云服务器内存不足怎么办?试试 swap 之外的这些方法
当内存持续告警,靠 swap 只能治标不治本,更合理的思路是优化应用或调整资源,这也是很多人在百度搜索“云服务器内存不足怎么办”时真正想找的答案。
升级实例规格
最直接的方案是升级云服务器配置,增加内存容量,现在国内主流云厂商(简米云、酷番云、华为云)都支持在线升级,停机几分钟即可完成,无需迁移数据,虽然涉及额外费用,但相比业务中断的损失,这点投入往往是值得的。
优化应用内存占用
- 检查是否存在内存泄漏:用
top或ps aux --sort=-%mem找到高内存进程,结合业务日志处理。 - 调整数据库缓存参数:MySQL 的
innodb_buffer_pool_size,建议设为物理内存的 60%-70%,留出余量给系统。 - 减少不必要的缓存:有些应用内置了重复缓存,清理后内存占用明显下降。

使用云服务商的弹性内存方案
部分云厂商提供内存增强型实例,或支持开启内存超分(如容器场景),如果你用的是 KVM 架构的云服务器,还可以通过 virtio 驱动动态调整内存,无需重启,这些方案都比 swap 更高效,适合对性能有要求的用户。
云服务器 swap 分区大小与 swappiness 最佳实践
swap 一旦决定开启,容量和触发策略就至关重要,设置不当,轻则浪费磁盘,重则拖垮性能。
分区大小推荐
| 物理内存大小 | 建议 swap 大小 | 说明 |
|---|---|---|
| 1GB 及以下 | 1-2GB | 低配实例,用于应急,避免 OOM |
| 2GB-4GB | 2-4GB | 中等负载,建议同时调低 swappiness |
| 8GB 及以上 | 0-2GB | 内存充足,可关闭或仅设 1GB 作为保险 |
注意,云服务器上 swap 不建议超过 4GB,因为云盘 IOPS 有限,容量再大也无法有效利用,反而占用磁盘空间,如果你的业务需要频繁使用 swap,说明内存已经严重不足,应该考虑升级而不是增加 swap。
swappiness 调整策略
swappiness 取值范围 0-100,0 表示除非内存绝对不足,否则不换出;100 表示积极使用 swap,在云服务器上,推荐设置:
- 内存充足:设置为 0 或 1,完全避免 swap 干扰。
- 内存紧张:设置为 10-20,让内核尽量用物理内存,仅在最极端时启用 swap。
- 数据库等应用:设置为 0,并配合
vm.vfs_cache_pressure=200加快缓存回收,减少内存压力。
表格对比:开启 swap 与关闭 swap 的差异
| 对比维度 | 开启 swap | 关闭 swap |
|---|---|---|
| 内存利用率 | 可支撑暂时超售,但牺牲性能 | 严格限制在物理内存内,风险是 OOM |
| 磁盘 I/O 影响 | 增加额外读写,可能拉高延迟 | 完全无影响,磁盘性能稳定 |
| 业务稳定性 | 避免进程被 OOM killer 杀死 | 内存不足时应用直接崩溃 |
| 运维复杂度 | 需监控 swap 使用量和 swappiness | 简单,只需关注内存水位 |
| 适用场景 | 低配实例、突发流量、测试环境 | 生产环境、数据库、高并发服务 |
Q&A:云服务器 swap 相关常见问题
云服务器 swap 开启后如何确认是否生效?
使用 free -h 查看 Swap 行,total 字段不为零且 used 有数值,说明 swap 已启用,同时可以用 swapon --show 查看具体设备和优先级。free -h 显示 total 为 0,表示 swap 未开启或已关闭。
云服务器 swap 分区大小设置后还能改吗?
可以,swap 是磁盘分区形式,需要重新分区并格式化,操作较麻烦,更简单的方法是使用 swap 文件,大小可以随时调整,适合云服务器场景,创建一个 swap 文件:dd if=/dev/zero of=/swapfile bs=1M count=2048(2GB),mkswap /swapfile 和 swapon /swapfile,最后写入 /etc/fstab 永久生效,修改时只需删除旧文件重新创建,无需格式化。
云服务器内存不足时,swap 和 OOM 哪个更影响业务?
OOM killer 直接杀死进程,导致服务中断,影响立竿见影,swap 则让系统变慢,但应用可能还能勉强响应,适合追求服务不中断的场合,swap 导致的性能下降如果持续过久,同样会让用户感知到超时。短期应急用 swap,长期解决靠升级内存或优化应用,这是多数云服务器运维者的共识。
