IO 工具是一款用于测试硬件存储性能的辅助工具,兼具灵活性、可靠性。磁盘的 I/O 是衡量硬件性能的最重要的指标之一,而 FIO 工具通过模拟 I/O负载对存储介质进行压力测试,并将存储介质的 I/O 数据直观的呈现出来。
根据实际业务的场景,一般将 I/O 的表现分为四种场景,随机读、随机写、顺序读、顺序写。FIO 工具允许指定具体的应用模式,配合多线程对磁盘进行不同深度的测试。
1、安装fio工具包到待测试服务器上
方法一:rpm -i ./fio-2.12-1.fc25.x86_64.rpm
如果报错依赖包告警,可以强制安装rpm -ivh ./fio-2.12-1.fc25.x86_64.rpm --nodeps --force
方法二:在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install
2、fio参数解释
name | FIO 运行任务的名称 (可选) |
filename=/dev/sdc1 | 测试设备名称,通常选择设备名/dev/sdc或挂载点下的文件。 |
-direct=1 | 使用direct IO,测试过程绕过OS自带的buffer,结果更加真实。 |
-rw=read | IO模型: · read - 顺序读 · write - 顺序写 · trim - 顺序裁剪 · randread - 随机读 · randwrite - 随机写 · randtrim - 随机裁剪 · rw, readwrite - 混合顺序读写 · randrw - 混合的随机读写 · trimwrite - 顺序的裁剪 + 顺序写 |
-bs=4K | 单次IO大小 |
-size=100G | 指定单个线程读写的数据量 |
-iodepth | IO队列深度 |
-ioengine | 指定IO引擎的方式: libaio - Linux 原生的异步 I/O,这也是通常我们这边用的最多的测试盘吞吐和延迟的方法 psync是使用同步方式,用多线程模拟同时批量给内核提交IO请求,线程中一个IO提交完成后才能提交下一个IO libaio采用Kernel Native AIO可以达到单次批量给内核提交IO请求的目的,相比psync的多线程,libaio的开销更小,性能更好,更加合适评估内核块子系统的性能 · sync - 也就是最通常的 read / write 操作 · vsync - 使用 readv / writev,主要是会将相邻的 I/O 进行合并 · psync - 对应的 pread / pwrite · pvsync / pvsync2 - 对应的 preadv / pwritev,以及 preadv2 / p writev2 |
-thread | 使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。 |
-numjobs=1 | 每个任务的线程数 |
-name=sqe_100read_4k | 指定的任务名称 |
-runtime | 测试时间/s |
-group_reporting | 显示结果中汇总每个进程的信息,不会输出每个线程的信息,易于查看。 |
-runtime=1000 | 测试时间为1000秒,如果不设置则一直将100g文件分4k每次,写完为止 |
3、实例
对硬盘施压时,需要先定位施压的硬盘,比如sdb
fio --name=test --filename=/dev/sdb --ioengine=libaio --direct=1 --bs=1024k --iodepth=192 --rw=randread --runtime=604800 --time_based
FIO任务名称test,测试设备sdb,引擎方式libaio,使用direct绕过buffer,大小为1024k,IO队列深度192,随机读,测试时间604800
如果压力不够,可以修改队列
cat /sys/block/sdb/queue/nr_requests
echo 1024 > /sys/block/sdb/queue/nr_requests
查看压力情况
iostat -x 1 /dev/sdb
[tecs@host-69 ~]$ fio -name=test -filename=/dev/sdi -ioengine=libaio -direct=1 -bs=8k -iodepth=16 -rw=randread -runtime=604800 -time_based
[root@host-69 tecs]# iostat -x 1 /dev/sdi
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdi 0.00 0.00 258.00 0.00 2064.00 0.00 16.00 16.01 62.00 62.00 0.00 3.88 100.10
avg-cpu: %user %nice %system %iowait %steal %idle
2.23 0.00 1.76 0.00 0.00 96.01
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdi 0.00 0.00 266.00 0.00 2128.00 0.00 16.00 16.00 61.45 61.45 0.00 3.76 100.00
以上各列的含义如下:
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
r*B/s: 每秒读数据量(*B为单位)
w*B/s: 每秒写数据量(*B为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位),每个请求平均大小,单位是扇区数,一般在200~400之间算是正常和理想的状态,如果这个值比较小,比方说只在100左右,
这里可以测试一下看fio哪个参数可以影响avgrq-sz
avgqu-sz: 平均等待处理的IO请求队列长度(肯定约低越好)
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率(越低越好,越高性能约差)
%user:在用户级别运行所使用 CPU 的百分比。
%nice:nice操作所使用 CPU 的百分比。
%system:在系统级别(kernel)运行所使用 CPU 的百分比。
%iowait:CPU等待硬件 I/O 时,所占用 CPU 百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU 空闲时间的百分比。
重点关注参数
1、iowait% 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。
2、avgqu-sz 表示磁盘IO队列长度,即IO等待个数。
3、await 表示每次IO请求等待时间,包括等待时间和处理时间
4、svctm 表示每次IO请求处理的时间
5、%util 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态。
如果压力不够,可以修改队列
cat /sys/block/sdb/queue/nr_requests
echo 1024 > /sys/block/sdb/queue/nr_requests