(Flexible I/O Tester) 是 Linux 下最强大、最常用的存储性能基准测试和压力测试工具。它功能极其灵活,可以模拟各种真实的 I/O 负载。
fio
以下是使用
进行高级测试的详细指南。
fio
为什么选择 fio?
精准控制:可以精确控制 I/O 引擎、块大小、队列深度、读写模式、线程/进程数等。
避免缓存影响:可以直接测试磁盘的真实 I/O 能力,绕过操作系统缓存。
丰富的结果:提供详细的性能数据(IOPS、带宽、延迟、CPU 使用率)和延迟百分比(如 clat 的 99.00%、99.99%)。
多平台支持:在嵌入式设备、服务器、PC 上均可使用。
安装 fio
sudo apt update && sudo apt install fio
核心概念和常用参数
的参数可以在命令行中直接指定,但更常见的做法是写入一个
fio
配置文件,然后让
.fio
读取这个文件。
fio
参数类别 | 参数 | 说明 | 示例 |
---|---|---|---|
全局设置 |
|
任务名称 |
|
|
测试的目标设备或文件 |
|
|
|
每个作业处理的数据总量 |
|
|
|
测试运行时间(秒) | (5分钟) |
|
|
即使完成 也继续运行直到
|
|
|
|
汇总所有线程的测试结果 |
|
|
I/O 类型 |
|
读写模式 | , ,
|
|
在混合读写中,读请求所占百分比 | (70%读, 30%写) |
|
|
块大小,这是最重要的参数之一 | , ,
|
|
队列设置 |
|
I/O 队列深度,决定并发度 | (同步), (高并发) |
|
并发运行的作业数(线程/进程) | (模拟4个客户端) |
|
引擎与缓存 |
|
发起 I/O 的方式,通常用
|
(异步I/O) |
|
是否使用直接 I/O (绕过缓存,必须为1) |
|
|
|
是否使用缓冲 I/O | (通常与direct=1互斥) |
|
结果输出 |
|
将结果输出到文件 |
|
|
写入带宽日志 |
|
|
|
写入延迟日志 |
|
|
|
写入IOPS日志 |
|
高级测试配置文件示例
你可以将以下内容保存为
文件,然后运行
emmc_test.fio
。
fio emmc_test.fio
示例 1:4K 随机读写 (测试 IOPS 和延迟)
这是最经典的数据库、虚拟机、系统启动等高负载场景测试。
ini
[global] ioengine=libaio iodepth=32 direct=1 size=1G runtime=120 time_based=1 group_reporting=1 filename=/dev/mmcblk0p1 # 请修改为你的eMMC分区! [4k_randread] name=4k_random_read_test bs=4k rw=randread numjobs=4 [4k_randwrite] name=4k_random_write_test bs=4k rw=randwrite numjobs=4
示例 2:顺序读写 (测试最大吞吐量/带宽)
测试大文件连续读写的速度,适用于视频、备份等场景。
ini
[global] ioengine=libaio iodepth=16 direct=1 runtime=60 time_based=1 group_reporting=1 filename=/dev/mmcblk0p1 [seq_read] name=sequential_read_test bs=1M rw=read [seq_write] name=sequential_write_test bs=1M rw=write
示例 3:混合随机读写 (模拟真实应用负载)
模拟一个同时有读有写的真实应用场景(如文件服务器)。
ini
[global] ioengine=libaio iodepth=32 direct=1 runtime=180 time_based=1 group_reporting=1 filename=/dev/mmcblk0p1 [mixed_io] name=70read_30write_mixed bs=4k rw=randrw rwmixread=70 numjobs=4
示例 4:高压力稳定性与延迟测试
长时间运行,观察性能是否稳定,并获取高百分位延迟数据。
ini
[global] ioengine=libaio iodepth=64 direct=1 runtime=3600 # 运行1小时 time_based=1 group_reporting=1 filename=/dev/mmcblk0p1 [stress_test] name=long_stress_test bs=4k rw=randrw rwmixread=50 numjobs=8
如何运行与解读结果
运行测试:
# 使用配置文件 sudo fio emmc_test.fio # 或者直接在命令行指定所有参数(可读性差,但方便快速测试) sudo fio --name=quick_test --filename=/dev/mmcblk0p1 --rw=randread --bs=4k --iodepth=32 --direct=1 --runtime=60 --time_based --group_reporting
解读关键结果:
测试完成后,
会输出一份详细报告。关注以下部分:
fio
IOPS:
对于随机读写,这个值越高越好。
iops=XXXX
带宽 (BW):
对于顺序读写,这个值越接近理论带宽越好。
bw=XXXX KiB/s
延迟 (lat):
(完成延迟):从提交到完成的时间。这是最重要的延迟指标。
clat
(提交延迟):从发起请求到提交的时间。
lat
查看其 平均值 (avg)、最大值 (max) 和百分比值 (如 99.00%, 99.99%)。99.99% 的延迟值对于评估系统稳定性至关重要。
CPU 使用率:
。高的
cpu: usr=XX.XX%, sys=XX.XX%, ctx=XXXX, majf=XXXX
(系统CPU) 可能意味着驱动或内核开销大。
sys
高级技巧
生成图形化报告:使用
工具可以将
fio2gnuplot
生成的
fio
、
*_bw.log
日志文件绘制成曲线图,直观展示性能变化。
*_lat.log
bash
fio --name=test --filename=/dev/sda ... --write_bw_log=bw_log --write_iops_log=iops_log # 然后使用 fio2gnuplot 处理生成的 bw_log_bw.1.log 等文件
测试不同队列深度:通过改变
(1, 8, 16, 32, 64) 和
iodepth
(1, 2, 4, 8),可以绘制出 IOPS/延迟 随并发度变化的曲线,找到设备的性能拐点。
numjobs
通过组合这些测试,你可以全面了解 eMMC 存储在不同负载条件下的峰值性能、稳定性和延迟表现,从而准确评估其是否满足你的应用需求。