原力注入

文件性能测试工具 IOzone 使用简介

书籍推荐

相关原理参考《性能之巅》和 《BPF之巅》的第八章文件系统:

Image

I/O 栈

Image

Cache 


0. IOzone 简介

IOzone 是一款用于文件系统性能基准测试的开源工具。它可以帮助用户评估文件系统在不同操作模式下的性能,特别是用于磁盘 I/O 操作。IOzone 支持多种操作系统,包括 Linux、Unix 和 Windows,并提供了多种测试模式来测量不同类型的文件操作性能,如读取、写入、随机访问和异步 I/O。

IOzone 执行以下操作来测试文件 I/O 性能:

1. 写入(Write)

  • • 目的:衡量写入新文件的性能。

  • • 说明:此测试在文件系统中创建一个新文件,并将数据写入该文件。除了数据写入外,还涉及将数据的位置和其他元数据存储到磁盘。

  • • 影响因素:

    • • 写入性能受磁盘速度、文件系统类型、磁盘缓存和操作系统的元数据处理影响。

    • • 由于需要存储元数据,初次写入的性能通常低于重写文件。

2. 重写(Re-write)

  • • 目的:衡量重写已存在文件的性能。

  • • 说明:此测试在已经存在的文件上执行写入操作。由于文件的元数据已存在,因此写入操作所需的工作量较少。

  • • 影响因素:

    • • 重写操作通常比初次写入快。

    • • 性能可能会受到文件系统如何管理已存在文件的影响。

3. 读取(Read)

  • • 目的:衡量读取已存在文件的性能。

  • • 说明:此测试从文件系统中读取已存在的文件,评估磁盘的读取速度。

  • • 影响因素:

    • • 读取性能通常受磁盘速度、操作系统缓存和磁盘缓存的影响。

    • • 如果文件数据已被缓存,读取速度会显著提高。

4. 重读(Re-Read)

  • • 目的:衡量重读最近读取过的文件的性能。

  • • 说明:通过读取一个最近已被读取的文件来测量性能。操作系统通常会为最近读取的文件数据维护缓存。

  • • 影响因素:

    • • 重读性能通常高于首次读取。

    • • 缓存命中率直接影响重读性能。

5. 随机读取(Random Read)

  • • 目的:衡量随机访问文件不同位置时的读取性能。

  • • 说明:在此测试中,文件被随机访问,评估文件系统和磁盘在非顺序读取操作下的表现。

  • • 影响因素:

    • • 随机读取性能受操作系统缓存、磁盘寻址时间、硬盘数量、寻址延迟等多种因素的影响。

6. 随机写入(Random Write)

  • • 目的:衡量随机写入文件不同位置时的性能。

  • • 说明:此测试向文件的随机位置写入数据,评估文件系统和磁盘在随机写操作下的性能表现。

  • • 影响因素:

    • • 性能受操作系统缓存、磁盘寻址时间、寻址延迟和文件系统的影响。

7. 随机混合(Random Mix)

  • • 目的:衡量在文件中随机位置同时进行读取和写入操作的性能。

  • • 说明:结合随机读取和写入操作,模拟应用程序中的混合 I/O 模式。

  • • 影响因素:

    • • 线程/进程数量、操作系统缓存大小和磁盘寻址延迟等。

8. 倒序读取(Backwards Read)

  • • 目的:衡量倒序读取文件的性能。

  • • 说明:读取文件的倒序数据,模拟一些特定应用对文件的访问方式。

  • • 影响因素:

    • • 操作系统对倒序读取的优化较少。

9. 记录重写(Record Rewrite)

  • • 目的:衡量在文件中特定位置进行写入和重写操作的性能。

  • • 说明:针对文件中特定位置进行写入和重写操作。

  • • 影响因素:

    • • 性能受数据块大小、CPU 数据缓存、操作系统缓存等影响。

10. 跨步读取(Strided Read)

  • • 目的:衡量文件的跨步访问读取性能。

  • • 说明:模拟一种跨步读取模式,读取文件的指定偏移量。

  • • 影响因素:

    • • 操作系统通常不优化这种访问模式。

11. Fwrite(fwrite 写入)

  • • 目的:衡量使用 fwrite() 库函数写入文件的性能。

  • • 说明:fwrite() 是执行缓冲写操作的库函数。

  • • 影响因素:

    • • 性能受缓冲区大小和操作系统缓存的影响。

12. Frewrite(fwrite 重写)

  • • 目的:衡量使用 fwrite() 写入已存在文件的性能。

  • • 说明:写入已存在的文件,通常不需要处理元数据。

  • • 影响因素:

    • • 性能主要受缓冲区大小和 I/O 优化影响。

13. Fread(fread 读取)

  • • 目的:衡量使用 fread() 库函数读取文件的性能。

  • • 说明:fread() 是执行缓冲读取操作的库函数。

  • • 影响因素:

    • • 性能受操作系统缓存和缓冲区大小等影响。

14. Freread(fread 重读)

  • • 目的:衡量使用 fread() 读取最近读取过的文件的性能。

  • • 说明:文件数据已被缓存,性能通常更高。

  • • 影响因素:

    • • 缓存命中率显著提高性能。

15. Mmap(内存映射)

  • • 目的:衡量使用 mmap() 进行 I/O 操作的性能。

  • • 说明:mmap() 将文件映射到用户的地址空间。

  • • 影响因素:

    • • 性能受操作系统对内存映射的处理方式影响。

16. 异步 I/O(Async I/O)

  • • 目的:衡量使用 POSIX 异步 I/O 进行文件操作的性能。

  • • 说明:使用异步 I/O 接口(如 aio_write())允许后台执行 I/O 操作。

  • • 影响因素:

    • • 性能受操作系统对异步 I/O 调度的实现方式影响。

1. 下载及安装

1.1 下载

官方地址: http://www.iozone.org/。

wget https://www.iozone.org/src/current/iozone3_506.tar

  # 文件内容
find . -type f
./src/current/gnuplot.dem
./src/current/Gnuplot.txt
./src/current/report.pl
./src/current/libbif.c
./src/current/iozone.c
./src/current/Android_Readme.md
./src/current/Generate_Graphs
./src/current/fileop_linux.o
./src/current/iozone_linux.o
./src/current/Application.mk
./src/current/fileop.c
./src/current/write_telemetry
./src/current/gnu3d.dem
./src/current/client_list
./src/current/spec.in
./src/current/fileop
./src/current/read_telemetry
./src/current/libasync.c
./src/current/gnuplotps.dem
./src/current/libasync.o
./src/current/makefile
./src/current/pit_server.c
./src/current/pit_server
./src/current/gengnuplot.sh
./src/current/Changes.txt
./src/current/pit_server.o
./src/current/Android.mk
./src/current/iozone_visualizer.pl
./src/current/iozone
./src/current/libbif.o
./docs/IOzone_msword_98.doc
./docs/Iozone_ps.gz
./docs/Run_rules.doc
./docs/License.txt
./docs/iozone.1
./docs/IOzone_msword_98.pdf

1.2 编译并安装

tar xvf iozone3_506.tar       #解压(注意不要有中文名目录)
cd iozone3_506/src/current    #进入安装目录
make linux                    #安装

 ls -lh iozone
-rwxr-xr-x 1 root root 358K Dec 20 13:53 iozone

1.3 IOzone 测试项

IOzone 执行以下 13 种测试:

指标描述
Read读取文件系统中已存在文件的性能。
Write写入新文件的性能。包括存储数据和元数据(目录信息、分配空间等)。由于处理元数据,性能通常比 Re-write 低。
Re-read再次读取文件的性能。由于操作系统缓存了最近读过的文件,性能会更高。
Re-write写入现有文件的性能。因为元数据已存在,性能通常高于 Write。
Random Read从文件中随机读取信息的性能,与顺序读取不同。
Random Write在文件随机位置写入信息的性能,与顺序写入不同。
Backward Read倒序读取文件的性能。少数应用(如 MSC Nastran)会用到此方法,通常用于处理大文件。
Record Re-Write覆盖写文件中特定块的性能。块大小对性能的影响:
- 小于 CPU 缓存:性能很高
- 超过 CPU 缓存但小于 TLB:性能较高
- 超过 TLB 但小于 OS 缓存:性能中等
- 超过 OS 缓存:性能较低。
Stride Read跳跃读取文件的性能。例如:读取 4K 字节,间隔 200K 字节后再次读取 4K 字节,如此反复。这种模式常见于访问文件中特定数据结构区域的应用程序。
Fread使用库函数 fread() 读取文件的性能。通过缓存和阻塞 I/O,在需要小传输块时减少系统调用次数并提高性能。
Fwrite使用库函数 fwrite() 写入文件的性能。通过缓存和阻塞 I/O,在需要小传输块时减少系统调用次数并提高性能。
Freread与 fread() 类似,但文件数据已被读取且缓存,性能更高。
Frewrite与 fwrite() 类似,测试缓存后的写入性能。

2. IOzone 参数介绍

接下来解释每个参数的用法。

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 ] [-+e Enable sparse files
参数参数含义
-a使用全自动模式,生成包括所有测试操作的报告,块大小从 4k 到 16M,文件大小从 64k 到 512M。
-A提供更全面的自动模式测试,文件大小大于 32MB 时自动停止小于 64K 的块大小测试。推荐使用 -az -i 0 -i 1 替代。
-b filename创建一个兼容 Excel 的二进制格式文件,输出结果保存至指定文件。
-B使用 mmap() 文件接口,模拟将文件作为内存块进行访问。
-c在计算时间时包括 close() 操作,主要用于调试 NFS v3 等协议的相关问题。
-C显示吞吐量测试中每个客户端传输的字节数,有助于调试操作系统的 I/O 或进程管理问题。
-d #设置“壁垒”时的微秒级延迟,在吞吐量测试时挂起所有线程/进程,允许一定延迟后释放。
-D对 mmap 文件使用 msync(MS_ASYNC),数据异步写入磁盘。
-e计算时间时将 flush (fsync, fflush) 操作包括进来。
-E进行扩展测试,仅在部分平台上可用,使用 pread 接口。
-f filename指定临时文件的文件名,在使用 unmount 参数时特别有用。
-F filename指定吞吐量测试中每个临时文件的文件名,文件名数量应与进程或线程数匹配。
-g #设置自动模式使用的最大文件大小(Kbytes)。
-G对 mmap 文件使用 msync(MS_SYNC),同步写入数据到磁盘。
-h显示帮助信息。
-H #使用 POSIX 异步 I/O 接口的指定异步操作,适用于需要高效异步 I/O 的应用程序。
-i #指定运行的测试类型,0 为写入/重写,1 为读取/重读,依此类推。
-I所有文件操作启用 VxFS VX_DIRECT、O_DIRECT 或 O_DIRECTIO 模式,绕过操作系统缓存,直接与磁盘交互。
-j #设置访问文件的跨度(块大小的倍数),用于 stride read 测试。
-J #在每个 I/O 操作前引入计算延迟(毫秒)。
-k #使用 POSIX 异步 I/O (无 bcopy) 执行异步操作。
-K在普通测试时生成一些随机访问。
-l #设置运行的最小进程数或线程数,用于吞吐量测试时指定最少的线程数。
-L #设置处理器缓存行大小,帮助加速测试过程。
-m使用多个缓冲区进行内部操作,模拟多种应用程序类型。
-M调用 uname() 并将结果存入输出文件。
-n #设置自动模式使用的最小文件大小(Kbytes)。
-N以毫秒每操作的方式显示结果。
-o写操作时使用同步方式,强制所有写操作完全写入磁盘后返回。
-O以每秒操作次数的方式显示结果。
-p每次文件操作前清除处理器缓存,测试内存子系统性能。
-P #将进程或线程绑定到指定 CPU,从该 CPU 开始,使用轮询方式分配。
-q #设置自动模式下使用的最大块大小(Kbytes)。
-Q创建偏移量/延迟文件,记录延迟与偏移量的数据,适合绘制图表分析。
-r #设置测试块大小(Kbytes)。
-R生成兼容 Excel 的报告文件,用于绘制文件系统性能图表。
-s #设置测试文件大小(Kbytes)。
-S #设置处理器缓存大小,帮助对齐缓冲区和清除功能。
-t #启动吞吐量模式,指定使用的进程或线程数。
-T在吞吐量测试时使用 POSIX 线程,仅在支持 POSIX 线程的平台上可用。
-u #设置运行的最大进程数或线程数,用于吞吐量测试时指定最大线程数。
-U mountpoint在每次测试前卸载并重新挂载挂载点,确保缓存不包含已测试的文件。
-v显示 Iozone 版本号。
-V #指定用于写入临时文件的模式,并验证读写测试中的准确性。
-w测试结束后不删除临时文件,留在文件系统中。
-W在读/写时锁定文件。
-x关闭 Iozone 的“stone-walling”机制,允许并行测试。
-X filename使用指定文件记录写操作的时间延迟信息。
-y #设置自动模式下使用的最小块大小(Kbytes)。
-Y filename使用指定文件记录读操作的时间延迟信息。
-z强制在自动模式下包含小记录大小的测试。
-Z启动混合 mmap I/O 和文件 I/O 模式。
-+m filename使用此文件获取集群测试的客户端配置信息。
-+u启用 CPU 利用率模式。
-+d启用诊断模式,每个字节都将被验证。
-+p percent_read设置执行随机读测试的线程/进程比例,仅在吞吐量模式下有效。
-+r为所有 I/O 测试启用 O_RSYNC 和 O_SYNC。
-+t启动网络性能测试,需要配合 -+m 使用。
-+A启用 madvise,提供不同的文件访问模式。

3. 10 个 IOzone 示例

测试的时候,默认是测试当前文件系统(当前目录)。

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

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

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

./iozone -a

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

time ./iozone -a
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 15:47:01 2024

     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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
              64       4   1143223   4564786   8182586  12902017   7940539   4643754   4897948    6421025    7940539   4274062   4564786   9006179  12902017
              64       8   1768283   6421025  15972885  15972885  12902017   5860307   9318832    9006179   15972885   5860307   6271021  15972885  15972885
              64      16   1828508   6421025  20962191  12310336  20962191   6271021  12902017   10821524   20962191   6421025   7940539  20962191  30484297
              64      32   1828508   7100397  15972885  12902017  20962191   7940539  22737791    9006179   20962191   5283570  15972885  30484297  30484297
              64      64   1780008   5389653  10821524  30484297  34389688   7100397  20962191    8182586   30484297   7100397   7940539  34389688  34389688
             128       4   1642783   4934216  11470204  11470204   8036304   4596273   5603747    7176872    8036304   4717434   4934216  10567140  10567140
             128       8   1967960   5784891  15881078  12842051  12542043   6114306   9129573    9795896   14200794   6114306   6114306  15881078  15881078
             128      16   2035099   6727225  21643049  12842051  15881078   6727225  14200794   11470204   21643049   7176872   6406138  20804356  20804356
             128      32   2098744   6727225  16365173  10779307  15881078   7176872  14200794    9795896   21643049   8548124   7476717  18637664  24620673
             128      64   2098744   6812590  12842051  21643049  18012359   7582312  21643049    8548124   20804356   5325799   9977956  18637664  21643049
             128     128   1911894   7082197  11720614  24620673  21643049   8414153  18012359    7176872   25804035   8548124   7476717  25804035  25804035
...
iozone test complete.
./iozone -a  1.00s user 40.03s system 74% cpu 54.956 total

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

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

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

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

reclen(Record Length)指的是在 I/O 测试中,Iozone 使用的单个记录的长度,即每次读写操作的单位大小。这个参数在进行文件读写测试时非常关键,因为它直接影响到 I/O 性能的测量结果。具体来说:1)在顺序读写测试 中,reclen 控制每次读取或写入的块的大小;2)在随机读写测试 中,reclen 决定了每次随机访问的数据块的大小。

示例:假设你使用 -r 64k 参数进行 Iozone 测试,表示每个 I/O 操作的 reclen 为 64KB。每次读取或写入的记录将是 64KB。

reclen 对性能的影响:

  • • 较小的 reclen 值:适合于模拟对小数据块频繁访问的应用程序(如数据库的行级读写)。这些应用通常在 I/O 请求较小的情况下表现得更好。

  • • 较大的 reclen 值:适合于模拟大文件的顺序读写(如媒体文件)。大块的 I/O 操作通常能更好地利用磁盘的带宽,提升吞吐量。

  • • 自动模式中的 reclen:在 Iozone 的 自动模式(-a 或 -A)下,reclen 会自动调整,通常从 4KB 开始,到 16MB 结束,涵盖各种不同的记录长度,从而测试系统在不同的记录大小下的性能表现。

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

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

./iozone -a -b output.xls

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

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

Image

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

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

  • • 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

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

time ./iozone -a -i 0
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 15:56:16 2024

     Auto Mode
    Command line used: ./iozone -a -i 0
    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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
              64       4   1143223   3791156
              64       8   1828508   5389653
              64      16   1933893   5283570
              64      32   1879725   5860307
              64      64   1828508   5860307
             128       4   1363288   4267461
             128       8   1997245   5325799
             128      16   2132084   5847904
             128      32   2166499   5545860
             128      64   2248149   6406138
             128     128   1939522   6406138
             256       4   1740810   4422226
             256       8   2097948   5117791
             256      16   2187712   5687020
             256      32   2247235   5569035
             256      64   2242541   5938650
             256     128   2247235   6107548
             256     256   1842366   6107548
             512       4   1635797   4494470
             512       8   2081286   5278892
             512      16   2097550   5684095
             512      32   2225819   5951911
             512      64   2244430   5744919
             512     128   2256220   6319739
...

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

./iozone -a -i 0 -i 1

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

默认情况下,iozone 会自动创建大小从 64k 到 512M 的临时文件,以执行各种测试。 iozone 输出中的第一列(带有列标题 KB)表示文件大小。正如从之前的输出中看到的,它从 64KB 文件开始,并且会不断增加直到 512M(每次文件大小都翻倍)。可以使用选项 -s 指定文件大小,而不是对所有文件大小运行测试。以下示例将只对文件大小为 1MB(即 1024KB)的文件执行写入测试:

time ./iozone -a -i 0 -s 1024
zsh: no such file or directory: ./iozone -a -i 0 -s 1024
./iozone -a -i 0 -s 1024  0.00s user 0.00s system 77% cpu 0.001 total
(base) ➜  current time ./iozone -a -i 0 -s 1024
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 16:00:11 2024

     Auto Mode
    File size set to 1024 kB
    Command line used: ./iozone -a -i 0 -s 1024
    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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
            1024       4   1370527   3923040
            1024       8   1793451   4995276
            1024      16   1910737   5251818
            1024      32   1981251   5363307
            1024      64   2147692   5751117
            1024     128   1957770   5782087
            1024     256   1976691   5758828
            1024     512   1845071   5853003
            1024    1024   1818510   5390231

 iozone test complete.
./iozone -a -i 0 -s 1024  0.10s user 0.02s system 91% cpu 0.139 total

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

当运行测试时,对于特定的文件大小,它会使用从 4k 到 16M 的不同记录大小进行测试。

如果我们对托管 oracle 数据库的 I/O 子系统进行 I/O 性能测试,我们可能希望将 iozone 中的记录大小设置为与 DB 块大小相同的值。数据库根据 DB 块大小进行读写。

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

除了使用所有这些默认记录长度大小外,我们还可以指定要测试的记录大小。下面的示例将仅对 32k 的记录长度运行写入测试。在输出中,第二列现在将只显示 32。

time ./iozone -a -i 0 -r 32
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 16:04:29 2024

     Auto Mode
    Record Size 32 kB
    Command line used: ./iozone -a -i 0 -r 32
    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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
              64      32   1210227   5283570
             128      32   1802755   6114306
             256      32   1924938   5810112
             512      32   1895721   5951911
            1024      32   1825466   5789881
            2048      32   1825390   4864597
            4096      32   1729608   4051086
            8192      32   1769769   3678455
           16384      32   1725891   3593775
           32768      32   1743644   3514361
           65536      32   1648909   3387415
          131072      32   1645848   3251361
          262144      32   1635334   3243552
          524288      32   1660231   3273487

 iozone test complete.
./iozone -a -i 0 -r 32  0.11s user 1.56s system 76% cpu 2.179 total

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

我们还可以同时使用 -s 和 -r 选项来指定确切的临时文件大小和需要测试的确切记录长度。

比如下面会使用一个 2M 的文件,记录长度为 1M 的运行写测试:

time ./iozone -a -i 0 -s 2048 -r 1024
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 16:05:41 2024

     Auto Mode
    File size set to 512 kB
    Command line used: ./iozone -a -i 0 -s 2048 -r 1024
    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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
             512       4   1347393   4163357
             512       8   1985091   5019764
             512      16   2116152   5566231
             512      32   2141475   5566231
             512      64   2160868   5886650
             512     128   2152206   5951911
             512     256   1992458   6104175
             512     512   1827947   6246213

 iozone test complete.
./iozone -a -i 0 -s 2048 -r 1024  0.10s user 0.02s system 94% cpu 0.126 total

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

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

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

time ./iozone -i 0 -t 2
    Iozone: Performance Test of File I/O
            Version $Revision: 3.506 $
        Compiled for 64 bit mode.
        Build: linux

     Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                 Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                 Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                 Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                 Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
                 Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
                 Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
                 Vangel Bojaxhi, Ben England, Vikentsi Lapa,
                 Alexey Skidanov, Sudhir Kumar.

     Run began: Fri Dec 20 16:06:58 2024

     Command line used: ./iozone -i 0 -t 2
    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.
                                                                    random    random      bkwd     record     stride
              kB  reclen    write    rewrite      read    reread      read     write      read    rewrite       read    fwrite  frewrite     fread   freread
             512       4   1383861   4375425

 iozone test complete.
./iozone -i 0 -t 2  0.10s user 0.02s system 74% cpu 0.151 total

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

在执行 iozone 测试时,我们还可以使用 -+u 选项(必须是完整的)指示 iozone 收集 CPU 利用率。

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

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

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

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

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

为了获得准确的磁盘性能,建议将临时文件大小设置为系统缓冲区缓存大小的 3 倍。以下示例将通过将最大文件大小增加到 2GB 来运行 iozone,并为写入测试运行自动 iozone 测试:

time ./iozone -a -g 2G -i 0

我们可以使用 -I 参数对所有文件操作启用 VxFS VX_DIRECT、O_DIRECT 或 O_DIRECTIO 模式。这些模式允许文件操作绕过操作系统的缓存(如 page cache),直接与磁盘进行交互,从而测试磁盘的原始 I/O 性能。

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

通过组合几个 iozone 选项,我们可以在多个挂载点上执行磁盘 I/O 测试。

如果有 2 个挂载点,则可以启动 2 个不同的 iozone 线程以在这两个挂载点上创建临时文件以进行测试,如下所示:

time ./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 自动创建用于测试目的。

iozone vs fio

特性Iozonefio
测试对象文件系统文件系统、块设备、裸设备
配置灵活性固定测试类型高度灵活
输出结果自动生成标准化报告详细的性能数据及分布
I/O 类型支持基于文件的 I/O支持多种 I/O 模式
测试范围文件操作的性能测试,如读/写、随机读写包括存储设备性能和模拟复杂负载场景
应用场景文件系统优化与对比存储性能分析与优化
支持平台多种平台(Linux、Windows、Unix)主要面向 Linux,部分支持其他平台
学习曲线低高
功能特点适合文件系统的标准化基准测试适合存储设备的高自定义性能测试
适用人群文件系统优化的初学者或标准测试需求者高级用户或需精细化性能分析的开发者