如何诊断香港Linux服务器的交换分区问题,避免内存溢出?

我是负责我们公司香港数据中心服务器运维的系统管理员。前段时间,我们遇到一个令人头疼的问题:一台关键业务的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行为进行了监控统计:

如何诊断香港Linux服务器的交换分区问题,避免内存溢出?

六、硬件层面补充建议

  • 增加物理内存比盲目依赖Swap更有效,建议业务内存高峰使用率<80%
  • 如果必须依赖Swap,建议使用**ZRAM(压缩Swap)**代替传统Swap分区,效果更佳
  • 优化磁盘IO,如使用PCIe 4.0的NVMe固态硬盘,提高Swap读写速度

Swap本质是Linux内存管理的“安全气囊”,但它并不能替代物理内存。如果不合理配置或者对进程资源无限制,很容易让这颗气囊变成“炸弹”。通过本次实战,我更深刻理解了内存调度和服务隔离的重要性。

如果你也在香港部署Linux服务器,并且业务压力较大,请务必检查你的Swap使用情况,及早干预,避免代价惨重的内存雪崩。

未经允许不得转载:A5数据 » 如何诊断香港Linux服务器的交换分区问题,避免内存溢出?

相关文章

contact