[转帖]Linux系统IO基准测试方法

linux,系统,io,基准,测试方法 · 浏览次数 : 0

小编点评

| Hardware | IOPS | |---|---| | 100.00% | 36.4k+15.7k | | 32.00% | 11.2k+4.9k | | 32.00% | 479 MB/s |

正文

https://www.cnblogs.com/wangzhen3798/p/13631848.html

 

顺序读写测试

主要关注磁盘的吞吐量,即每秒能够读入或者写出多少数据。普通单块机械磁盘顺序写在100MB/s左右,普通单块SSD的顺序写在500MB/s左右。该指标对MQ、ES等以append方式追加数据的软件性能影响比较大

测试方法

  • 安装软件
    默认情况下操作系统自带dd命令,不用安装

  • 运行命令:

    dd if=/dev/zero of=/home/wangzhen/ddtest/test.dbf bs=32k count=256k  conv=fdatasync
    
  • 参数含义:

    • bs=< 字节数 > 将 ibs( 输入 ) 与 obs( 输出 ) 设成指定的字节数。
    • cbs=< 字节数 > 转换时,每次只转换指定的字节数。
    • conv=< 关键字 > 指定文件转换的方式。
    • count=< 区块数 > 仅读取指定的区块数。
    • ibs=< 字节数 > 每次读取的字节数。
    • if=< 文件 > 从文件读取。
    • obs=< 字节数 > 每次输出的字节数。
    • of=< 文件 > 输出到文件。
    • seek=< 区块数 > 一开始输出时,跳过指定的区块数。
    • skip=< 区块数 > 一开始读取时,跳过指定的区块数。
    • --help 帮助。
    • --version 显示版本信息。
  • 测试结果:

    [wangzhen@wangzhen-pc ddtest]$ dd if=/dev/zero of=/home/wangzhen/ddtest/test.dbf   bs=32k count=256k    conv=fdatasync
    记录了262144+0 的读入
    记录了262144+0 的写出
    8589934592 bytes (8.6 GB, 8.0 GiB) copied, 18.0831 s, 475 MB/s
    
  • 备注:

通过fio将参数设置为rw=write时也可以达到dd测试顺序读写的效果,且测试值基本和dd一样(阿里的方法).

fio -directory=/data/mytest.img -ioengine=sync -direct=1 -bs=1024k -iodepth=64 -rw=write -size=2G -numjobs=1 -time_based=1 -runtime=120s -group_reporting -name=mytest

随机读写测试

主要关注IOPS指标,即每秒磁盘能够处理的IO请求个数。普通单块机械磁盘的IOPS在100~300左右,普通SSD的IOPS在几万左右,该指标对关系型数据库等以随机读写为主的软件性能影响比较大。

测试方法

  • 安装fio测试软件
yum install -y fio
  • 运行命令:
fio -directory=/home/wangzhen/fiotest -name=tempfile.dat -direct=1 -rw=randrw -rwmixwrite=30 -bs=8k -size=4M -numjobs=16 -time_based -runtime=100 -group_reporting
  • 参数含义:

    • filename: 指定文件(设备)的名称。可以通过冒号分割同时指定多个文件,

      如filename=/dev/sda:/dev/sdb。

    • directory: 设置filename的路径前缀。在后面的基准测试中,采用这种方式来指定设备。

    • name: 指定job的名字,在命令行中表示新启动一个job。

    • direct: bool类型,如果设置成true (1),表示不使用io buffer。

    • ioengine: I/O引擎,现在fio支持19种ioengine。默认值是sync同步阻塞I/O,libaio是Linux的native异步I/O。

    • iodepth: 如果ioengine采用异步方式,该参数表示一批提交保持的io单元数。该参数可参考文章“Fio压测工具和io队列深度理解和误区”。

    • rw: I/O模式,分顺序读 -rw=read ,随机读 -rw=randread,顺序写 -rw=write,随机写-rw=randwrite ,混合随机读写模式 -rw=randrw

    • bs: I/O block大小,默认是4k。

    • size: 指定job处理的文件的大小。

    • numjobs: 指定job的克隆数(线程)。

    • time_based: 如果在runtime指定的时间还没到时文件就被读写完成,将继续重复知道runtime时间结束。

    • runtime: 指定在多少秒后停止进程。如果未指定该参数,fio将执行至指定的文件读写完全完成。

    • rwmixwrite: 在混合读写的模式下,写占比,如:
      rwmixwrite=30 #在混合读写的模式下,写占30%

    • group_reporting: 当同时指定了numjobs了时,输出结果按组显示。

  • 测试结果:

    Jobs: 16 (f=16): [m(16)][100.0%][r=285MiB/s,w=123MiB/s][r=36.4k,w=15.7k IOPS][eta 00m:00s]
    tempfile.dat: (groupid=0, jobs=16): err= 0: pid=24847: Tue Sep  8 12:37:29 2020
      read: IOPS=37.7k, BW=294MiB/s (309MB/s)(28.8GiB/100004msec)
        clat (usec): min=56, max=9583, avg=336.41, stdev=191.05
         lat (usec): min=56, max=9583, avg=336.61, stdev=191.06
        clat percentiles (usec):
         |  1.00th=[  184],  5.00th=[  229], 10.00th=[  253], 20.00th=[  273],
         | 30.00th=[  277], 40.00th=[  293], 50.00th=[  297], 60.00th=[  310],
         | 70.00th=[  326], 80.00th=[  347], 90.00th=[  437], 95.00th=[  578],
         | 99.00th=[  857], 99.50th=[ 1205], 99.90th=[ 2900], 99.95th=[ 3621],
         | 99.99th=[ 4686]
       bw (  KiB/s): min=169600, max=325127, per=100.00%, avg=301510.55, stdev=1517.27, samples=3194
       iops        : min=21200, max=40640, avg=37688.66, stdev=189.66, samples=3194
      write: IOPS=16.2k, BW=126MiB/s (133MB/s)(12.3GiB/100004msec); 0 zone resets
        clat (usec): min=30, max=8153, avg=198.82, stdev=123.40
         lat (usec): min=30, max=8153, avg=199.23, stdev=123.42
        clat percentiles (usec):
         |  1.00th=[   44],  5.00th=[   74], 10.00th=[  102], 20.00th=[  143],
         | 30.00th=[  174], 40.00th=[  190], 50.00th=[  204], 60.00th=[  210],
         | 70.00th=[  223], 80.00th=[  231], 90.00th=[  245], 95.00th=[  265],
         | 99.00th=[  502], 99.50th=[  693], 99.90th=[ 1926], 99.95th=[ 2073],
         | 99.99th=[ 3425]
       bw (  KiB/s): min=70224, max=148445, per=100.00%, avg=129465.94, stdev=730.12, samples=3194
       iops        : min= 8778, max=18555, avg=16182.78, stdev=91.26, samples=3194
      lat (usec)   : 50=0.49%, 100=2.26%, 250=31.37%, 500=60.47%, 750=4.00%
      lat (usec)   : 1000=0.84%
      lat (msec)   : 2=0.33%, 4=0.21%, 10=0.03%
      cpu          : usr=1.12%, sys=3.88%, ctx=5396973, majf=0, minf=182
      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 rwts: total=3769009,1618382,0,0 short=0,0,0,0 dropped=0,0,0,0
         latency   : target=0, window=0, percentile=100.00%, depth=1
    
    Run status group 0 (all jobs):
       READ: bw=294MiB/s (309MB/s), 294MiB/s-294MiB/s (309MB/s-309MB/s), io=28.8GiB (30.9GB), run=100004-100004msec
      WRITE: bw=126MiB/s (133MB/s), 126MiB/s-126MiB/s (133MB/s-133MB/s), io=12.3GiB (13.3GB), run=100004-100004msec
    
    Disk stats (read/write):
        dm-2: ios=3763596/1616571, merge=0/0, ticks=1205457/296320, in_queue=1501777, util=99.37%, aggrios=3769528/1618669, aggrmerge=740/285, aggrticks=1206427/295628, aggrin_queue=33881, aggrutil=99.40%
      sda: ios=3769528/1618669, merge=740/285, ticks=1206427/295628, in_queue=33881, util=99.40%
    

总结

  • 我本机8K块随机读写的IOPS=36.4k+15.7k,大约是52k,即每秒处理5万次IO请求

    Jobs: 16 (f=16): [m(16)][100.0%][r=285MiB/s,w=123MiB/s][r=36.4k,w=15.7k IOPS][eta 00m:00s]

  • 我本机32K块随机读写的IOPS=11.2k+4.9k,大约是16k,即每秒处理1.6万次IO请求

    Jobs: 16 (f=16): [m(16)][100.0%][r=351MiB/s,w=155MiB/s][r=11.2k,w=4954 IOPS][eta 00m:00s]

  • 我本机32K块的顺序写速度为479MB/s

    838860800 bytes (839 MB, 800 MiB) copied, 1.75207 s, 479 MB/s

  • 顺序读写要测大文件(bs=1024k),随机对写要测小文件(bs=4k)

与[转帖]Linux系统IO基准测试方法相似的内容:

[转帖]Linux系统IO基准测试方法

https://www.cnblogs.com/wangzhen3798/p/13631848.html 顺序读写测试 主要关注磁盘的吞吐量,即每秒能够读入或者写出多少数据。普通单块机械磁盘顺序写在100MB/s左右,普通单块SSD的顺序写在500MB/s左右。该指标对MQ、ES等以append方式

[转帖]怎样设计异步系统: Linux Native AIO vs io_uring

https://zhuanlan.zhihu.com/p/149836046 Linux native aio一方面有其实用价值, 基本满足了特别业务比如大型数据库系统对异步io的需求, 另一方面却被总是被诟病, 既不完美也不通用, 究其原因在于设计异步系统的理念. AIO的需求 aio最核心的需求

[转帖]Linux系统top命令中的io使用率,很多人都误解了它的具体含义

https://baijiahao.baidu.com/s?id=1641356547223820839&wfr=spider&for=pc 最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题。那么,接下来就该测试性能了。输入 top 命令,的确可以看到一系列 cpu

[转帖]linux磁盘IO读写性能优化

在LINUX系统中,如果有大量读请求,默认的请求队列或许应付不过来,我们可以 动态调整请求队列数来提高效率,默认的请求队列数存放在/sys/block/xvda/queue/nr_requests 文件中,注意:/sys/block/xvda ,这里 xvda 写的是你自己的硬盘名,因我的是vps所

[转帖]linux后台开发必知的io优化知识总结

系统学习 IO性能对于一个系统的影响是至关重要的。一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO。而IO性能的发展,明显落后于CPU的发展。Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能。 IO

[转帖]linux后台开发必知的io优化知识总结

系统学习 IO性能对于一个系统的影响是至关重要的。一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO。而IO性能的发展,明显落后于CPU的发展。Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能。 IO

[转帖]Linux Storage Stack Diagram - Linux I/O系统

https://www.cnblogs.com/xuyaowen/p/linux-io-system.html 今天看到一篇文章,其中有几张图很有意思,进行记录一下,我相信如果你对IO子系统有初步了解的话,将会有一些收获: Linux 存储栈:涉及比较全面,分为文件系统层,块层,设备层三层; 对上图

[转帖]linux块I/O总体概括

直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备。固定大小的数据片称为块。常见的块设备就是硬盘了。不能随机访问的就是字符设备了,管理块设备比字符设备要复杂很多。 块设备中最小的可寻址单元是扇区,一般是2的整数倍,最常见的是512字节。不过很多CD-

[转帖]etcd的安装教程

Linux 系统中,下载最新版本的ETCD Releases · etcd-io/etcd · GitHub 一.下载方式 ETCD_VER=v3.5.3 # choose either URLGOOGLE_URL=https://storage.googleapis.com/etcdGITHUB_

[转帖]IO测试工具之fio详解

目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。 fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。 如下是在Li