在测试环境中,我们经常遇到这样的场景:
- 物理内存被多服务挤占,
free -h显示剩余几十 MB; - 服务进程无缘无故消失(被 OOM Killer 处决);
- SSH 连接超时,
compactd进程卡死 200+ 秒,CPU 飙到 100%。
根本原因:内存严重不足时,Linux 内核会启动一系列“自救”机制,但这些机制在无 Swap 时往往会适得其反。本文将深入解释为什么测试环境开启 Swap,并给出标准配置方案。
一、内存耗尽时,内核做了什么?
当物理内存(RAM)被占满,且没有 Swap 交换空间时,内核会按以下顺序“挣扎”:
- 内存回收(kswapd)– 尝试回收缓存/缓冲区,但回收速度跟不上分配速度。
- 内存压缩(compactd)– 尝试将碎片化的内存页“压缩”成连续的大块(为后续大页分配做准备)。
- 压缩需要大量 CPU 遍历页表,且会持有锁,导致系统响应极慢。
- 此时 SSH 守护进程(sshd)可能因 CPU 饥饿或内存分配阻塞而超时断开。
- OOM Killer 出手– 如果回收和压缩都无效,内核最后一步是“选择”一个进程杀掉,释放内存。
- OOM Killer 的评分机制(
oom_score)会优先杀掉占用内存最多、运行时间最短的进程——你的关键微服务很可能中枪。
- OOM Killer 的评分机制(
无 Swap 时,系统在“压缩”和“杀进程”之间反复横跳,服务稳定性无从谈起。
二、 Swap 能同时解决“被杀”与“被卡”
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,你会发现“莫名其妙”的故障一夜消失。