引言: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 监控。掌握这些,你就能在内存告警时从容应对,而不是慌乱重启。
评论