I/O输入/输出(Input/Output),读和写,提高缓存(cache)和做磁盘阵列(RAID)能提高存储IO性能。
IOPS (英文:Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数,多用于数据库、存储等场合,衡量随机访问的性能。
存储端的IOPS性能和主机端的IO是不同的,IOPS是指存储每秒可接受多少次主机发出的访问,主机的一次IO需要三次访问存储才可以完成。例如,主机写入一个最小的数据块,也要经过“发送写入请求、写入数据、收到写入确认”等三个步骤,也就是3个存储端访问。
Linux下常用Fio、dd工具, Windows下常用IOMeter。
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
linux下安装使用流程
一,FIO安装
下载源码包: wget http://brick.kernel.dk/snaps/fio-2.0.7.tar.gz
安装依赖软件:yum install libaio-devel 我们一般使用libaio,发起异步IO请求。
解压: tar -zxvf fio-2.0.7.tar.gz
安装: cd fio-2.0.7
编译: make
安装: make install
上部流程中如果没有找到wget你需要先安装
yum install wget
二.使用
下面的语句是我用来测试磁盘随机读写的命令
强调:!!!测试文件名称,通常选择需要测试的盘的data目录。只能是分区,不能是目录,会破坏数据。!!!
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
具体参数说明
说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。只能是分区,不能是目录,会破坏数据。
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
iodepth 1 队列深度,只有使用libaio时才有意义,这是一个可以影响IOPS的参数,通常情况下为1。
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
ioengine=psync io引擎使用pync方式
bs=4k 单次io的块文件大小为4k
bsrange=512-2048 同上,提定数据块的大小范围
size=50G 本次的测试文件大小为50g,以每次4k的io进行测试,此大小不能超过filename的大小,否则会报错。
numjobs=10 本次的测试线程为10.
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
read 顺序读
write 顺序写
rw,readwrite 顺序混合读写
randwrite 随机写
randread 随机读
randrw 随机混合读写
其他常用语句
顺序读:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
随机写:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
顺序写:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
混合随机读写:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop
三.测试结果
下面是我用虚拟机中linux执行测试随机读写命令的结果
[root@localhost dev]# fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10
-group_reporting -name=mytest mytest: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1
...
mytest: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1
fio 2.0.7
Starting 10 threads
Jobs: 10 (f=10): [mmmmmmmmmm] [100.0% done] [1651K/1831K /s] [100 /111 iops] [eta 00m:00s]
mytest: (groupid=0, jobs=10): err= 0: pid=4075
read : io=28976KB, bw=2854.6KB/s, iops=178 , runt= 10151msec
clat (usec): min=49 , max=525390 , avg=35563.60, stdev=69691.20
lat (usec): min=49 , max=525390 , avg=35563.72, stdev=69691.20
clat percentiles (usec):
| 1.00th=[ 65], 5.00th=[ 70], 10.00th=[ 92], 20.00th=[ 116],
| 30.00th=[ 137], 40.00th=[ 151], 50.00th=[ 175], 60.00th=[ 286],
| 70.00th=[14144], 80.00th=[69120], 90.00th=[138240], 95.00th=[197632],
| 99.00th=[280576], 99.50th=[301056], 99.90th=[452608], 99.95th=[528384],
| 99.99th=[528384]
bw (KB/s) : min= 16, max= 1440, per=12.25%, avg=349.55, stdev=236.44
write: io=29616KB, bw=2917.6KB/s, iops=182 , runt= 10151msec
clat (usec): min=64 , max=2030.4K, avg=19768.52, stdev=155468.56
lat (usec): min=64 , max=2030.4K, avg=19768.86, stdev=155468.56
clat percentiles (usec):
| 1.00th=[ 70], 5.00th=[ 83], 10.00th=[ 93], 20.00th=[ 115],
| 30.00th=[ 131], 40.00th=[ 141], 50.00th=[ 151], 60.00th=[ 161],
| 70.00th=[ 177], 80.00th=[ 209], 90.00th=[ 310], 95.00th=[ 532],
| 99.00th=[700416], 99.50th=[1056768], 99.90th=[2007040], 99.95th=[2023424],
| 99.99th=[2023424]
bw (KB/s) : min= 21, max= 1392, per=11.98%, avg=349.49, stdev=253.50
lat (usec) : 50=0.03%, 100=13.11%, 250=58.60%, 500=7.76%, 750=1.34%
lat (usec) : 1000=0.38%
lat (msec) : 2=0.87%, 4=0.74%, 10=0.38%, 20=1.37%, 50=3.63%
lat (msec) : 100=2.57%, 250=6.80%, 500=1.64%, 750=0.33%, 1000=0.14%
lat (msec) : 2000=0.27%, >=2000=0.05%
cpu : usr=0.04%, sys=1.52%, ctx=45844, majf=0, minf=798
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=1811/w=1851/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
READ: io=28976KB, aggrb=2854KB/s, minb=2854KB/s, maxb=2854KB/s, mint=10151msec, maxt=10151msec
WRITE: io=29616KB, aggrb=2917KB/s, minb=2917KB/s, maxb=2917KB/s, mint=10151msec, maxt=10151msec
Disk stats (read/write):
sda: ios=1818/1846, merge=0/5, ticks=63776/33966, in_queue=104258, util=99.84%
其中
bw:磁盘的吞吐量,这个是顺序读写考察的重点,类似于下载速度。
iops:磁盘的每秒读写次数,这个是随机读写考察的重点
io总的输入输出量
runt:总运行时间
lat (msec):延迟(毫秒)
msec: 毫秒
usec: 微秒
蓝色方框里面的是测出的IOPS 182, 绿色方框里面是每个IO请求的平均响应时间,大约是19ms。黄色方框表示95%的IO请求的响应时间是小于等于0.5 ms。橙色方框表示该硬盘的利用率已经达到了99.84%。
当然这上面是用虚拟机模拟测试,和实际环境还是有偏差的 主要记录上面各项指标代表什么含义
踟蹰千年 发布了241 篇原创文章 · 获赞 51 · 访问量 11万+ 私信 关注