一、FIO
1 fio:灵活的 I/O 性能测试工具
FIO (Flexible I/O Tester) 是 Linux 下最强大的存储性能测试工具之一,它可以精确控制 I/O 模式,模拟各种负载场景。以下是 FIO 的全面使用指南。
常用测试场景示例
# 顺序读测试 (1M块大小, 10GB数据)
fio --name=seq_read --filename=/testfile --size=10G --rw=read --bs=1M --direct=1 --ioengine=libaio --iodepth=32 --runtime=60 --time_based
# 顺序写测试
fio --name=seq_write --filename=/testfile --size=10G --rw=write --bs=1M --direct=1 --ioengine=libaio --iodepth=32
# 随机读测试 (4K块大小)
fio --name=rand_read --filename=/dev/sdb --rw=randread --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4 --runtime=60 --group_reporting
# 随机写测试
fio --name=rand_write --filename=/dev/sdb --rw=randwrite --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4
3. 混合读写测试
# 70%读30%写的混合负载
fio --name=mixed_rw --filename=/dev/nvme0n1 --rw=randrw --bs=4k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=8 --rwmixread=70 --runtime=120 --group_reporting
4. 数据库模式测试
# 模拟数据库负载 (小随机读写)
fio --name=db_workload --filename=/dev/sdb --rw=randrw --bs=8k --direct=1 --ioengine=libaio --iodepth=32 --numjobs=16 --runtime=300 --group_reporting --rwmixread=70 --time_based
2.核心参数解析
1. 全局参数
| 参数 | 说明 |
|---|---|
--name | 测试名称 |
--filename | 测试文件路径 (支持多文件: /dev/sdb:/dev/sdc) |
--size | 每个线程/文件的总数据量 (如 1G, 500M) |
--runtime | 测试运行时间 (秒) |
--time_based | 即使完成所有 I/O 也继续运行直到时间到 |
--ioengine | I/O 引擎 (libaio, sync, psync, posixaio 等) |
--direct | 是否绕过缓存 (1=直接 I/O) |
--thread | 使用线程而非进程 |
2. I/O 模式参数
| 参数 | 说明 |
|---|---|
--rw | 读写模式: read(顺序读), write(顺序写), randread(随机读), randwrite(随机写), rw/randrw(混合) |
--bs | 块大小 (如 4k, 1M) |
--iodepth | I/O 队列深度 (异步引擎重要参数) |
--numjobs | 并发线程/进程数 |
--rwmixread | 混合读写中读的比例 (如 70 表示 70%读) |
3. 结果输出参数
| 参数 | 说明 |
|---|---|
--output | 结果输出文件 |
--output-format | 输出格式 (normal, json, json+) |
--lat_percentiles | 是否显示延迟百分位数 (1=开启) |
示例参考:
编辑
3.磁盘 I/O 性能解读(顺序读测试)
测试参数回顾
- 测试类型:顺序读 (sequential read)
- 块大小:1MB
- 队列深度:32
- 数据量:1GB
- 测试时长:20秒
- 直接I/O:启用 (绕过缓存)
关键性能指标
-
吞吐量 (Bandwidth) :
- 243 MiB/s (255 MB/s) - 这是该磁盘在顺序读场景下的最大持续吞吐能力
-
IOPS:
- 242 IOPS - 对于1MB大块顺序读,IOPS值较低是正常的(块越大IOPS越低)
-
延迟指标:
- 平均完成延迟 (clat) :131.49毫秒
- 平均总延迟 (lat) :131.66毫秒
- 延迟分布:大部分(99.32%)请求在250ms内完成
-
CPU使用率:
- 用户态: 0.63%
- 内核态: 4.68%
- 极低的CPU开销,说明瓶颈完全在磁盘
-
队列深度利用:
- 99.4%时间保持32的队列深度
- 表明I/O调度器能持续保持高负载
-
设备利用率:
- 99.73% - 磁盘已接近完全饱和
性能评估
-
设备类型判断:
- 从性能特征看,这很可能是eMMC存储(mmcblk0设备)
- 典型eMMC 5.1的顺序读速度在200-250MB/s左右,与测试结果吻合
-
性能等级:
-
对于嵌入式设备(eMMC)来说,255MB/s的顺序读速度属于中等偏上性能
-
对比参考:
- 低端eMMC:~100MB/s
- 高端eMMC:~400MB/s
- SATA SSD:~500MB/s
- NVMe SSD:~2000+MB/s
-
-
延迟分析:
- 平均130+ms的延迟较高,这是eMMC的典型特征
- 延迟分布较集中(大部分在125-186ms之间),说明性能稳定
结论
该eMMC存储设备在顺序读场景下表现符合预期,达到了硬件设计的中上水平(约255MB/s),但延迟较高是嵌入式存储的普遍特点。对于需要更高存储性能的应用场景,建议考虑存储介质升级。
二、其他性能分析工具
-
iostat:监控设备利用率
-
iostat -x 1 -
iotop:按进程统计I/O
-
iotop -o -
blktrace:跟踪块设备请求
-
blktrace -d /dev/sda -o trace -
bpftrace:动态追踪I/O栈
-
bpftrace -e 'kprobe:submit_bio { @[comm] = count(); }'