Linux系统IO基准测试方法
顺序读写测试
主要关注磁盘的吞吐量,即每秒能够读入或者写出多少数据。普通单块机械磁盘顺序写在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)