文件性能测试工具 IOzone 使用简介
书籍推荐
I/O 栈
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 -aiozone 输出的第一组包含标题信息,其中显示有关 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 输出创建的示例图:
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 13.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参数对所有文件操作启用VxFSVX_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
| 特性 | Iozone | fio |
| 测试对象 | 文件系统 | 文件系统、块设备、裸设备 |
| 配置灵活性 | 固定测试类型 | 高度灵活 |
| 输出结果 | 自动生成标准化报告 | 详细的性能数据及分布 |
| I/O 类型支持 | 基于文件的 I/O | 支持多种 I/O 模式 |
| 测试范围 | 文件操作的性能测试,如读/写、随机读写 | 包括存储设备性能和模拟复杂负载场景 |
| 应用场景 | 文件系统优化与对比 | 存储性能分析与优化 |
| 支持平台 | 多种平台(Linux、Windows、Unix) | 主要面向 Linux,部分支持其他平台 |
| 学习曲线 | 低 | 高 |
| 功能特点 | 适合文件系统的标准化基准测试 | 适合存储设备的高自定义性能测试 |
| 适用人群 | 文件系统优化的初学者或标准测试需求者 | 高级用户或需精细化性能分析的开发者 |