我是负责我们公司香港数据中心服务器运维的系统管理员。前段时间,我们遇到一个令人头疼的问题:一台关键业务的Linux服务器在业务高峰时段频繁出现响应变慢甚至服务中断的情况。深入排查后,发现元凶居然是Swap(交换分区)滥用导致的内存溢出。今天我就来分享一下这次排障的过程,带大家一步一步深入理解 如何诊断和解决Linux服务器的Swap问题,避免内存雪崩。
一、问题背景
这台服务器配置如下:
- 型号:Dell PowerEdge R750
- CPU:2x Intel Xeon Gold 6338 (32核心64线程)
- 内存:256GB DDR4 ECC
- 磁盘:2x NVMe SSD(RAID 1)
- 系统:CentOS 7.9
- 业务:Nginx + PHP-FPM + Redis + MySQL,主要承载API接口与支付系统
- 部署位置:香港沙田数据中心
问题现象:
- 系统负载在高并发时突然飙升
- top 中看到大量进程处于 D(不可中断IO)状态
- swap使用率高达95%,而物理内存只使用了不到70%
- Redis频繁被OOM killer干掉
- dmesg 报错:Out of memory: Kill process …
二、为什么Swap会被过度使用?
Linux的内存管理默认是允许把“最近不活跃”的内存页交换到磁盘的Swap区域,以释放物理内存。但是,如果内存充足而系统仍频繁使用Swap,就说明:
- Swappiness值设置不合理
- 某些进程存在内存泄漏或频繁调用内存页
- 磁盘IO能力不足,Swap访问阻塞整个系统
- 服务未进行资源限制,Swap成为“内存缓冲池”
三、如何一步步诊断Swap异常使用
1. 查看当前Swap使用情况
free -m
示例输出:
total used free shared buff/cache available
Mem: 257837 182512 39284 1341 36040 68829
Swap: 16384 15600 784
Swap用了15GB,明显过多。
2. 检查哪些进程最耗Swap
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
if [ -r /proc/$pid/status ]; then
awk '/VmSwap/ { print $2 " KB\tPID=" '$pid' "\t" }' /proc/$pid/status
fi
done | sort -nr | head -20
输出中我们发现Redis和PHP-FPM进程占用了大量Swap。
3. 查看swappiness设置
cat /proc/sys/vm/swappiness
默认是60,这意味着系统在物理内存使用达到40%时就开始主动使用Swap。
四、解决方案与实操步骤
步骤1:优化Swappiness值
将swappiness调整为10,让系统尽量使用物理内存。
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
步骤2:设置服务内存上限(尤其是Redis和PHP)
Redis配置:
maxmemory 4gb
maxmemory-policy allkeys-lru
PHP-FPM配置(/etc/php-fpm.d/www.conf):
pm.max_children = 80
pm.max_requests = 500
限制防止内存泄漏无限累积。
步骤3:启用cgroups进行资源隔离
使用systemd的cgroup限制服务的最大内存:
systemctl set-property redis.service MemoryLimit=5G
systemctl set-property php-fpm.service MemoryLimit=12G
步骤4:迁移部分服务,减轻主机负载
我们将部分高IO服务(如日志收集)迁移到另一台存储优化型服务器(HPE ProLiant DL385 + 10TB SATA阵列),避免磁盘IO争用导致Swap延迟。
五、效果评估与数据对比
优化前后,我们对系统内存使用和Swap行为进行了监控统计:

六、硬件层面补充建议
- 增加物理内存比盲目依赖Swap更有效,建议业务内存高峰使用率<80%
- 如果必须依赖Swap,建议使用**ZRAM(压缩Swap)**代替传统Swap分区,效果更佳
- 优化磁盘IO,如使用PCIe 4.0的NVMe固态硬盘,提高Swap读写速度
Swap本质是Linux内存管理的“安全气囊”,但它并不能替代物理内存。如果不合理配置或者对进程资源无限制,很容易让这颗气囊变成“炸弹”。通过本次实战,我更深刻理解了内存调度和服务隔离的重要性。
如果你也在香港部署Linux服务器,并且业务压力较大,请务必检查你的Swap使用情况,及早干预,避免代价惨重的内存雪崩。











