iozone 官网:https://www.iozone.org/
0 IO 测试定义
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功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
Fread
测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
Freread
这个测试与上面的fread 类似,除了在这个测试中被读文件是最近才刚被读过。这将导致更高的性能,因为操作系统缓存了文件数据。
Mmap
许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。
mmap文件的语义和普通文件略有不同。如果发生了对内存的存储,并不是立即发生相应的文件I/O操作。使用MS_SYNC和MS_ASYNC标志位的 msyc()函数调用将控制内存和文件的一致性。调用msync() 时将MS_SYNC置位将强制把内存里的内容写到文件中去并等待直到此操作完成才返回。而MS_ASYNC 置位则告诉操作系统使用异步机制将内存刷新到磁盘,这样应用程序可以直接返回而不用等待此操作的完成。
Async I/O
许多操作系统支持的另外一种I/O机制是POSIX 标准的异步I/O。本程序使用POSIX标准异步I/O接口来完成此测试功能。例如:aio_write(), aio_read(), aio_error()。这个测试测量POSIX异步I/O机制的性能。
1 Linux下的安装
下载tgz安装包,下载之后,解压进入src目录,一直进入到有Makefile文件的目录,然后执行make Linux命令即可
编译得到iozone这个可执行文件之后即可,执行就用./iozone即可,可以将这个可执行文件移动至任何位置。
2 命令行选项含义:
-i
指定运行于哪种模式测试。可以使用 -i 0 -i 1
进行多个测试,具体参数含义如下:
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
-t 使用throughput模式(多线程),并指定线程或进程数
-r 设置记录块大小
-s 设置测试文件大小(建议是内存的2倍)
-a 自动模式(花费很长时间,注意),测试记录块大小从4k到16M,测试文件从64k到512M.文件大于32MB时停止使用低于64k以下记录块以节省时间
-y 设置自动模式下的记录块最小值,-q设置自动模式下的记录块最大值
-n 设置自动模式下的文件最小值,-g设置自动模式下的文件最大值
-B 使用mmap()接口来创建并访问测试文件.即以读写内存的方式访问那个块来完成文件I/O
-i 指定运行于哪种测试模式.可以使用-i 0 -i 1 -i 2进行多个测试
-I 对所有文件操作使用DIRECT I/O.通知文件系统所有操作跳过缓存直接在磁盘上操作
-R 将结果导出到Excel文件
-b 指定导出结果的Excel文件名
-f 指定测试的文件名
-F 进程throughput模式(多线程)测试时的文件名,请注意,有多少个线程,后面就应该跟多个个文件名
-c 计算时间时包含close()参数,对于NFS3分区将非常有用
-G 对mmap文件使用msync(MS_SYNC)。告诉操作系统在mmap空间的所有数据需要被同步的写到磁盘上
-D 对mmap文件使用MSYNC(MS_ASYNC)。告诉操作系统在mmap空间的所有数据需要被异步的写到磁盘上
-o 写操作都同步写入到磁盘中,即强制写入完成以后再返回benchmark
-I 对所有文件操作使用DIRECT I/O,通知文件系统所有操作跳过缓存直接在磁盘上操作
-l 设置最小进程数.在测试过程允许用户设置的最小进程或线程数.需要配合-u选项使用
-u 设置最大进程或线程数,需要配合-l参数使用
3 单节点测试
测试开始前,可以先执行 ./iozone -a
先进行自动化测试
假如测试节点的内存为128g,那么命令可以写为:
iozone -s 256g -t 1 -r 1M -i 0 -i 1 -+n
如有必要,可以将结果写入Excel表格中,添加 -R <filename> 参数即可
-+n 选项可以避免重复性的测试,以节约时间
4 单节点多流测试
iozone -s 256g -t 10 -r 1M -i 0 -i 1 -+n
5 多节点测试
参考:https://blog.51cto.com/u_286820/1428705
5.1 远程访问配置
iozone使用rsh进行连接,现在已经很少使用rsh了,可以配置ssh进行连接:
export RSH=ssh
export rsh=ssh
注:需要在所有的主机上进行设置,由于是临时设置,每次logout后都需要再次进行设置,如不执行上述两条命令,那么将会报错说找不到 rsh 命令
5.2 设置主机名
设置/etc/sysconfig/network(后面的nodelist文件文档上说可以使用IP或者节点名,经过测试发现使用IP进行连接,iozone不能运行,所以需要设置主机名vi /etc/sysconfig/network 分别在所有的主机上设置hostname值,我分别设置为node1、node2 … noden
或者通过:hostnamectl set-hostname xxx
命令来设置主机名
5.3 在选定的主节点上设置hosts
vim /etc/hosts
设置值如下:
xxx.xxx.xxx.x node1
xxx.xxx.xxx.x node2
...
xxx.xxx.xxx.x noden
5.4 设置ssh无密码访问
ssh-keygen -t rsa ssh-copy-id -i .ssh/id_rsa.pub 用户名@目标机器名 注:要在所有的节点上运行,并且把秘钥拷贝到所有其他的节点上,此步骤需要特别注意,如果节点多了,很容易搞混,最好写脚本运行;(如果主节点同时也作为运行节点,需要在主节点上运行:ssh-copy-id -i .ssh/id_rsa.pub 用户名@自己)
5.5 拷贝主节点上的hosts文件
拷贝/etc/hosts文件到所有的节点上,同时验证节点之间是否可以无密码互相访问:
scp /etc/hosts root@主机节点名 如不需要密码就可以分发hosts到所有的主机节点上,说明前期配置工作完成。
5.6 拷贝主节点上的iozone命令
拷贝主节点上的iozone命令到所有的节点的/tmp目录下
(可以是任意目录下,所有的节点包括主节点自己):
cp /opt/iozone/bin/iozone /tmp
scp /opt/iozone/bin/iozone 节点名:/tmp
5.7 在主节点上创建nodelist文件
格式为:节点名或ip iozone测试的文件系统名 iozone的工作路径
#cat /tmp/nodelist
node1 /mnt/testfs /tmp/iozone
node2 /mnt/testfs /tmp/iozone
...
noden /mnt/testfs /tmp/iozone
注:如果要使用多个线程进行测试,可以每个节点多复制几行。
5.8 拷贝nodelist文件到所有的节点上的/tmp目录下:
scp /tmp/nodelist 节点名:/tmp 到此基本环境配置完成。
5.9 命令
IOZONE命令的执行(具体的参数和配置可以参考手册):
/tmp/iozone -i 0 -i 1 -s 4G -Recb /tmp/log.xls -t 2 -+m /tmp/nodelist -C |tee /tmp/iozone.log -r 512
评论区