Linux磁盘I/O性能优化工具

304 阅读4分钟

一、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 也继续运行直到时间到
--ioengineI/O 引擎 (libaio, sync, psync, posixaio 等)
--direct是否绕过缓存 (1=直接 I/O)
--thread使用线程而非进程

2. I/O 模式参数

参数说明
--rw读写模式: read(顺序读), write(顺序写), randread(随机读), randwrite(随机写), rw/randrw(混合)
--bs块大小 (如 4k, 1M)
--iodepthI/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:启用 (绕过缓存)

关键性能指标

  1. 吞吐量 (Bandwidth) :

    • 243 MiB/s (255 MB/s) - 这是该磁盘在顺序读场景下的最大持续吞吐能力
  2. IOPS:

    • 242 IOPS - 对于1MB大块顺序读,IOPS值较低是正常的(块越大IOPS越低)
  3. 延迟指标:

    • 平均完成延迟 (clat) :131.49毫秒
    • 平均总延迟 (lat) :131.66毫秒
    • 延迟分布:大部分(99.32%)请求在250ms内完成
  4. CPU使用率:

    • 用户态: 0.63%
    • 内核态: 4.68%
    • 极低的CPU开销,说明瓶颈完全在磁盘
  5. 队列深度利用:

    • 99.4%时间保持32的队列深度
    • 表明I/O调度器能持续保持高负载
  6. 设备利用率:

    • 99.73% - 磁盘已接近完全饱和

性能评估

  1. 设备类型判断:

    • 从性能特征看,这很可能是eMMC存储(mmcblk0设备)
    • 典型eMMC 5.1的顺序读速度在200-250MB/s左右,与测试结果吻合
  2. 性能等级:

    • 对于嵌入式设备(eMMC)来说,255MB/s的顺序读速度属于中等偏上性能

    • 对比参考:

      • 低端eMMC:~100MB/s
      • 高端eMMC:~400MB/s
      • SATA SSD:~500MB/s
      • NVMe SSD:~2000+MB/s
  3. 延迟分析:

    • 平均130+ms的延迟较高,这是eMMC的典型特征
    • 延迟分布较集中(大部分在125-186ms之间),说明性能稳定

结论

该eMMC存储设备在顺序读场景下表现符合预期,达到了硬件设计的中上水平(约255MB/s),但延迟较高是嵌入式存储的普遍特点。对于需要更高存储性能的应用场景,建议考虑存储介质升级。

二、其他性能分析工具

  1. iostat:监控设备利用率

  •     iostat -x 1
    
  • iotop:按进程统计I/O

  •     iotop -o
    
  • blktrace:跟踪块设备请求

  •     blktrace -d /dev/sda -o trace
    
  • bpftrace:动态追踪I/O栈

  1.   bpftrace -e 'kprobe:submit_bio { @[comm] = count(); }'