//
SSD硬件测试
//
这两天有一个临时性的小任务,使用fio工具对SSD磁盘进行硬件测试,fio这个工具之前没有用过,这两天简单研究了一下这个工具,把一些常用的参数在这里说明一下。
fio工具可以对磁盘进行压力测试,通常情况下,我们比较关心的磁盘的性能指标有:
l IOPS(每秒执行的IO次数)
l bw(带宽,每秒吞吐量)
l lat(延迟,每次IO操作的延迟)
这里插入一个mysql方向的知识点,在MySQL中innodb_io_capacity这个参数是告诉innodb你的磁盘io能力的,官方文档的介绍是:
也就是说它直接代表innodb的刷盘IOPS值,所以如果你的磁盘是SSD的,可以适当调大这个值,来让你的MySQL服务性能更好。
下面来看fio这个命令基本用法:
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
其中,每个参数的意义如下:
filename | 测试文件名称,通常选择需要测试的盘的data目录下面的一个文件 |
---|---|
direct | 测试过程绕过机器自带的buffer,直接从磁盘读取数据 |
iodepth | 请求的IO队列深度 |
thread | fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程 |
rw | 测试的IO模式(顺序读、随机读、顺序写、随机写) |
bs | 单次io的块文件大小,机械盘常用大小4k、16k,SSD常用1Mb |
size | 单次写入的总数据量,4T硬盘可以写入100G数据进行测试 |
ioengine | io引擎类型,通常为psync引擎和libaio引擎 |
runtime | 测试时间,IO写入时间,如果不设置,则写入size大小 |
group_reporting | 关于显示结果的,汇总每个进程的信息 |
这里,我拿到线上某台测试服务器的一个测试报告做下结果的简单分析:
[root@ data1]# fio -filename=/data1/a.txt -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=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=psync, iodepth=1 ... fio-3.7 Starting 10 threads mytest: Laying out IO file (1 file / 500MiB) Jobs: 10 (f=10): [m(10)][100.0%][r=371MiB/s,w=370MiB/s][r=23.7k,w=23.7k IOPS][eta 00m:00s] # 进度100% mytest: (groupid=0, jobs=10): err= 0: pid=17828: Tue Oct 20 14:56:01 2020 -------------------读--------- read: IOPS=23.9k, BW=374MiB/s (392MB/s)(2500MiB/6685msec) #BW代表平均IO带宽,bandwidth clat (usec): min=32, max=2592, avg=265.90, stdev=174.83 #完成延时,命令提交到kernel到IO做完之间的时间 lat (usec): min=32, max=2593, avg=266.25, stdev=174.85 #响应时间,从IO结构体创建时刻开始,直到紧接着clat完成 clat percentiles (usec): # 完成延迟百分比 | 1.00th=[ 79], 5.00th=[ 85], 10.00th=[ 89], 20.00th=[ 99], | 30.00th=[ 111], 40.00th=[ 151], 50.00th=[ 235], 60.00th=[ 302], | 70.00th=[ 359], 80.00th=[ 424], 90.00th=[ 510], 95.00th=[ 578], | 99.00th=[ 734], 99.50th=[ 799], 99.90th=[ 955], 99.95th=[ 1037], | 99.99th=[ 1827] bw ( KiB/s): min=36480, max=40736, per=10.01%, avg=38339.94, stdev=930.12, samples=130 iops : min= 2280, max= 2546, avg=2396.25, stdev=58.13, samples=130 -------------------写--------- write: IOPS=23.9k, BW=374MiB/s (392MB/s)(2500MiB/6685msec) clat (usec): min=19, max=2488, avg=144.87, stdev=155.51 lat (usec): min=20, max=2489, avg=145.89, stdev=155.59 clat percentiles (usec): | 1.00th=[ 25], 5.00th=[ 27], 10.00th=[ 28], 20.00th=[ 30], | 30.00th=[ 32], 40.00th=[ 35], 50.00th=[ 39], 60.00th=[ 106], | 70.00th=[ 223], 80.00th=[ 297], 90.00th=[ 383], 95.00th=[ 449], | 99.00th=[ 578], 99.50th=[ 627], 99.90th=[ 742], 99.95th=[ 791], | 99.99th=[ 963] bw ( KiB/s): min=35296, max=41344, per=10.01%, avg=38340.68, stdev=1225.39, samples=130 iops : min= 2206, max= 2584, avg=2396.28, stdev=76.59, samples=130 --------------------------------- lat (usec) : 20=0.01%, 50=28.61%, 100=11.84%, 250=22.36%, 500=30.43% # 说明百分之30.43%的request延迟小于500 us(微妙) lat (usec) : 750=6.30%, 1000=0.42% # 6.30%的延迟小于750微秒 lat (msec) : 2=0.03%, 4=0.01% # 0.03%的延迟大于750微妙小于2000微妙 cpu : usr=1.95%, sys=10.77%, ctx=583855, majf=0, minf=19 # CPU利用率,用户/系统CPU占用率,进程上下文切换(context switch)次数,主要和次要(major and minor)页面错误数量(page faults)。由于测试是配置成使用直接IO,page faults数量应该极少。 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% # IO队列,iodepth设置,用来控制同一时刻发送给OS多少个IO submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% # 单个IO提交要提交的IO数 complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% # IO提交完成数 # submit和complete代表同一时间段内fio发送上去和已完成的IO数量,对于这个测试用例来说,iodepth是默认值1,所以100%的IO在同一时刻发送1次,放在1-4栏位里。 # 通常来说,只有iodepth大于1才需要关注这一部分数据 issued rwts: total=159977,160023,0,0 short=0,0,0,0 dropped=0,0,0,0 # total=r=2621440/w=0/d=0 latency : target=0, window=0, percentile=100.00%, depth=1 # 延时 # Fio可以配置一个延迟目标值,这个值可以调节吞吐量直到达到预设的延迟目标。 # 在基于时间或和容量的测试中,这行通常看起来一样。四个值分别代表预设的latency_target, latency_window, latency_percentile和iodepth。 Run status group 0 (all jobs): READ: bw=374MiB/s (392MB/s), 374MiB/s-374MiB/s (392MB/s-392MB/s), io=2500MiB (2621MB), run=6685-6685msec WRITE: bw=374MiB/s (392MB/s), 374MiB/s-374MiB/s (392MB/s-392MB/s), io=2500MiB (2622MB), run=6685-6685msec Fio支持把不同的测试聚合。例如,我可以用一个配置文件混合包含SSD和HDD,但是设置分组(group)把IO单独汇总。我现在还没涉及这个功能,但未来会用到。 Disk stats (read/write): nvme0n1: ios=155494/155498, merge=0/1, ticks=23069/2451, in_queue=25521, util=93.15%
关于这个结果的分析,都在上面的代码段里面了。
更加详细的参数分析,请使用man fio命令来查看fio命令手册。