在租用国外服务器的时候,有一个很重要的考量因素就是硬盘的I/O读写速度,其对服务器整体性能和数据处理能力有着重要的影响。
目前比较常用的I/O测试工具有fio、iometer和Orion,但对于Linux国外服务器来说,使用fio工具比较方便,即主要对SAN存储进行的IO测试。
FIO是测试IOPS的理想工具,主要用于对硬件压力测试和验证,支持13种不同的I/O引擎,包括:sync、mmap、libaio、 posixaio、SG v3、null、network、splice、syslet、guasi以及solarisaio等。
一、FIO工具的安装
在Linux操作系统中可以安装以下命令安装FIO工具,本文演示的系统为CentOS7版本。
wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz #下载FIO安装包
yum install libaio-devel #安装libaio包
yun install gcc #安装gcc及依赖
tar -zxvf fio-2.2.5.tar.gz #解压压缩包
./configure #软件配置,如果显示找不到文件或目录,此步骤可以省略
cd fio-2.2.10 #进入目录
make #安装
make install #安装
二、FIO工具的用法
安装FIO工具之后,就可以对服务器硬件进行测试了。当然,在测试之前可以输入以下命令清除系统缓存:
echo 3 > /proc/sys/vm/drop_caches
FIO工具的用户主要有四种,分别是顺序读、随机读、顺序写、随机写、混合随机读写模式,示例如下:
1、随机读,100%随机,100%读,5K
fio -filename=/tmp/test -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_5k
2、随机写,100%随机,100%写, 5K
fio -filename=/tmp/test -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_5k
3、顺序读,100%顺序,100%读 ,5K
fio -filename=/tmp/test -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_5k
4、顺序写,100%顺序,100%写 ,4K
fio -filename=/tmp/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_5k
5、混合随机读写,100%随机,70%读,30%写 5K
fio -filename=/tmp/test -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=60 -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=randrw_60read_5k
Fio各个版本的参数不尽相同,这里只列出常用且重要的参数解释:
参数 | 释义 |
filename=/tmp/test | 测试文件名称,通常选择需要测试的盘的data目录 |
direct=1 | 绕过机器自带的buffer,使测试结果更真实 |
rw=randwread | 随机读的I/O |
rw=randwrite | 随机写的I/O |
rw=randrw | 随机混合写和读的I/O |
rw=write | 顺序写的I/O |
rw=read | 顺序读的I/O |
rw=rw | 顺序混合写和读的I/O |
bs=5k | 单次io的块文件大小为4k |
bsrange=512-2048 | 提定数据块的大小范围 |
size=4g | 测试文件大小为4g,以每次5k的io进行测试(建议以实际内存的2倍进行测试) |
numjobs=50 | 测试的线程为50 |
runtime=100 | 测试时间为100秒,如果不写则一直将4g文件分5k每次写完为止 |
ioengine=psync | io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包 |
rwmixread=60 | 在混合读写的模式下,读占60% |
ioengine=libaio | I/O引擎使用libaio,libaio是异步的I/O引擎,一次提交一批I/O,然后等待这批I/O完成 |
iodepth=4 | I/O队列深度,主要是根据设备的并行度来调整 |
lockmem=1g | 只使用1g内存进行测试 |
group_reporting | 关于显示结果,汇总每个进程的信息 |
注意:以上为常见参数,如果想查看更多参数,可以使用“fio -help”命令查看每个参数的说明,具体的参数使用方法可以在官网查看how to文档。
三、FIO工具测试演示
下面以4G文件,块是5K为例,进行简单的测试,命令如下:
fio -filename=/tmp/example -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=60 -ioengine=psync -bs=5k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=example_randrw_60read_5k
测试结果注释:
io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延迟的分布
io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率
四、关于FIO工具
FIO最初是用来节省为特定负载而写的专门测试程序,主要进行性能测试,或是找到和重现Bug的时间。但是,写这样的测试应用比较浪费时间。
这时候,人们考虑到需要一个工具来模拟给定的IO负载,这样就不用重复的写一个又一个的特定的测试程序。难点是,负载很难定义,因为随时可能会产生很多进程或线程,而每一个进程都有自己的方式产生IO,最终FIO需要这些灵活得来模拟这些事件,从而应运而生。
FIO工具功能非常强大,下面简单举几个:
1、支持十几种存储引擎,可以自定义。
2、自带做图工具,调用gnuplot做图。
3、几乎支持所有的存储描述参数。
4、对CPU、内存、进程/线程、IO特性的配置进行测试。
5、压缩、trace回放、用户可灵活配置。
五、总结
关于使用FIO工具测试服务器硬盘的几点建议总结。
1、建议使用顺序I/O和较大的blocksize来测试设备的通吐量和延迟。
2、建议使用随机I/O和较小的blocksize来测试设备的IOPS和延迟。
3、在配置numjobs和iodepth测试底层存硬盘储性能时,务必要了解到底采用的是同步的IO还是异步的IO。
4、建议直接通过写裸盘的方式进行测试,会得到较为真实的数据。直接测试裸盘会破坏文件系统结构,导致数据丢失,请在测试前确认磁盘中数据已备份,否则可能会导致系统奔溃而丢失数据。(最好是避开系统所在的裸机设备)
6、以上演示的测试数据仅供参考,大家可以结合自身实际需求对自己使用的国外服务器硬盘性能进行测试。
推荐阅读: