生产环境 Linux 内存告急?手把手教你配置 Swap 交换分区,彻底告别 OOM 崩溃

一、直面核心:为什么你的服务器总是在深夜宕机?

💡 推荐阅读:Nginx 开启 Gzip 后带宽没降反升?关于压缩配置的坑与实战,看这篇就够了

作为站长,最怕的就是半夜被监控告警吵醒,登录服务器一看,SSH 都卡成幻灯片,最后只能强制重启。大多数情况下,罪魁祸首就是 物理内存(RAM)耗尽,触发了 Linux 内核的 OOM Killer(内存溢出杀手)。内核为了自救,会强制杀掉占用内存最高的进程,如果你的数据库或 Web 服务进程被杀,就是一次妥妥的事故。

很多人对 Swap 有误解,觉得它慢,不如不加。但在生产环境中,Swap 是系统稳定性的最后一道防线。它不应该是用来替代内存的,而是作为 内存的溢出缓冲区,给系统一个“喘息”的机会,避免瞬间的流量尖峰直接触发 OOM。

二、生产环境架构规范:先搞懂 Swap 的工作原理和评判标准

🔥 【限时特惠福利】高性价比独享云服务器限时 1 折起

搭建网站或部署容器推荐选择高稳定性独享云服务器。限时特惠通道开放中,点击即可领取专属满减代金券与特惠折扣:

👉 立刻领取云服务器限时优惠券

💡 延伸阅读:还在用密码登录服务器?手把手教你 SSH 密钥配置与密码禁用全攻略(附安全方案横评)

Swap(交换分区)本质上是磁盘上划分的一块空间,当物理内存不足时,内核会将暂时不活跃的内存数据页(Page)挪到 Swap 上,释放物理内存给当前急需的进程。当物理内存空闲时,再把数据换回来。

这里有一个关键参数:swappiness。它控制了内核使用 Swap 的积极程度,取值范围 0-100。

  • 值越低(如 10):倾向于尽量使用物理内存,减少磁盘 I/O,适合性能敏感型应用(如 MySQL、Redis)。
  • 值越高(如 60):内核会更积极地使用 Swap,适合内存压力极大的场景。

在配置前,我们需要先查看当前系统状态:

# 查看当前内存和 Swap 使用情况
free -h

# 查看 swappiness 当前值
cat /proc/sys/vm/swappiness

三、性能与安全加固调优清单:从零配置 Swap 文件(推荐)

💡 深度技术指南:云服务器突然连不上?多半是安全组和防火墙在“打架”,这份排查实操指南请收好

生产环境强烈推荐使用 Swap 文件 而非独立分区。因为文件大小可以随时调整,不需要重新分区,非常灵活。

步骤 1:创建 Swap 文件

我们创建一个 4G 的 Swap 文件(请根据你的服务器实际内存大小调整,一般建议为物理内存的 1-2 倍,但若内存超过 16G,可适当降低比例)。

# 使用 dd 命令创建文件,bs=1M 表示块大小,count=4096 表示 4096 块,即 4G
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

# 如果磁盘支持,推荐使用 fallocate 命令,速度更快
# sudo fallocate -l 4G /swapfile

步骤 2:设置正确的文件权限

安全红线:Swap 文件中可能残留敏感内存数据,必须设置为仅 root 可读写,否则会有信息泄露风险。

# 设置权限为 600,仅 root 可读写
sudo chmod 600 /swapfile

步骤 3:格式化为 Swap 文件系统

# 使用 mkswap 命令将文件初始化为交换分区格式
sudo mkswap /swapfile

步骤 4:启用 Swap 文件

# 立即启用该交换文件
sudo swapon /swapfile

# 验证是否生效
sudo swapon --show
# 或者查看 free -h,确认 Swap 区域已有空间

步骤 5:设置开机自动挂载(关键步骤)

如果不写入 fstab,重启后 Swap 就会失效,前面的工作就白做了。

# 备份 fstab 文件
sudo cp /etc/fstab /etc/fstab.bak

# 将挂载信息写入 fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

步骤 6:调优 swappiness 参数

对于数据库或高并发 Web 服务,建议降低 swappiness 值,避免频繁的磁盘交换影响性能。

# 临时生效,设置为 10
sudo sysctl vm.swappiness=10

# 永久生效,写入配置文件
echo 'vm.swappiness = 10' | sudo tee -a /etc/sysctl.conf

# 立即生效
sudo sysctl -p

步骤 7:调整缓存压力参数(进阶优化)

同时,建议调整 vfs_cache_pressure 参数,该值控制内核回收目录和 inode 缓存(dentry/inode)的倾向性。默认值为 100,调低至 50 可以延长缓存的生命周期,提升文件访问性能。

# 临时生效
sudo sysctl vm.vfs_cache_pressure=50

# 永久生效
echo 'vm.vfs_cache_pressure = 50' | sudo tee -a /etc/sysctl.conf

四、验证测试与 SOP 总结:确保高可用

配置完成后,必须进行压力测试,确保 Swap 真的能扛住压力。

验证测试方案

# 使用 stress 工具模拟内存压力(如未安装:sudo apt install stress 或 yum install stress)
# 开启 4 个进程,每个占用 1G 内存,持续 60 秒
sudo stress --vm 4 --vm-bytes 1024M --vm-hang 60 --timeout 60s

# 在另一个终端观察内存变化
watch -n 1 free -h

观察到的现象应该是:物理内存使用率接近 100% 时,Swap 的使用率开始逐渐上升,而系统并没有直接杀掉 stress 进程,说明 Swap 生效了。

生产环境运维 SOP 建议

检查项 操作命令 频率
Swap 使用率 free -h 每日巡检
内存页换入换出 vmstat 1 5(观察 si 和 so 列) 故障时排查
OOM 记录 dmesg | grep -i oomjournalctl -k | grep -i oom 故障时排查

SOP 要点:如果发现 Swap 使用率长期超过 50% 或者 si/so 数值持续很高,说明物理内存已经严重不足,扩容内存或优化应用才是根本解决之道,Swap 只是应急缓冲,不是长久之计。

最后,笔者想多说一句,很多朋友在配置完 Swap 后依然会遇到卡顿,这时候不妨检查一下云服务商的磁盘类型。如果用的是普通 HDD 云盘,Swap 的读写速度会严重拖累性能;有条件的话,选择 NVMe SSD 云盘或高性能云服务器,会让 Swap 的交换效率提升数倍。在选购服务器时,不要只盯着 CPU 核数,内存大小和磁盘类型同样决定了业务的天花板。毕竟,一套配置得当、运行稳定的服务器,才是业务长期发展的基石。

相关技术专题与延伸阅读

📦 【资源免费领】本文全套实操配置文件与避坑手册下载

本文涉及的全套 Docker Compose 配置文件、服务器运维避坑清单及 AI 提效指令库已完整打包,可免费极速转存:

👉 点击前往夸克网盘免费极速转存(手机端领 1TB 空间)

💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。

滚动至顶部