【运维】Swap
2026/7/28 14:59:23 网站建设 项目流程

在测试环境中,我们经常遇到这样的场景:

  • 物理内存被多服务挤占,free -h显示剩余几十 MB;
  • 服务进程无缘无故消失(被 OOM Killer 处决);
  • SSH 连接超时,compactd进程卡死 200+ 秒,CPU 飙到 100%。

根本原因:内存严重不足时,Linux 内核会启动一系列“自救”机制,但这些机制在无 Swap 时往往会适得其反。本文将深入解释为什么测试环境开启 Swap,并给出标准配置方案。


一、内存耗尽时,内核做了什么?

当物理内存(RAM)被占满,且没有 Swap 交换空间时,内核会按以下顺序“挣扎”:

  1. 内存回收(kswapd)– 尝试回收缓存/缓冲区,但回收速度跟不上分配速度。
  2. 内存压缩(compactd)– 尝试将碎片化的内存页“压缩”成连续的大块(为后续大页分配做准备)。
    • 压缩需要大量 CPU 遍历页表,且会持有锁,导致系统响应极慢。
    • 此时 SSH 守护进程(sshd)可能因 CPU 饥饿或内存分配阻塞而超时断开。
  3. OOM Killer 出手– 如果回收和压缩都无效,内核最后一步是“选择”一个进程杀掉,释放内存。
    • OOM Killer 的评分机制(oom_score)会优先杀掉占用内存最多、运行时间最短的进程——你的关键微服务很可能中枪

无 Swap 时,系统在“压缩”和“杀进程”之间反复横跳,服务稳定性无从谈起。


二、 Swap 能同时解决“被杀”与“被卡”

物理内存紧张

是否启用 Swap?

kswapd 回收 cache

内存仍不足

compactd 高频压缩

CPU 飙升 & 锁争用

SSH 超时 / 服务假死

OOM Killer 随机杀进程

内核将不活跃页换出到 Swap

释放连续物理内存块

compactd 压力骤降

系统响应恢复

OOM Killer 不再触发

2.1 防 OOM Killer:提供“缓冲垫”

Swap 相当于内存的“溢出仓库”。当 RAM 吃紧时,内核优先将不常访问的冷数据(如后台日志缓冲区、闲置服务的堆内存)换出到磁盘。这降低了内存压力峰值,让 OOM Killer 几乎没有机会触发,从而保住所有运行中的服务。

2.2 防 compactd 假死:瞬间释放连续空间

内存压缩(compactd)之所以耗时,是因为它需要移动已分配的页来“拼出”大块连续区域。Swap 换出操作能直接整页回收,腾出大量连续空闲页,内核不再需要费力压缩。实测中,开启 Swap 后compactd的 CPU 占用从 80% 降至 <5%,SSH 响应立即恢复。


三、Swap 的另一个隐性价值:把物理内存留给“热点”应用

在微服务环境中,大量服务会写入日志、缓存历史数据,这些数据访问频率很低。如果它们全挤在 RAM 中,真正高频使用的业务堆内存反而无处安放。

内存类型无 Swap(RAM 100%占用)有 Swap(RAM 70% + Swap 30%)
热点应用堆频繁被换出/回收,GC 压力大常驻 RAM,性能稳定
冷数据(日志、历史缓存)占用大量 RAM自动换出到 Swap,不争抢资源
系统缓存紧张充裕

Swap 就像“内存分级存储”:热数据走 RAM,冷数据走 Swap,让有限的内存用在刀刃上。


四、一键创建 2GB Swap

以下命令在 CentOS/Ubuntu 通用(推荐 2~4GB,视剩余磁盘而定):

# 1. 创建 2GB 空文件sudofallocate-l2G /swapfile# 2. 设置严格权限(防止普通用户读取)sudochmod600/swapfile# 3. 格式化为 swap 分区sudomkswap/swapfile# 4. 启用 swapsudoswapon/swapfile# 5. 开机自动挂载echo'/swapfile none swap sw 0 0'|sudotee-a/etc/fstab# 6. 调低 Swap 倾向(优先使用物理内存,避免过度依赖磁盘)sudosysctlvm.swappiness=10echo'vm.swappiness=10'|sudotee-a/etc/sysctl.conf

vm.swappiness=10的含义:取值范围 0~100,值越大越积极使用 Swap。设为 10 表示仅在 RAM 使用超过 90% 时才换出,优先压榨物理内存,同时保留 Swap 作为“紧急避难所”。

完成后执行free -h,若 Swap 行显示2.0G即成功。


五、最后

  • Swap 是备胎,不是主力:就像汽车备胎,平时用不上,但爆胎时能让你开到修理厂。测试环境不会承受生产级流量,Swap 的磁盘 I/O 影响完全可以接受。
  • 监控 Swap 使用率:若free -h发现 Swap 使用率长期 >50%,说明物理内存确实不足。此时应增加 RAM 或优化服务内存占用,而非无限扩大 Swap(过度依赖 Swap 会导致性能雪崩)。
  • 生产环境慎用:生产环境若依赖 Swap 来“续命”,往往掩盖了内存配置问题,且磁盘 I/O 延迟会直接拖慢响应。测试环境则完全不同——稳定第一,性能第二

小结:小内存服务器,Swap 不该是可选项,而是默认配置。给测试环境加上 2~4G Swap,你会发现“莫名其妙”的故障一夜消失。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询