引言:Swap 不是内存不够时的救命稻草

很多运维同学对 Swap 又爱又恨:内存不够时它能让系统"苟住",但 Swap 用多了系统又会卡成幻灯片。实际上 Swap 的正确用法远不止"应急",它还在内存回收、休眠、降低 OOM 风险等方面扮演重要角色。本文从原理讲起,覆盖 Swap 的创建、扩容、优化与监控的完整实战。

一、Swap 是什么,什么时候该用

Swap 是磁盘上的一块空间,当物理内存不足时,内核会把不活跃的内存页换出到 Swap,腾出物理内存给活跃进程。适合使用 Swap 的场景:

  • 内存较小(如 1G~2G)的云主机,防止偶发内存尖峰直接触发 OOM Kill
  • 需要支持休眠(suspend-to-disk)的服务器
  • 内存有突发性增长但均值不高的业务(如编译、批处理任务)
  • 作为 MySQL/Redis 等服务的最后一道防线(但不建议依赖)

而内存充足的机器,过度依赖 Swap 反而会因为磁盘 IO 拖慢整体性能。

二、创建 Swap 的三种方式

方式一:独立分区

mkswap /dev/sdb1swapon /dev/sdb1# 写入 fstab 永久生效echo '/dev/sdb1 swap swap defaults 0 0' >> /etc/fstab

方式二:Swap 文件(最灵活,推荐)

# 创建 2G 的 swap 文件dd if=/dev/zero of=/swapfile bs=1M count=2048chmod 600 /swapfilemkswap /swapfileswapon /swapfileecho '/swapfile none swap sw 0 0' >> /etc/fstab

注意 chmod 600 很重要:Swap 文件权限过宽会有安全风险(内核会拒绝加载或提示警告)。

方式三:云厂商控制台

部分云平台支持直接在控制台配置交换分区,原理与方式一相同,适合不想碰命令行的场景。

三、查看与监控 Swap

# 查看当前 swap 使用情况free -hswapon --show# 实时监控 swap 换入换出(si/so 两列)vmstat 1# 查看哪些进程在占用 swapfor f in /proc/*/status; do  awk '/VmSwap/{swap=$2} END{print swap, FILENAME}' $f 2>/dev/nulldone | sort -rn | head -10

vmstat 的 si(swap in)和 so(swap out)持续不为 0 时,说明系统正在频繁换页,这是性能劣化的信号,应该考虑加内存或优化应用。

四、Swap 性能调优

1. 调整 swappiness

swappiness 控制内核使用 Swap 的积极程度,范围 0~100,默认 60。值越大越积极使用 Swap:

# 查看当前值cat /proc/sys/vm/swappiness# 临时调整为 10(更倾向于保留物理内存)sysctl vm.swappiness=10# 永久生效echo 'vm.swappiness = 10' >> /etc/sysctl.confsysctl -p

数据库类服务器建议设为 1~10;桌面环境可保持默认。

2. 调整缓存压力

# vfs_cache_pressure 控制目录/索引节点缓存的回收压力,默认100sysctl vm.vfs_cache_pressure=50echo 'vm.vfs_cache_pressure = 50' >> /etc/sysctl.conf

五、Swap 常见问题与排障

  • 开机不生效:检查 /etc/fstab 写法,Swap 文件的路径和 nofail 参数是否正确
  • swap 文件权限告警chmod 600 /swapfile 后重新 swapon
  • 系统卡顿:si/so 频繁跳动说明内存真的不够,优先扩容内存而非调大 Swap
  • swap 占用高但内存空闲:检查是否有进程在长时间持有匿名页,必要时调整 swappiness
  • 关闭 swap 前先迁移swapoff -a 会把 Swap 中的数据全部写回内存,内存不足时可能失败,需谨慎操作

六、总结

Swap 是一把双刃剑:合理配置能显著提升系统的稳定性与容错能力,滥用则会拖垮性能。核心原则是:内存为主、Swap 为辅,用 swappiness 控制好"换出"的积极性,并持续用 vmstat/free 监控。掌握这些,你就能在内存告警时从容应对,而不是慌乱重启。