掌握fio:Linux存储性能测试利器

内容分享2天前发布
0 0 0


fio
 (Flexible I/O Tester) 是 Linux 下最强大、最常用的存储性能基准测试和压力测试工具。它功能极其灵活,可以模拟各种真实的 I/O 负载。

以下是使用 
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
 读取这个文件。

参数类别 参数 说明 示例
全局设置
name
任务名称
name=emmc_read_test

filename
测试的目标设备或文件
filename=/dev/mmcblk0p1

size
每个作业处理的数据总量
size=1G

runtime
测试运行时间(秒)
runtime=300
 (5分钟)

time_based
即使完成 
size
 也继续运行直到 
runtime

time_based=1

group_reporting
汇总所有线程的测试结果
group_reporting=1
I/O 类型
rw
读写模式
rw=randread

rw=write

rw=randrw

rwmixread
在混合读写中,读请求所占百分比
rwmixread=70
 (70%读, 30%写)

bs
块大小,这是最重要的参数之一
bs=4k

bs=1M

bs=4k,64k
队列设置
iodepth
I/O 队列深度,决定并发度
iodepth=1
 (同步), 
iodepth=32
 (高并发)

numjobs
并发运行的作业数(线程/进程)
numjobs=4
 (模拟4个客户端)
引擎与缓存
ioengine
发起 I/O 的方式,通常用 
libaio

ioengine=libaio
 (异步I/O)

direct
是否使用直接 I/O (绕过缓存,必须为1)
direct=1

buffered
是否使用缓冲 I/O
buffered=0
 (通常与direct=1互斥)
结果输出
output
将结果输出到文件
output=/tmp/fio_result.log

write_bw_log
写入带宽日志
write_bw_log=testname

write_lat_log
写入延迟日志
write_lat_log=testname

write_iops_log
写入IOPS日志
write_iops_log=testname

高级测试配置文件示例

你可以将以下内容保存为 
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
。高的 
sys
 (系统CPU) 可能意味着驱动或内核开销大。

高级技巧

生成图形化报告:使用 
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 等文件

测试不同队列深度:通过改变 
iodepth
 (1, 8, 16, 32, 64) 和 
numjobs
 (1, 2, 4, 8),可以绘制出 IOPS/延迟 随并发度变化的曲线,找到设备的性能拐点。

通过组合这些测试,你可以全面了解 eMMC 存储在不同负载条件下的峰值性能、稳定性和延迟表现,从而准确评估其是否满足你的应用需求。

© 版权声明

相关文章

暂无评论

none
暂无评论...