利用IOzone进行存储性能测试

 

命令:1、iozone -s 10G -r 4k -i 0(0代表顺序写) -w(代表文件不删除) -+n(不测重读重写) -Rb(以某种格式生成测试文件) /tmp/iozone_4k_sq_w.xls(这里是文件的名字)    以4k大小测试顺序写10G文件的性能;

2、清除缓存:echo 3 >/proc/sys/vm/drop_caches(注意:3与>之间必须有空格)

3、iozone -s 10G -r 4k -i 1(1代表顺序读) -w -+n -Rb /tmp/iozone_4k_sq_r.xls   以4k大小测试顺序读10G文件的性能

4、清除缓存:echo 3 >/proc/sys/vm/drop_caches

5、iozone -s 10G -r 4k -i 2(2代表随机读写) -w -+n -Rb /tmp/iozone_4k_sq_rand.xls  以4k大小测试随机读写10G文件的性能

测试的定义
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机制的性能。

参数介绍

iozone功能很强大,当然参数也很多,但是我们常用的就那几个参数
Usage: iozone [-s filesize_Kb] [-r record_size_Kb ] [-f [path]filename]
  [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children] [-h] [-o]
  [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x]
  [-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] [-K] [-L line_size] [-g max_filesize_Kb]
  [-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b filename]
  [-J milliseconds] [-X filename] [-Y filename] [-w] [-W]
  [-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m filename]
  [-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #]

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

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

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

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

下面做个在我机器上做的测试:只进行read/write测试,测试文件大小是4G,记录块从2k到8m,并将测试数据输出到Excel文件中

[root@localhost]]# /opt/iozone/bin/iozone -a -s 4g -i 0 -i 1 -f /tmp/testfile -y 2k -q 8m -Rb output.xls
Iozone: Performance Test of File I/O
Version $Revision: 3.408 $
Compiled for 32 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.
Ben England. Run began: Sat Sep 29 16:13:49 2012 Auto Mode
File size set to 4194304 KB
Using Minimum Record Size 2 KB
Using Maximum Record Size 8192 KB
Excel chart generation enabled
Command line used: /opt/iozone/bin/iozone -a -s 4g -i 0 -i 1 -f /tmp/testfile -y 2k -q 8m -Rb output.xls
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
4194304 2 73827 29362 81404 81444
4194304 4 69155 69602 76825 77202
4194304 8 68565 69824 76052 84360
4194304 16 68075 69315 76283 80031
4194304 32 66513 67132 76137 76763
4194304 64 72619 73450 83329 85359
4194304 128 74573 75989 70115 85572
4194304 256 72895 74590 79285 88244
4194304 512 73291 73907 82552 87192
4194304 1024 73020 74662 82190 80162
4194304 2048 69200 69990 77603 83164
4194304 4096 68509 70153 74310 80600
4194304 8192 67789 69434 78875 83344

最后数据就是测试结果,左边第一列是测试文件大小,第二列是记录块大小(单位是kb),以后每列就是测试模式(单位是kb/s)

利用IOzone进行存储性能测试的更多相关文章

  1. RGW/SWIFT对象存储性能测试工具--COSBench安装

    Cosbench是Intel的开源云存储性能测试软件,COSBench目前已经广泛使用与云存储测试,并作为云存储的基准测试工具使用 https://github.com/intel-cloud/cos ...

  2. 云存储性能测试工具--COSBench安装

    COSBench安装 Cosbench是Intel的开源云存储性能测试软件,COSBench目前已经广泛使用与云存储测试,并作为云存储的基准测试工具使用 1 环境 1.1 操作系统 COSBench可 ...

  3. 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组

    利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...

  4. 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述

            一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述     ...

  5. 利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现

    #include <stdio.h> #include<conio.h> #include<stdlib.h> /* 利用十字链表存储有向图,可用于同时查找某个顶点 ...

  6. vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

    目录 1,前言 2,.env文件的作用 3,配置.env文件 4,配置启动命令 5,获取.env中的全局变量 5,实际用处 1,前言 分享一下vue项目中利用.env文件存储全局环境变量,以及利于项目 ...

  7. 利用Azure高级存储搭建高性能Linux服务器(1)

    目前Azure针对虚拟机提供两种类型的存储,一种是标准存储,基于HDD的,一种是高性能存储Premium Storage(在下文中简称PS),基于SSD的.针对用户高性能,低延迟,I/O密集型的应用, ...

  8. 利用自动类型转换存储string类型

    类型转换是我们最常用的功能.就像上战场用的枪一样,敌人用的冲锋枪, 自己手里就一把步枪,打起仗来始终有点不爽. 因此,基本功能的完善很重要. 通常情况下我们需要String类型转其它的基础类型.这时我 ...

  9. 利用H5本地存储localStorage、sessionStorage

    最近的业务处理上,要使用cookie缓存储一下数据,公司的cookie还搞出点问题.而用户的浏览器都是利用微信的内置,普遍支持h5的本地存储.于是利用了这个... 现代浏览器普遍开始支持H5本地存储, ...

随机推荐

  1. 高精度加法(c++)

    为什么要用高精度? 有时我们要进行精度较高的运算时,就要使用高精度来进行运算: 就如例题: 大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 21965 通过数: 634 ...

  2. MyBatis笔记(三)

    1. ResultMap 查询结果为null:要解决属性和字段名不一致的问题 我们先来看下步骤: 数据库中的字段名 Java中的实体类 public class User {    private i ...

  3. 不想eject,还咋修改create-react-app的配置?

    一.先抛问题 许多刚开始接触create-react-app框架的同学,不免都会有个疑问:如何在不执行eject操作的同时,修改create-react-app的配置.今天胡哥就来带大家一起来看看这个 ...

  4. HTML(一):语法结构

    HTML语法规范 基本语法概述 HTML标签是由尖括号包围的关键词,例如<html>. 2HTML标签通常是成对出现的,例如<html>和</html> ,我们称为 ...

  5. python基础(十二):if分支表达式

    有时候,我们需要依照某种条件,再决定要不要做某个操作.在Python中,if语句能够帮助我们检查程序的当前状态,告诉计算机接下来该做什么. 条件表达式 每个if后面都跟着一个True或False的表达 ...

  6. WebStorm 2020.1.2 激活

    1 下载 没下载的先去官网下载. 2 安装 系统Linux,解压后直接运行bin下的webstorm.sh. 首先提示是否导入设置,如果以前安装过的话会默认选择第一项. 选UI主题: 是否创建Desk ...

  7. pickle json模块

    pickle --- Python 对象序列化 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储. 通过pickle模块的反序列化操作,我们能够从文件中创建上一次 ...

  8. 带你温习一下webpack配置

    前言 你知道node.webpack和npm之间的关系吗? 首先来介绍一下node.webpack和npm的有什么样的关系. 我们知道webpack是对我们所开发的html.css.js等模块化开发的 ...

  9. C/C++ 手工实现IAT导入表注入劫持

    DLL注入有多种方式,今天介绍的这一种注入方式是通过修改导入表,增加一项导入DLL以及导入函数,我们知道当程序在被运行起来之前,其导入表中的导入DLL与导入函数会被递归读取加载到目标空间中,我们向导入 ...

  10. hdu1305 字典树水题

    题意:      给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路:       字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...