4.8.1 I/O性能指标与瓶颈识别

本节围绕磁盘与文件系统的 I/O 性能指标与瓶颈识别,提供可执行的测量、观察、定位与排错流程,帮助在业务负载下快速判断问题来源。

I/O路径原理草图

文章图片

核心指标与含义(命令输出中的字段对应)
- 吞吐量(Throughput):读写带宽(MB/s),常见字段 rkB/swkB/s
- IOPS:单位时间 I/O 次数(r/sw/s)。
- 延迟(Latency):await(平均等待+服务时间),P95/P99 需借助分位统计。
- 队列深度(Queue Depth):avgqu-sz(平均队列长度)。
- 利用率(Utilization):%util(磁盘忙碌比例)。

安装与准备

# 以 Debian/Ubuntu 为例
sudo apt-get update
sudo apt-get install -y sysstat iotop blktrace fio

# 以 RHEL/CentOS 为例
sudo yum install -y sysstat iotop blktrace fio

# 启动 sysstat 采集
sudo systemctl enable --now sysstat

基线采集示例(先建立基线再看异常)

# 1) 采集磁盘指标(每秒一次,持续10次)
iostat -x -k 1 10

# 2) 采集系统级I/O与队列
vmstat 1 10

# 3) 采集历史基线(10分钟粒度)
sar -d 1 10

关键字段解释
- await:I/O 平均等待时间,包含排队+服务。
- svctm:服务时间(新内核不可靠,更多参考 await)。
- %util:接近 100% 表示设备饱和。
- avgqu-sz:平均队列长度,持续升高表示请求堆积。

识别瓶颈的标准流程(含示例)

# 1) 先看设备是否饱和
iostat -x -k 1 5

# 2) 定位高I/O进程
sudo iotop -oPa

# 3) 追踪块层事件(短时间)
sudo blktrace -d /dev/sda -o - | blkparse -i -

# 4) 快速判断顺序/随机特征
sudo fio --name=randread --filename=/data/fio.test \
  --rw=randread --bs=4k --iodepth=16 --numjobs=4 \
  --size=1G --runtime=30 --time_based --group_reporting

预期效果
- iostat 显示 await 高且 %util 接近 100%:设备层瓶颈可能性高。
- iotop 显示单进程 I/O 占用异常:应用层热点或写放大。
- fio 随机读写 IOPS 低、延迟高:随机负载下存储不足。

顺序 vs 随机 I/O 的判断与匹配

# 顺序读测试
sudo fio --name=seqread --filename=/data/fio.test \
  --rw=read --bs=1M --iodepth=4 --numjobs=1 \
  --size=2G --runtime=30 --time_based --group_reporting

# 随机写测试
sudo fio --name=randwrite --filename=/data/fio.test \
  --rw=randwrite --bs=4k --iodepth=32 --numjobs=4 \
  --size=2G --runtime=30 --time_based --group_reporting

判断规则
- 顺序读写:吞吐高、IOPS 低 → 适合备份、大文件。
- 随机读写:IOPS 高、吞吐低 → 适合数据库、日志。

瓶颈定位建议(带命令)
- 应用层:
```bash
# 找到高写入文件
sudo lsof +D /data | head

# 查看数据库刷盘相关参数(示例:MySQL)
mysql -e "SHOW GLOBAL VARIABLES LIKE 'innodb_flush%';"
- 文件系统层:bash
# 查看挂载参数
mount | grep /data

# XFS 统计
sudo xfs_info /data
- 块设备层:bash
# 查看调度器
cat /sys/block/sda/queue/scheduler

# 查看队列深度
cat /sys/block/sda/device/queue_depth
- 存储网络层(NAS/SAN):bash
# 网络延迟与丢包
ping -c 5
ip -s link show eth0
```

常见排错场景与处理
1) await 高且 %util
- 处理:降低并发写入、调整 I/O 调度器、扩容磁盘或升级 SSD/NVMe。

2) avgqu-sz 持续升高
- 处理:检查应用突发负载,必要时增加缓存或批量写入。

3) iowait 高但 %util 不高
- 处理:可能是网络存储瓶颈或文件系统锁争用,检查 NFS/SAN 延迟与应用锁。

练习(含参考命令)
1) 建立 10 分钟 I/O 基线并保存

sar -d 1 600 > /tmp/io_baseline.log

2) 使用 fio 对比 4K 随机读写与 1M 顺序读写

sudo fio --name=randrw --filename=/data/fio.test \
  --rw=randrw --bs=4k --iodepth=16 --numjobs=4 \
  --size=1G --runtime=60 --time_based --group_reporting

sudo fio --name=seqrw --filename=/data/fio.test \
  --rw=readwrite --bs=1M --iodepth=4 --numjobs=1 \
  --size=2G --runtime=60 --time_based --group_reporting

3) 模拟写入抖动并用 iotop 找到热点进程

# 生成小文件写入
for i in {1..5000}; do echo "log $i" >> /data/log.txt; done

# 定位热点进程
sudo iotop -oPa

命令速查解释
- iostat -x -k 1 5:每秒输出扩展磁盘指标 5 次。
- iotop -oPa:仅显示有 I/O 的进程,累计排序。
- blktrace:捕获块设备 I/O 事件,短时间用于定位路径。
- fio:构造负载,验证随机/顺序性能与延迟指标。