磁盘I/O性能瓶颈与服务器负载过高排查实战:DELL PERC H330 Mini RAID卡性能优化全记录
一、问题与症状
1.1 性能问题突显
这一是台生产服务器,业务开发人员反应系统经常报超时错误,遂使用top 命令查看发现服务器负载高平均在8 左右,峰值达到30。执行一条ls ll top等常用命令都卡顿。
top命令 按1 查看每个cpu 发现占用都不高,最高才10%,大量的cpu处理于空闲。
于是猜测是IO导致 或 CPU上下文频繁切换
1.2 关键症状表现
通过iostat -dx 1
命令捕获到以下严重问题:
bash
[root@localhost ~]# iostat -dx 1
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2025年10月14日 x86_64 (80 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.65 1.60 6.69 73.67 42.99 1754.65 44.74 0.03 0.33 10.07 3.29 1.50 12.08 dm-0 0.00 0.00 0.07 0.13 4.44 0.90 53.33 0.00 22.98 8.77 31.16 10.18 0.20 dm-1 0.00 0.00 6.82 6.87 27.28 27.47 8.00 0.26 18.75 10.30 27.13 2.93 4.01 dm-2 0.00 0.00 0.45 68.28 11.27 1726.29 50.56 0.15 2.13 7.37 2.10 1.34 9.24 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 34.00 0.00 640.00 37.65 0.08 2.38 0.00 2.38 1.74 5.90 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 34.00 0.00 640.00 37.65 0.08 2.38 0.00 2.38 1.71 5.80 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 27.00 0.00 640.00 47.41 0.14 5.00 0.00 5.00 3.26 8.80 dm-0 0.00 0.00 0.00 3.00 0.00 12.00 8.00 0.03 9.00 0.00 9.00 5.00 1.50 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 24.00 0.00 628.00 52.33 0.11 4.46 0.00 4.46 3.21 7.70 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 2.00 196.00 8.00 6520.00 65.94 0.98 4.96 5.50 4.95 0.35 6.90 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 2.00 0.00 8.00 0.00 8.00 0.01 5.50 5.50 0.00 5.50 1.10 dm-2 0.00 0.00 0.00 196.00 0.00 6520.00 66.53 0.97 4.95 0.00 4.95 0.31 6.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 63.00 0.00 2068.00 65.65 1.53 24.33 0.00 24.33 2.35 14.80 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 63.00 0.00 2068.00 65.65 1.53 24.35 0.00 24.35 2.37 14.90 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 1.00 120.00 4.00 1276.00 21.16 0.33 2.70 5.00 2.68 1.91 23.10 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 1.00 0.00 4.00 0.00 8.00 0.01 5.00 5.00 0.00 5.00 0.50 dm-2 0.00 0.00 0.00 120.00 0.00 1276.00 21.27 0.32 2.67 0.00 2.67 1.90 22.80 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 268.00 0.00 3036.00 22.66 15.90 59.31 0.00 59.31 1.60 43.00 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 268.00 0.00 3036.00 22.66 15.89 59.31 0.00 59.31 1.60 42.80 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 21.00 0.00 536.00 51.05 0.05 2.24 0.00 2.24 2.00 4.20 dm-0 0.00 0.00 0.00 2.00 0.00 8.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 19.00 0.00 528.00 55.58 0.05 2.47 0.00 2.47 2.21 4.20 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 8.00 80.00 32.00 2808.00 64.55 0.60 6.83 8.00 6.71 1.12 9.90 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 8.00 0.00 32.00 0.00 8.00 0.06 8.00 8.00 0.00 8.00 6.40 dm-2 0.00 0.00 0.00 80.00 0.00 2808.00 70.20 0.54 6.70 0.00 6.70 0.49 3.90 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 53.00 0.00 456.00 17.21 1.24 23.38 0.00 23.38 2.25 11.90 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 53.00 0.00 456.00 17.21 1.24 23.38 0.00 23.38 2.25 11.90 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 74.00 0.00 1304.00 35.24 0.17 2.32 0.00 2.32 2.19 16.20 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 74.00 0.00 1304.00 35.24 0.17 2.30 0.00 2.30 2.16 16.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 30.00 0.00 948.00 63.20 0.04 1.50 0.00 1.50 1.27 3.80 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-2 0.00 0.00 0.00 30.00 0.00 948.00 63.20 0.04 1.50 0.00 1.50 1.27 3.80
发现灾难性指标:
-
磁盘利用率100% :
%util
指标达到100.30%,磁盘完全饱和 -
严重队列堆积 :
avgqu-sz
队列长度高达146-148,正常值应小于5 -
响应时间恶化 :
await
等待时间从正常值<10ms恶化到260+ms -
写入压力巨大 :
w/s
达到852次/秒,且为小文件写入模式
具体性能数据对比:
性能指标 | 正常范围 | 实际观测值 | 严重程度 |
---|---|---|---|
%util | < 70% | 100.30% | 🔴 严重 |
avgqu-sz | < 5 | 146-148 | 🔴 严重 |
await | < 20ms | 160-263ms | 🔴 严重 |
avgrq-sz | 16-64 | 8.00-8.25 | 🟡 警告 |
以下是 iostat -dx 1
命令输出各列详细解释的表格:
名称 | 含义 | 解释 | 正常值 |
---|---|---|---|
rrqm/s | 每秒合并的读请求数 | 操作系统将多个相邻读请求合并为一个以提高效率 | 通常较低,高值表示读请求碎片化 |
wrqm/s | 每秒合并的写请求数 | 写请求合并机制,提高写入效率 | 根据工作负载变化,通常比rrqm/s高 |
r/s | 每秒完成的读请求数 | 读IOPS(每秒读I/O操作数) | SSD:数千,HDD:通常几百 |
w/s | 每秒完成的写请求数 | 写IOPS(每秒写I/O操作数) | 依赖磁盘类型和工作负载 |
rkB/s | 每秒读取数据量(KB) | 读吞吐量,计算公式:(读取扇区数×扇区大小)/1024 | 依赖磁盘带宽和业务需求 |
wkB/s | 每秒写入数据量(KB) | 写吞吐量,重要的性能监控指标 | 依赖磁盘带宽和业务需求 |
avgrq-sz | 平均请求大小(扇区) | 每个I/O请求的平均大小,反映I/O模式 | 小值(<16):小文件I/O;大值(>32):顺序大文件I/O |
avgqu-sz | 平均队列长度 | 等待处理的I/O请求数量 | <1:良好;1-5:轻度排队;>5:严重排队;>10:紧急问题 |
await | 平均I/O响应时间(ms) | 每个I/O请求的平均处理时间(排队+服务) | <10ms:优秀;10-20ms:良好;20-50ms:警告;>50ms:严重问题 |
r_await | 读请求平均响应时间(ms) | 读请求的平均处理时间 | 关注读操作性能,标准同await |
w_await | 写请求平均响应时间(ms) | 写请求的平均处理时间 | 通常比读操作慢,标准同await |
svctm | 平均服务时间(ms) | 磁盘完成一个I/O请求所需时间(不含排队) | SSD:0.1-2ms;HDD:2-10ms(新内核中可能不准确) |
%util | 设备利用率百分比 | 磁盘处理I/O的时间占比 | <50%:良好;50%-70%:警告;70%-100%:瓶颈;100%:完全饱和 |
性能诊断黄金三角:
-
%util > 70% → 设备繁忙
-
avgqu-sz > 5 → 请求排队
-
await > 20ms → 响应缓慢
工作负载特征指标:
-
r/s + w/s → I/O压力大小
-
avgrq-sz → I/O模式(随机/顺序)
-
rkB/s + wkB/s → 数据传输量
这个表格提供了完整的磁盘I/O性能监控指标体系,帮助快速定位和解决性能瓶颈问题
1.3 系统环境信息
-
操作系统:CentOS 7.9
-
内核版本:3.10.0-1160.el7.x86_64
-
RAID卡:DELL PERC H330 Mini
-
CPU:80 cpus Intel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz
-
磁盘容量:3.99TB
-
文件系统:XFS + FAT
二、IO分析过程
2.1 初步排查与定位
首先使用基础命令进行问题定位:
bash
# 查看磁盘设备信息
lsscsi -s
[0:2:0:0] disk DELL PERC H330 Mini 4.30 /dev/sda 3.99TB
# 检查系统日志
dmesg | grep -i sda
关键发现:
-
磁盘写入缓存被禁用:
Write cache: disabled, read cache: disabled
-
FAT文件系统未正常卸载,可能存在文件系统损坏
-
设备通过DELL PERC H330 Mini RAID卡管理
2.2 深入性能分析
通过iostat -dx
详细指标分析,发现以下问题特征:
I/O模式分析:
-
写入密集型负载,读写比例严重失衡
-
大量小文件写入(avgrq-sz = 8KB)
-
设备映射层dm-1和dm-2承担主要压力
瓶颈定位:
-
物理磁盘sda利用率100%
-
设备映射dm-1的写入IOPS达到854次/秒
-
设备映射dm-2的响应时间达到379ms
2.3 根本原因推断
基于性能数据和工作负载特征,推断可能的原因:
-
硬件层面:RAID卡无缓存 + 磁盘缓存禁用
-
应用层面:大量小文件持续写入,可能是数据库事务或日志写入
-
配置层面:系统I/O参数未优化,缺乏必要的缓存机制
2.4 RAID卡特性分析
DELL PERC H330 Mini的关键特性:
特性 | 规格 | 对性能的影响 |
---|---|---|
控制器级别 | 入门级硬件RAID | 功能有限 |
板载缓存 | 无 | 写入性能受限 |
支持RAID级别 | 0,1,5,10 | 灵活性一般 |
缓存策略 | 默认Write-Through | 数据安全优先 |
三、IO处理过程
3.1 缓存启用尝试
deepseek推荐使用smartctl:
bash
smartctl -s wcache,on /dev/sda
结果:Smartctl open device: /dev/sda failed: DELL or MegaRaid controller, please try adding '-d megaraid,N'
smartctl -d scsi -i /dev/sda
SMART support is: Unavailable - device lacks SMART capability.
发现:
-
DELL PERC H330 Mini虚拟化的磁盘不支持SMART功能
-
无法通过smartctl管理磁盘缓存
-
需要在RAID卡层面或操作系统层面进行优化
只能使用 MegaCli 命令 (需要安装 下载连接 https://docs.broadcom.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/8-07-14_MegaCLI.zip)
3.3 系统层面优化实施
服务器RAID控制器没有安装电池备份模块(BBU)既然无法在硬件层面启用缓存,转向系统级优化:
开启磁盘缓存(关键命令)
./MegaCli64 -LDSetProp -EnDskCache -Lall -aALL
执行以下命令,确认 "Disk Write Cache " 的状态已变为 "Enable":
./MegaCli64 -LDGetProp -DskCache -LALL -aALL
3.4 验证
执行完上述命令后,IO性能得到了解决:
bash
[root@localhost ~]# iostat -dx 1
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2025年10月16日 x86_64 (80 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.65 1.60 6.76 73.88 43.30 1757.74 44.67 0.06 0.79 10.05 3.72 1.51 12.15
dm-0 0.00 0.00 0.07 0.13 4.47 0.92 52.59 0.00 22.72 8.73 30.56 10.07 0.21
dm-1 0.00 0.00 6.87 6.90 27.49 27.58 8.00 0.28 20.00 10.30 29.67 2.95 4.06
dm-2 0.00 0.00 0.47 68.46 11.34 1729.24 50.51 0.16 2.38 7.22 2.35 1.34 9.27
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 34.00 59.00 136.00 532.00 14.37 0.27 2.88 7.09 0.46 2.77 25.80
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 33.00 0.00 132.00 0.00 8.00 0.24 7.30 7.30 0.00 7.21 23.80
dm-2 0.00 0.00 0.00 59.00 0.00 532.00 18.03 0.03 0.49 0.00 0.49 0.41 2.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 4.00 47.00 16.00 447.00 18.16 0.09 1.69 9.25 1.04 1.53 7.80
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 3.00 0.00 12.00 0.00 8.00 0.02 7.00 7.00 0.00 7.00 2.10
dm-2 0.00 0.00 1.00 47.00 4.00 447.00 18.79 0.07 1.35 16.00 1.04 1.25 6.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 8.00 22.00 32.00 356.00 25.87 0.13 4.47 11.75 1.82 4.13 12.40
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 8.00 0.00 32.00 0.00 8.00 0.09 11.75 11.75 0.00 11.75 9.40
dm-2 0.00 0.00 0.00 22.00 0.00 356.00 32.36 0.04 1.82 0.00 1.82 1.41 3.10
预期改善效果:
-
await
:从260ms+下降到10ms以下 -
avgqu-sz
:从146+减少到5以下 -
%util
:从100%下降到20%左右 -
系统整体响应时间显著改善
3.6 经验总结
教训与建议:
在采购硬件时考虑RAID卡的缓存配置(BBU必须的)
四、CPU上下文切换高分析过程
bash
bash
[root@localhost download]# free -g
total used free shared buff/cache available
Mem: 125 110 0 0 14 14
Swap: 15 10 4
[root@localhost download]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 5 11439720 445524 28 15114140 0 0 1 22 0 0 5 2 93 0 0
7 1 11438696 445044 28 15114172 820 0 820 680 46506 66224 7 2 88 2 0
10 2 11438184 446608 28 15114184 828 0 828 3684 49295 62714 6 2 90 2 0
13 1 11437672 445308 28 15114256 552 0 552 880 67147 84565 6 2 90 2 0
5 0 11437672 451720 28 15114268 64 0 64 28960 49561 50995 3 2 94 1 0
发现服务器内存基本耗尽,大量使用交换内存。
1. 进程队列问题严重
-
运行队列(r): 8, 12, 3, 2, 5 - 经常超过CPU核心数,表明CPU资源紧张
-
阻塞队列(b): 4, 0, 0, 1, 0 - 存在I/O阻塞的进程
2. 内存压力巨大
-
swpd: 11,468,128 - 11GB的交换空间被使用,说明物理内存严重不足
-
free: 仅约450MB空闲内存
-
cache: 15GB的缓存,系统正在尽力利用内存
3. 上下文切换确认
-
cs: 76,585, 36,980, 39,786, 36,973 - 与pidstat结果一致,上下文切换确实很高
-
in: 中断数也较高,52,208, 23,937等
4. I/O活动
-
so: 584 - 有数据从swap写出到磁盘
-
bi/bo: 有块设备输入输出活动
5. 虚拟机占用分析
这台服务器上装了3个虚拟机:
root@localhost download\]# virsh list 内存分别配置了:80G 32G 8G **进入第一台80G虚拟机查看,内存闲置了45G** ## 五、CPU上下文切换处理过程 **执行命令**: ```bash [root@platform ~]# lsmod | grep virtio_balloon virtio_balloon 18015 0 virtio_ring 22991 3 virtio_pci,virtio_balloon,virtio_console virtio 14959 3 virtio_pci,virtio_balloon,virtio_console ``` 气球驱动已加载,但可能没有正确配置或启用。 **执行内存调整命令(关键步骤)** ```bash bash virsh setmem host1 50G --live virsh setmaxmem host1 50G --config ```