iozone - 性能压力测试工具

Posted YoungerChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iozone - 性能压力测试工具相关的知识,希望对你有一定的参考价值。

        《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于ddfiovdbenchiozoneiometercosbench等性能负载工具,及strace等调试工具。


1 概述

        IOzone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试 Read、write、re-read、re-write、read backwards、read strided、fread、fwrite、random read、pread、mmap、aio_read、aio_write 等等不同的模式下的硬盘的性能。 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使得测试数据非常不真实。

2 安装部署

2.1 软件包安装

        第一步:下载软件包https://www.iozone.org/src/current/

[root@node1 iozone]# wget https://www.iozone.org/src/current/iozone-3-493.x86_64.rpm --no-check-certificate
--2022-08-10 09:36:09--  https://www.iozone.org/src/current/iozone-3-493.x86_64.rpm
Resolving www.iozone.org (www.iozone.org)... 38.146.202.4
Connecting to www.iozone.org (www.iozone.org)|38.146.202.4|:443... connected.
WARNING: cannot verify www.iozone.org's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
……
2022-08-10 09:36:45 (26.1 KB/s) - ‘iozone-3-493.x86_64.rpm’ saved [796324/796324]
[root@node1 iozone]#

        第二步:安装软件包

[root@node1 iozone]# rpm -ivh iozone-3-493.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:iozone-3-493                     ################################# [100%]
[root@node1 iozone]#

        第三步:检查安装是否成功

[root@node1 iozone]# /opt/iozone/bin/iozone -v
       'Iozone' Filesystem Benchmark Program
 
        Version $Revision: 3.493 $
    Compiled for 64 bit mode.
 
……

        第四步:建立便捷使用链接

[root@node1 iozone]# ln -s /opt/iozone/bin/iozone /bin/iozone
[root@node1 iozone]# iozone -v
       'Iozone' Filesystem Benchmark Program
 
        Version $Revision: 3.493 $
    Compiled for 64 bit mode.

2.2 源码包安装

        第一步:下载源码包https://www.iozone.org/src/current/

[root@node1 iozone]# wget https://www.iozone.org/src/current/iozone3_493.tgz --no-check-certificate

        第二步:安装依赖包

 [root@node1 current]# yum install -y gcc

        第三部:编译安装

[root@node1 iozone]# tar -xvf iozone3_493.tgz 
……
[root@node1 iozone]# cd iozone3_493/src/current
[root@node1 iozone]# make linux

        第四步:建立便捷使用链接

[root@node1 current]# ln -s /home/iozone/iozone3_493/src/current/iozone /bin/iozone 
[root@node1 iozone]# iozone -v

3  配置参数说明

3.1 13种测试模型

        IOzone 执行以下 13 种测试。如果您在数据库服务器上执行 iozone 测试,则可以专注于第 1 6 个测试,因为它们直接影响数据库性能。

序号

测试类型

释义

1

Read

表示读取文件系统中已存在的文件的性能。

2

Write

测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。拜这些额外信息所赐,Write的性能通常会比Re-write的性能低。

3

Re-read

测试读一个最近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。

4

Re-write

测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常比Write的性能高。

5

Random read

测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。

6

Random write

测试写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。

7

Backward read

测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑,事实上,有些应用确实这么干。MSC Nastran是一个使用倒序读文件的应用程序的一个例子。它所读的文件都十分大(大小从G级别到T级别)。尽管许多操作系统使用一些特殊实现来优化顺序读文件的速度,很少有操作系统注意到并增强倒序读文件的性能。

8

Record Re-write

测试写与覆盖写一个文件中的特定块的性能。这个块可能会发生一些很有趣的事。如果这个块足够小(比CPU数据缓存小),测出来的性能将会非常高。如果比CPU数据缓存大而比TLB小,测出来的是另一个阶段的性能。如果比此二者都大,但比操作系统缓存小,得到的性能又是一个阶段。若大到超过操作系统缓存,又是另一番结果。

9

Stride read

测试跳跃读一个文件的性能。举例如下:在0偏移量处读4Kbytes,然后间隔200Kbytes,读4Kbytes,再间隔200Kbytes,如此反复。此时的模式是读4Kbytes,间隔200Kbytes并重复这个模式。这又是一个典型的应用行为,文件中使用了数据结构并且访问这个数据结构的特定区域的应用程序常常这样做。

  许多操作系统并没注意到这种行为或者针对这种类型的访问做一些优化。同样,这种访问行为也可能导致一些有趣的性能异常。一个例子是在一个数据片化的文件系统里,应用程序的跳跃导致某一个特定的磁盘成为性能瓶颈。

10

Fread

测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。

11

Fwrite

测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。

  这个测试是写一个新文件,所以元数据的写入也是要的。

12

Freread

这个测试与上面的fread 类似,除了在这个测试中被读文件是最近才刚被读过。这将导致更高的性能,因为操作系统缓存了文件数据。

13

Frewrite

测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。

  这个测试是写入一个已存在的文件,由于无元数据操作,测试的性能会高些。

3.2 测试格式

        iozone功能很强大,当然参数也很多,但是常用的就那几个参数

[root@node1 current]# iozone -h
iozone: help mode

    Usage: iozone [-s filesize_kB] [-r record_size_kB] [-f [path]filename] [-h]
                  [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children]
                  [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x] [-o]
                  [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]
                  [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]
                  [-S cache_size] [-O] [-L cacheline_size] [-K] [-g maxfilesize_kB]
                  [-n minfilesize_kB] [-N] [-Q] [-P start_cpu] [-e] [-c] [-b Excel.xls]
                  [-J milliseconds] [-X write_telemetry_filename] [-w] [-W]
                  [-Y read_telemetry_filename] [-y minrecsize_kB] [-q maxrecsize_kB]
                  [-+u] [-+m cluster_filename] [-+d] [-+x multiplier] [-+p # ]
                  [-+r] [-+t] [-+X] [-+Z] [-+w percent dedupable] [-+y percent_interior_dedup]
                  [-+C percent_dedup_within] [-+a zero_pct]  [-+Q dedup granule size]
                  [-+M dedup+compress flag ]

参数说明

参数

释义

-a

全自动模式测试。测试记录块大小从4k到16M,测试文件从64k到512M

-A

使用自动模式虽然测试比较全面,但是比较花时间。-a选项将在文件大于32MB时停止使用低于64k一下记录块,来节省时间。-A通知iozone不要节省时间,进行所有测试。注:在3.61版本以后不建议使用,用-az代替-aA

-B

使用mmap()。这将使用mmap()接口来创建并访问所有测试用的临时文件。一些应用程序倾向于将文件当作内存的一块来看待。这些应用程序对文件执行mmap()调用,然后就可以以读写内存的方式访问那个块来完成文件I/O。

-c

计算时间将close()包括进来

-C

对mmap文件使用MSYNC(MS_ASYNC)。告诉操作系统在mmap空间的所有数据需要被异步的写到磁盘上。

-e

测试时间是包含flush(fsync, fflush)

-f filename

指定用来测试临时文件,在测试完成后将被自动删除

-F filename filename .

指定测试中每个临时文件名,文件名的数量应该和指定的进程或线程数相同

-g #

在自动模式下设置文件最大值,可以使用#k #m #g分别表示kb,mb,gb

-G

对mmap文件使用msync(MS_SYNC)。告诉操作系统在mmap空间的所有数据需要被同步的写到磁盘上

-h

显示帮助

-i #

指定运行于哪种模式测试。可以使用-i # -i # -i #进行多个测试

0=write/rewrite

1=read/re-read

2=random read/random write

3=backwards read

4=re-write-record

5=stride-read

6=fwirte/re-fwrite

7=fread/re-fread

8=random mix

9=pwrite/re-pwrite

10=pread/re-pread

11=pwritev/re-pwritev

12=preadv/re-preadv

-I

对所有文件操作使用DIRECT I/O。通知文件系统所有操作跳过缓存直接在磁盘上操作

-j #

设置访问文件的跨度为(# * 块)。stride read测试将使用这个跨度来读块

-J #(毫秒)

在每个I/O操作之前产生指定毫秒的计算延迟。看-X和-Y获取控制计算延迟的其他参数

-l #

设置程序最小进程数。在测试过程允许用户设置的最小进程或线程数。需要配合-u选项使用。

-L #

设置处理器交换信息的单位量为#(bytes)。可以加速测试。

-m

iozone将在内部使用多个缓存。一些程序反复复写一块缓存,还有就是设置多个缓存块。此参数将允许使用这两种模式。iozone默认行为是重复使用内部一个缓存。此选项将允许在内部使用多个缓存块。

-M

调用uname(),将返回字符串放在输出文件中

-n #

设置自动模式下测试文件的最小值

-N

报告结果以毫秒每操作的方式显示

-o

写方式是同步写到磁盘上

-O

报告结果以操作每秒方式显示

-q #

在自动模式下设置记录块的最大值,可以使用#k(kb),#m(mb),#g(gb)。使用-y可以设置最小值

-r #

设置记录块大小为#

-R

使用Excel显示结果

-s #

设置测试文件大小

-S #

设置处理器的缓存大小

-t #

设置测试程序的线程或进程数

-T

使用POSIX的pthreads进行测试

-u #

设置最大进程或线程数,需要配合-l参数使用

-U mountpoint

在测试开始之前,iozone将unmount和remount挂载点。这将保证测试中缓存不包含任何文件

-w

在测试结束后不要删除临时文件。临时文件将在测试过后保存下来

-W

在测试过程中,当读或写文件时锁住文件

-y #

设置记录块最小值

-z

同-a一起使用,进行全部测试

-Z

允许mmap I/O和file I/O混合使用

4 测试案例和结果解析

4.1 使用默认值运行所有 IOZone 测试

        -a 选项代表自动模式。这会创建大小从 64k 到 512MB 的临时测试文件,用于性能测试。此模式还使用 4k 到 16M 的记录大小进行读写(稍后会详细介绍)测试。

        -a 选项还将执行所有 13 种类型的测试。

./iozone -a

        iozone 输出的第一组包含标题信息,其中显示有关 iozone 实用程序的信息,以及用于生成此报告的所有 iozone 选项,如下所示。

Iozone: Performance Test of File I/O
        Version $Revision: 3.394 $
    Compiled for 32 bit mode.
    Build: linux 

Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
             Al Slater, Scott Rhine, Mike Wisner, Ken Goss

Run began: Sat Apr 23 12:25:34 2011

Auto Mode
Command line used: ./iozone -a
Output is in Kbytes/sec
Time Resolution = 0.000001 seconds.
Processor cache size set to 1024 Kbytes.
Processor cache line size set to 32 bytes.
File stride size set to 17 * record size.

        输出的第二部分包含各种测试的输出值(以每秒为单位)。

第 1 列 KB:表示用于测试的文件大小。

第 2 列 reclen:表示用于测试的记录长度。

直到最后一列的第 3 列:表示执行的各种测试及其每秒输出值。

                               random  random    bkwd   record   stride                                   
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
  64       4  495678  152376  1824993  2065601 2204215  875739  582008   971435   667351   383106   363588  566583   889465
  64       8  507650  528611  1051124  1563289 2071399 1084570 1332702  1143842  2138827  1066172  1141145 1303442  2004783
  64      16  587283 1526887  2560897  2778775 2366545 1122734 1254016   593214  1776132   463919  1783085 3214531  3057782
  64      32  552203  402223  1121909  1388380 1162129  415722  666360  1163351  1637488  1876728  1685359  673798  2466145
  64      64  551580 1122912  2895401  4911206 2782966 1734491 1825933  1206983  2901728  1207235  1781889 2133506  2780559
 128       4  587259 1525366  1801559  3366950 1600898 1391307 1348096   547193   666360   458907  1486461 1831301  1998737
 128       8  292218 1175381  1966197  3451829 2165599 1601619 1232122  1291619  3273329  1827104  1162858 1663987  1937151
 128      16  650008  510099  4120180  4003449 2508627 1727493 1560181  1307583  2203579  1229980   603804 1911004  2669183
 128      32  703200 1802599  2842966  2974289 2777020 1331977 3279734  1347551  1152291   684197   722704  907518  2466350
 128      64  848280 1294308  2288112  1377038 1345725  659686 1997031  1439349  2903100  1267322  1968355 2560063  1506623
 128     128  902120  551579  1305206  4727881 3046261 1405509 1802090  1085124  3649539  2066688  1423514 2609286  3039423
...

4.2 使用iozone -b将输出保存到电子表格

        要将iozone输出保存到电子表格,请使用 -b 选项,如下所示。-b 代表二进制,它指示 iozone 以二进制格式将测试输出写入电子表格。

./iozone -a -b output.xls

        注意:-b 选项可以与下面提到的任何示例一起使用。

        从电子表格中保存的数据中,您可以使用电子表格工具的图形功能创建一些漂亮的图形。以下是从 iozone 输出创建的示例图。

4.3 使用iozone -i仅运行特定类型的测试

        如果您对只运行特定类型的测试感兴趣,请使用 -i 选项。

句法:

iozone -i [test-type]

        测试类型是一个数值。以下是各种可用的测试类型及其数值。

  • 0=write/rewrite
  • 1=read/re-read
  • 2=random-read/write
  • 3=Read-backwards
  • 4=Re-write-record
  • 5=stride-read
  • 6=fwrite/re-fwrite
  • 7=fread/Re-fread,
  • 8=random mix
  • 9=pwrite/Re-pwrite
  • 10=pread/Re-pread
  • 11=pwritev/Re-pwritev
  • 12=preadv/Re-preadv

        以下示例将仅运行写入测试(即写入和重写)。正如您从输出中看到的,其他列是空的。

$ ./iozone -a -i 0
                                                random  random    bkwd   record   stride                                   
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
  64       4  353666  680969                                                                                
  64       8  477269  744768                                                                                            
  64      16  429574  326442                                                                                            
  64      32  557029  942148                                                                                            
  64      64  680844  633214                                                                                            
 128       4  187138  524591

        结合多种 iozone 测试类型

        您还可以通过在命令行中指定多个 -i 来组合多种测试类型。
        例如,以下示例将测试读取和写入测试类型。

$ ./iozone -a -i 0 -i 1
                                                random  random    bkwd   record   stride                                   
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
  64       4  372112  407456  1520085   889086                                                                          
  64       8  385574  743960  3364024  2553333                                                                          
  64      16  496011  397459  3748273  1330586                                                                          
  64      32  499600  876631  2459558  4270078

4.4 使用iozone -s指定文件大小

        默认情况下,iozone 会自动创建大小从 64k 到 512M 的临时文件,以执行各种测试。

        iozone 输出中的第一列(带有列标题 KB)表示文件大小。正如您从之前的输出中看到的,它从 64KB 文件开始,并且会不断增加直到 512M(每次文件大小都翻倍)。

        您可以使用选项 -s 指定文件大小,而不是对所有文件大小运行测试。

        以下示例将只对文件大小为 1MB(即 1024KB)的文件执行写入测试。

$ ./iozone -a -i 0 -s 1024
                                                random  random    bkwd   record   stride   
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
1024       4  469710  785882        
1024       8  593621 1055581 
1024      16  745286 1110539 
1024      32  610585 1030184 
1024      64  929225 1590130
1024     128 1009859 1672930 
1024     256 1042711 2039603 
1024     512  941942 1931895 
1024    1024 1039504  706167

4.5 使用iozone -r指定测试的记录大小

        当您运行测试时,对于特定的文件大小,它会使用从 4k 到 16M 的不同记录大小进行测试。
如果您喜欢对托管 oracle 数据库的 I/O 子系统进行 I/O 性能测试,您可能希望将 iozone 中的记录大小设置为与 DB 块大小相同的值。数据库根据 DB 块大小进行读写。

        reclen 代表记录长度。在前面的示例中,第 2 列(列标题为“reclen”)表示应该用于测试 IOzone 的记录长度。在前面的示例输出中,对于 1024KB 的文件大小,iozone 测试使用从 4k 16M 的各种记录大小来执行写入测试。

        除了使用所有这些默认记录长度大小外,您还可以指定要测试的记录大小。

        下面的示例将仅对 32k 的记录长度运行写入测试。在输出中,第二列现在将只显示 32。

$ ./iozone -a -i 0 -r 32
                                                random  random    bkwd   record   stride  
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
  64      32  566551  820553          
 128      32  574098 1000000        
 256      32  826044  948043        
 512      32  801282 1560624        
1024      32  859116  528901         
2048      32  881206 1423096

4.6 结合文件大小和记录大小

        您还可以同时使用 -s 和 -r 选项来指定确切的临时文件大小和需要测试的确切记录长度。
比如下面会使用一个2M的文件,记录长度为1M的运行写测试

$ ./iozone -a -i 0 -s 2048 -r 1024
                                                random  random    bkwd   record   stride                                   
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
2048    1024 1065570 1871841

4.7 使用iozone -t进行吞吐量测试

        要在吞吐量模式下执行 iozone,请使用 -t 选项。您还应该指定在此测试期间需要处于活动状态的线程数。

        以下示例将使用 2 个线程对写入执行 iozone 吞吐量测试。请注意,您不能将 -a 选项与 -t 选项结合使用。

$ ./iozone -i 0 -t 2

Children see throughput for  2 initial writers 1=  433194.53 KB/sec
Parent sees throughput for  2 initial writers     =    7372.12 KB/sec
Min throughput per process             =       0.00 KB/sec 
Max throughput per process             =  433194.53 KB/sec
Avg throughput per process             =  216597.27 KB/sec
Min xfer                     =       0.00 KB

Children see throughput for  2 rewriters     =  459924.70 KB/sec
Parent sees throughput for  2 rewriters     =   13049.40 KB/sec
Min throughput per process             =  225610.86 KB/sec 
Max throughput per process             =  234313.84 KB/sec
Avg throughput per process             =  229962.35 KB/sec
Min xfer                     =     488.00 KB

        要为所有测试类型执行吞吐量,请从上面的示例中删除“-i 0”,如下所示。

$ ./iozone -t 2

4.8 使用iozone -+u包含CPU使用率

        在执行 iozone 测试时,您还可以使用 -+u 选项指示 iozone 收集 CPU 利用率。

        选项前面的 -+ 可能看起来有点奇怪。但是,您必须给出整个 -+u(不仅仅是 -u 或 +u)才能使其正常工作。

        以下示例将执行所有测试,并将 CPU 利用率报告作为它生成的 Excel 电子表格输出的一部分。

$ ./iozone -a -+u -b output.xls

        注意:这将为它执行的每个测试显示单独的 CPU 利用率。

4.9 使用iozone -g增加文件大小

        这个很重要。如果您的系统有超过 512MB 的 RAM,您应该增加 iozone 用于测试的临时文件大小。如果不这样做,您可能无法获得准确的结果,因为系统缓冲区缓存将在其中发挥作用。
为了获得准确的磁盘性能,建议将临时文件大小设置为系统缓冲区缓存大小的 3 倍。

        以下示例将通过将最大文件大小增加到 2GB 来运行 iozone,并为写入测试运行自动 iozone 测试。

$ ./iozone -a -g 2G -i 0
                                                random  random    bkwd   record   stride  
  KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
  64       4  556674 1230677       
  64       8  278340  441320      
  64      16  608990 1454053    
  64      32  504125 1085411      
  64      64  571418 1279331    
 128       4  526602  961764    
 128       8  714730  518219       

4.10 使用iozone -F一起测试多个挂载点

        通过组合几个 iozone 选项,您可以在多个挂载点上执行磁盘 I/O 测试,如下所示。
如果您有 2 个挂载点,则可以启动 2 个不同的 iozone 线程以在这两个挂载点上创建临时文件以进行测试,如下所示。

$ ./iozone -l 2 -u 2 -r 16k -s 512M -F /u01/tmp1 /u02/tmp2

        -l 表示应该启动的最小iozone进程数

        -u 表示应该启动的最大iozone进程数

        -F 应该包含多个值。即如果我们在 -l 和 -u 中都指定 2,我们应该在这里有两个文件名。请注意,只有挂载点需要存在。-F 选项中指定的文件不需要存在,因为 iozone 将在测试期间创建此临时文件。在上面的示例中,挂载点是 /u01 和 /u02。文件 tmp1 和 tmp2 将由 iozone 自动创建用于测试目的。

5 测试结果解析

        见测试案例中描述。

6 参考资料

[01]https://blog.csdn.net/qq_34018840/article/details/94449879
[02]https://bbs.huaweicloud.com/blogs/345602


 

以上是关于iozone - 性能压力测试工具的主要内容,如果未能解决你的问题,请参考以下文章

性能测试和压力测试

学习使用Jmeter做压力测试--压力测试基本概念

性能测试负载测试压力测试的异同

性能测试,负载测试,压力测试 区别

刷题面筋-测开-比较压力测试负载测试性能测试

压力/负载/性能测试之间的区别