Linux磁盘I/O性能基准测试与fio工具配置参数详解实战

fio工具概述与磁盘I/O性能测试基础

fio(Flexible I/O Tester)是Linux系统下最权威的磁盘I/O性能测试工具,支持多种I/O引擎、读写模式和访问模式。服务器运维中评估存储子系统性能时,fio是业界标准工具。通过模拟真实工作负载,fio可以精确测量IOPS、吞吐量(MB/s)和延迟(us/ms),为存储选型和性能调优提供数据支撑。

磁盘I/O性能测试需要区分几个核心概念:顺序读写衡量的是吞吐量(MB/s),反映大文件传输能力;随机读写衡量的是IOPS(每秒I/O操作数),反映小文件并发处理能力;延迟(latency)包括平均延迟和尾延迟(P99、P999),直接影响应用响应速度。fio通过灵活的参数组合,可以覆盖所有这些测试场景。

fio核心配置参数详解

fio的配置参数有近百个,以下列出最关键的一组参数及其含义:

# 顺序读测试配置示例
[global]
ioengine=libaio        # I/O引擎,libaio为Linux原生异步I/O
direct=1               # 绕过page cache,直接操作磁盘
rw=read                # 读写模式:read/write/randread/randwrite/rw
bs=128k                # 块大小,影响吞吐量和IOPS
iodepth=32             # I/O队列深度,并发请求数
numjobs=4              # 并发job数
size=10G               # 测试文件大小
runtime=60             # 每个job运行时间(秒)
time_based              # 按时间运行
group_reporting         # 汇总多job结果
filename=/dev/nvme0n1  # 测试目标,可用设备路径或文件路径
name=seq_read

ioengine参数决定I/O提交方式。libaio是Linux内核原生异步I/O引擎,配合direct=1使用,测试结果最接近硬件真实性能。sync是同步I/O引擎,iodepth参数对其无效。mmap通过内存映射文件方式访问,适合测试文件系统层性能。direct=1确保I/O请求不经过操作系统page cache缓冲,直接写入存储设备,这一参数对评估裸盘性能至关重要。

bs(block size)参数对测试结果影响极大。大bs值(如128k、1M)测试的是吞吐量上限,小bs值(如4k)测试的是IOPS上限。iodepth控制I/O队列深度,SSD/NVMe设备的队列深度通常设置为32-128才能打满设备性能。传统机械硬盘iodepth设为1-4即可,设置过高反而增加延迟。

四种典型I/O场景测试方案

完整的磁盘性能评估需要覆盖四种场景:顺序读、顺序写、随机读、随机写。每种场景使用不同的参数组合:

# 1. 顺序读吞吐量测试
fio --name=seq_read     --ioengine=libaio --direct=1     --rw=read --bs=1M     --iodepth=32 --numjobs=1     --size=10G --runtime=60 --time_based     --filename=/dev/nvme0n1     --group_reporting

# 2. 随机读IOPS测试
fio --name=rand_read     --ioengine=libaio --direct=1     --rw=randread --bs=4k     --iodepth=128 --numjobs=4     --size=10G --runtime=60 --time_based     --filename=/dev/nvme0n1     --group_reporting

# 3. 随机写IOPS测试
fio --name=rand_write     --ioengine=libaio --direct=1     --rw=randwrite --bs=4k     --iodepth=128 --numjobs=4     --size=10G --runtime=60 --time_based     --filename=/dev/nvme0n1     --group_reporting

# 4. 混合读写测试(70%读+30%写)
fio --name=mixed_rw     --ioengine=libaio --direct=1     --rw=randrw --rwmixread=70 --bs=4k     --iodepth=64 --numjobs=4     --size=10G --runtime=60 --time_based     --filename=/dev/nvme0n1     --group_reporting

顺序读写测试使用1M块大小和单job,目的是消除并发干扰,测量设备在最佳情况下的吞吐量上限。随机读写测试使用4k块大小和高并发(numjobs=4 + iodepth=128),因为SSD的IOPS性能需要足够的并发请求才能充分体现。混合读写测试模拟数据库等OLTP场景的真实负载特征。

fio测试结果解读与性能分析

fio运行完成后输出详细的统计信息,重点关注的指标如下:

seq_read: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, 
     ios=(0) 10240, merge=(0) 0, ticks=(0) 354200
     lat (usec): min=31280, max=89540, avg=34780.0, stdev=2100
     clat percentiles (usec):
      |  1.00th=[32100],  5.00th=[32500], 
      | 50.00th=[34800], 95.00th=[37800], 
      | 99.00th=[41200], 99.90th=[45100]
   Throughput: read=9876MiB/s, write=0B/s
   IOPS: read=9876, write=0

rand_read: (g=0): rw=randread, bs=(R) 4096B-4096B,
     ios=(0) 1572864, merge=(0) 0
     lat (usec): min=85, max=1820, avg=162.3, stdev=45
     clat percentiles (usec):
      |  1.00th=[95],  5.00th=[105],
      | 50.00th=[150], 95.00th=[220],
      | 99.00th=[350], 99.90th=[580]
   IOPS: min=984000, max=1012000, avg=995000

解读这组数据:顺序读吞吐量约9.9 GB/s,接近PCIe 4.0 NVMe SSD的理论带宽上限。随机读IOPS约99.5万,这是4个job乘以128 iodepth等于512并发下的数值。P99延迟350us,P99.9延迟580us,对于NVMe SSD属于正常范围。

如果P99延迟远高于平均值(如avg=150us但P99=2000us),通常表明设备存在写放大或GC(垃圾回收)导致的间歇性性能抖动。可以在测试前先做一次全盘顺序写填充(preconditioning),确保SSD进入稳态后再进行随机I/O测试,结果更具参考价值。

不同存储介质的基准性能参考

了解各类存储介质的基准性能范围,有助于判断fio测试结果是否正常。SATA SSD的顺序读取通常在500-550 MB/s(受SATA接口6Gbps带宽限制),随机4K读取IOPS在90,000-100,000。PCIe 4.0 NVMe SSD的顺序读取可达7000 MB/s,随机4K读取IOPS可达1,000,000以上。PCIe 5.0 NVMe SSD的顺序读取带宽可达14,000 MB/s,随机4K读取IOPS可达1,500,000。

企业级SSD与消费级SSD的差异主要在稳态性能和尾延迟。消费级SSD在SLC Cache耗尽后写入速度会骤降至100-200 MB/s,而企业级SSD通过预留空间(OP)和PLSLC模式保持稳定的写入性能。服务器选型中如果工作负载包含持续大文件写入,应选择企业级SSD或配置足够的OP空间。

测试文件系统层性能时,direct=1应改为direct=0,允许I/O经过page cache。同时bs参数可以设置为应用实际的I/O大小。例如数据库场景通常使用8k-16k的块大小,Web服务器多为1k-64k的读写。根据实际负载特征调整测试参数,才能获得有参考价值的性能数据。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-ci-pan-io-xing-neng-ji-zhun-ce-shi-yu-fio-gong-ju-pei/

(0)
小编小编
上一篇 12小时前
下一篇 12小时前

相关推荐