IOZone使用教程(文件系统性能)

IOZone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试readwritere-readre-writeread backwardsread stridedfreadfwriterandom readpreadmmapaio_readaio_write等等不同的模式下的硬盘的性能。 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使数值非常不真实。

一、环境描述

硬件配置:1核CPU + 2GB内存 + 120GB硬盘(虚拟机)
操作系统:CentOS 6.6 x86_64
IOZone版本:3.434

二、编译安装IOZone

1. 下载和解压源码包

在Shell中执行以下命令:

  1. cd /root/Downloads/
  2. wget http://iozone.org/src/current/iozone3_434.tar
  3. tar -xvf iozone3_434.tar

2. 编译安装IOZone

在Shell中执行以下命令:

  1. cd iozone3_434/src/current/
  2. make linux-AMD64
  3. mv /root/Downloads/iozone3_434 /usr/local/iozone
  4. yum install -y gnuplot

三、测试项目详解

  • write

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

  • re-write

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

  • read

    测试读一个已存在的文件的性能。

  • re-read

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

  • random read

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

  • random write

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

  • random mix

    测试读写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。这个测试只有在吞吐量测试模式下才能进行。每个线程/进程运行读或写测试。这种分布式读/写测试是基于round robin 模式的。最好使用多于一个线程/进程执行此测试。

  • backwards read

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

  • record rewrite

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

  • strided read

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

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

  • fwrite

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

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

  • frewrite

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

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

  • fread

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

  • freread

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

  • mmap

    许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。

    mmap文件的语义和普通文件略有不同。如果发生了对内存的存储,并不是立即发生相应的文件I/O操作。使用MS_SYNC 和MS_ASYNC标志位的 msyc()函数调用将控制内存和文件的一致性。调用msync() 时将MS_SYNC置位将强制把内存里的内容写到文件中去并等待直到此操作完成才返回。而MS_ASYNC 置位则告诉操作系统使用异步机制将内存刷新到磁盘,这样应用程序可以直接返回而不用等待此操作的完成。

    这个测试就是测量使用mmap()机制完成I/O的性能。

  • async I/O

    许多操作系统支持的另外一种I/O机制是POSIX 标准的异步I/O。本程序使用POSIX标准异步I/O接口来完成此测试功能。

    例如: aio_write(), aio_read(), aio_error()。这个测试测量POSIX异步I/O机制的性能。

四、参数介绍

1. iozone用法

iozone命令的用法:

  1. iozone [-s filesize_Kb] [-r record_size_Kb ] [-f [path]filename]
  2.   [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children] [-h] [-o]
  3.   [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x]
  4.   [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]
  5.   [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]
  6.   [-S cache_size] [-O] [-K] [-L line_size] [-g max_filesize_Kb]
  7.   [-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b filename]
  8.   [-J milliseconds] [-X filename] [-Y filename] [-w] [-W]
  9.   [-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m filename]
  10.   [-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #]

2. 常用参数

  • -a

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

  • -A

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

  • -B

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

  • -b

    iozone将会创建一个兼容于Excel的结果输出文件,这个文件是二进制文件格式的。

  • -c

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

  • -C

    显示吞吐量测试中每个客户端的字节数。

  • -D

    对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混合使用

五、测试示例

如果测试主机的内存为2G,那么测试的最大文件大小应当为4G。IOZone的测试结果既可以是xls文件,也可以是out文件,gnuplot可以利用out文件进行结果绘图。

在Shell中执行以下命令进行测试:

  1. /usr/local/iozone/src/current/iozone -Rab output.xls -g 4g > /root/Downloads/iozone.out

测试结果保存在output.xls文件中,测试时所有的输出都保存在iozone.out文件中,执行以下命令便可使用gnuplot进行结果绘图:

  1. cd /usr/local/iozone/src/current/
  2. ./Generate_Graphs /root/Downloads/iozone.out