暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

白话分布式存储测试(二)熟悉测试工具

Ceph运维技巧及源码分析 2019-07-23
2442

之前工作中做了很多存储测试相关的事情,对存储测试有一些想法,最近想用几篇文章来介绍下分布式存储测试相关的一些内容,这部分内容对学习存储有很好的促进作用,这是第二篇,欢迎大家继续关注~


笔者的测试工作主要集中在linux下,用到了dd和fio两个测试工具,这里也只能介绍下这两个测试工具了。


一、dd


dd工具比较简单,没有很多参数,没有很详细的测试结果统计,能够模拟的io模式很少,所以一般用来做简单测试。关注点在单线程每秒完成多少io,或者单线程读写带宽多少。


dd命令的常用参数:


  • if,输入文件

  • of,输出文件

  • bs,读写块大小,读写块大小也可由ibs和obs单独控制

  • count,读写块数量

  • iflag,输入文件open flag,flag中的direct比较常用;direct表明绕过cache读数据

  • oflag,输出文件open flag,flag中的direct、sync、dsync比较常用;direct表明绕过cache写数据;sync表明在每次io后执行sync操作将文件的数据和元数据刷入磁盘;dsync跟sync差不多,区别在只刷数据,不刷元数据


几个常用的测试例子:


  • 绕开cache来测存储的读带宽

    dd if=/mnt/cephfs/ddlog of=/dev/null bs=4M count=256 iflag=direct


    • 绕开cache来测试存储的写带宽

      dd if=/dev/zero of=/mnt/cephfs/ddlog bs=4M count=256 oflag=direct,sync

      加了direct已经绕开了cache为什么还需要sync? 

      笔者观察到各厂商磁盘的write cache实现不一,在加direct标记后,有的厂商的磁盘仍会写入磁盘缓存而不是落盘,这里加sync来保证数据和元数据都落盘


      • 绕开cache测试存储的小数据读iops

        dd if=/mnt/cephfs/ddlog of=/dev/null bs=4K count=1024 iflag=direct


        • 绕开cache测试存储的小数据写iops

          dd if=/dev/zero of=/mnt/cephfs/ddlog bs=4K count=2014 oflag=direct,sync



          二、fio


          不同于dd,fio是个专业的测试工具,提供了丰富的参数,输出统计也更加详尽,可以模拟非常多的io模式。


          fio命令常用参数:


          rw,io模式,顺序读、随机读、顺序写、随机写

          direct,测试时是否绕开cache

          ioengine,io引擎

          iodepth,io队列深度 

          bs,读写块大小

          size,寻址空间大小

          numjobs,进程数

          runtime,运行时间

          group_reporting,测试结果汇总多个进程信息

          filename,测试文件

          directory,测试文件目录


          fio的参数非常多,这里只着重介绍几个初学者需要注意的参数:


          • ioengine,这里说下sync和libaio对于fio的区别。sync是每次提交一个io,等io完成了再提交下一个,而libaio则是一次提交多个请求,一起看这些请求是否完成。这个差别导致,sync每个请求的延时就是io在后端存储处理的延时,而libaio一次提交多个请求,这些请求后端存储未必能同时处理,如果不能同时处理,就有一部分io需要排队等待,所以libaio的io延时跟每次提交的io数量有关系。sync每次提交一个请求,后台存储的处理能力往往未能充分利用,而libaio一次提交多个请求,能用满后端存储的处理能力。sync模式下可以通过调节numjobs来同时提交请求,这样后端存储的处理能力才能充分利用。

          • iodepth,这个参数是针对libaio的,对其他的ioengine无效。iodepth可以简单理解为每次提交的io数量,调节该值,可使后端存储的处理能力得到充分利用。

          • size,这个参数在测试以机械磁盘为存储介质的的存储时,size会影响了磁盘转动的距离,因此会对随机读写产生比较大的影响。

          • filename & directory,如果numjobs为1,指定filename和directory没有区别;如果numjobs大于1,如果指定filename,多个进程会读写一个文件,如果指定directory,每个进程会在该目录下创建测试文件,读写自己的文件。


          对于fio的测试命令示例:


            fio -directory=/fuse/ -direct=1  -rw=randwrite -ioengine=libaio -bs=4k -size=2G -numjobs=16 -runtime=180 -group_reporting -name=test -fsync=1

            fio的常用测试方法,在下一节中讲解


            fio测试输出:


            fio测试输出样例

              [root@s197 ~]# fio -filename=/cephfs/bluestore/ddlog2 -direct=1  -rw=read -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=180 -group_reporting -name=test
              test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
              fio-3.1
              Starting 1 process
              ^Cbs: 1 (f=1): [R(1)][22.8%][r=14.4MiB/s,w=0KiB/s][r=3679,w=0 IOPS][eta 02m:19s]
              fio: terminating on signal 2




              test: (groupid=0, jobs=1): err= 0: pid=1850586: Thu Jul 18 17:06:15 2019
              read: IOPS=3882, BW=15.2MiB/s (15.9MB/s)(621MiB/40955msec)
              slat (usec): min=94, max=40945, avg=256.39, stdev=483.51
              clat (nsec): min=268, max=11899, avg=396.18, stdev=180.80
              lat (usec): min=95, max=40954, avg=257.01, stdev=483.52
              clat percentiles (nsec):
              | 1.00th=[ 282], 5.00th=[ 290], 10.00th=[ 294], 20.00th=[ 302],
              | 30.00th=[ 310], 40.00th=[ 314], 50.00th=[ 322], 60.00th=[ 330],
              | 70.00th=[ 346], 80.00th=[ 398], 90.00th=[ 740], 95.00th=[ 796],
              | 99.00th=[ 924], 99.50th=[ 956], 99.90th=[ 1192], 99.95th=[ 1288],
              | 99.99th=[ 2928]
              bw ( KiB/s): min=13480, max=20512, per=100.00%, avg=15547.21, stdev=1498.81, samples=81
              iops : min= 3370, max= 5128, avg=3886.78, stdev=374.72, samples=81
              lat (nsec) : 500=83.47%, 750=7.48%, 1000=8.70%
              lat (usec) : 2=0.33%, 4=0.01%, 10=0.01%, 20=0.01%
              cpu : usr=0.69%, sys=1.71%, ctx=159014, majf=0, minf=33
              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 rwt: total=159006,0,0, short=0,0,0, dropped=0,0,0
              latency : target=0, window=0, percentile=100.00%, depth=1




              Run status group 0 (all jobs):
              READ: bw=15.2MiB/s (15.9MB/s), 15.2MiB/s-15.2MiB/s (15.9MB/s-15.9MB/s), io=621MiB (651MB), run=40955-40955msec


              fio 输出解释参考 https://tobert.github.io/post/2014-04-17-fio-output-explained.html


              几个需要初学者注意的点:


              • slat (submit latency)& clat(completion latency),对于sync,提交请求后会等待结果,因此slat跟clat差别不大;使用libaio测试支持libaio的存储,提交请求会立刻返回,slat绝大多数情况下会非常小,clat会比较大。使用libaio测试不支持libaio的存储,libaio就变成了sync,slat也就跟clat差不多了。

              • clat percentiles,该统计非常有用,详细说明了io延时的分布。


              关于测试工具考虑到的点就这些了,暂时写到这了:)


              文章转载自Ceph运维技巧及源码分析,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论