本文转载自:https://blog.csdn.net/werm520/article/details/7262103

深入学习IOZone

刘智朋       2011-3-29

1        IOZone概述

iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试 Read, write,re-read,re-write, read backwards, read strided, fread, fwrite, random read,pread, mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。

测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然Linux会给你的读写的内容进行缓存,会使数值非常不真实。

2        IOZone特征

(1)   使用ANSI‘C’编写

(2)   POSIX 异步I/O支持.

(3)   Mmap() 文件I/O支持.

(4)   普通文件I/O支持

(5)   单一流测试Singlestream measurement.

(6)   多流测试Multiplestream measurement.

(7)   支持POSIX线程.多进程测试.结果生成采用直观的Excel表格形式.

(8)   I/O 延迟数据Latencydata for plots.

(9)   兼容64位系统.兼容大文件.

(10)  吞吐量测试中使用Stonewalling来避免不同步的问题.

(11)  可以配置处理器缓存大小.可选择是否使用fsync, O_SYNC进行测试.

(12)  可以针对NFS进行测试.

3        IOZone安装

3.1     下载安装程序

IOZone安装

首先从官方下载最新的iozone源码包(http://www.iozone.org/),然后编译适合自己target的执行文件

源码:[Latest tarball
exe : [Windows ]
 

iozone3 (308-1ubuntu0.1) [multiverse]

源码安装:

#tar iozone3_347.tar  

#cd iozone3_347/src/current  

#make linux (直接执行make有帮助选项)

拷贝编译出得二进制文件iozone到/usr/bin

# cp iozone /usr/bin

4        IOZone几种测试的定义

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

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

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

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

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

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

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

Backwards Read:测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑,事实上,有些应用确实这么干。MSCNastran是一个使用倒序读文件的应用程序的一个例子。它所读的文件都十分大(大小从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 类似,除了在这个测试中被读文件是最近才刚被读过。这将导致更高的性能,因为操作系统缓存了文件数据。通常会比Re-write的性能低。

5        测试参数

下面是一些在IOZone进行测试时的相关选项:

Usage: iozone [-s filesize_Kb] [-rrecord_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...] [-Vpattern] [-j stride]

[-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-kdepth] [-U mount_point]

[-S cache_size] [-O] [-K] [-L line_size] [-gmax_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 #]

下面会介绍一些比较常用的选项参数,其他的一些选项参数可以在IOZone的主页(http://www.iozone.org/)上进行下载IOZone的使用手册进行了解。

-h 显示帮助。

-a 用来使用全自动模式。生成包括所有测试操作的报告,使用的块大小从4k到16M,文件大小从64k到512M。

-A 这种版本的自动模式提供更加全面的测试但是消耗更多时间。参数–a在文件不小于32MB时将自动停止使用低于64K的块大小测试。这节省了许多时间。而参数–A则告诉Iozone你不介意等待,即使在文件非常大时也希望进行小块 的测试。

注意: 不推荐在Iozone3.61版中使用这个参数。使用–az –i 0 –i1替代。

-R 产生Excel到标准输出,-b 指定输出到指定文件上. 比如-Rb ttt.xls

-i N 用来选择测试项, 比如Read/Write/Random比较常用的是0 1 2,可以指定成-i 0 -i 1 -i 2。

  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

-r block size 指定一次写入/读出的块大小

-s file size 指定测试文件的大小

-f filename 指定测试文件的名字,完成后会自动删除(这个文件必须指定你要测试的那个硬盘中)

批量测试项:

-g -n 指定测试文件大小范围,最大测试文件为4G,可以这样写 -g 4G

-y -q 指定测试块的大小范围

测试实例

下面是测试中的一个测试实例:
./iozone -a -g 16G -i 0 -i 1 -i 2 -f /opt/iozone -Rb iotestresult-8KB.xls

注:进行全面测试.最大测试文件为16G,从64K开始。测试write/rewrite,read/re-read,random-read/write。本测试是将9个盘做RAID5之后挂载到/opt/iozone,测试地方在/opt/iozone。输出文件到iotestresult-8KB.xls中。

结果分析:

使用这条测试命令测试磁盘后,下面列举出了产生的Execl文件中的一段表,并进行了简单的解释。

Writer Report

              
  

4

8

16

32

64

32768

5300

8166

12726

16702

24441

65536

5456

8285

9630

16101

18679

131072

5539

6968

9453

13086

14136

262144

5088

7092

9634

11602

14776

524288

5427

9356

10502

13056

13865

1048576

6061

9625

11528

12632

13466

图5-1 测试结果分析

在Execl文件中的这段表,它说明了这个表单是关于write的测试结果,左侧一列是测试文件大小(Kbytes),最上边一行是记录大小,中间数据是测试的传输速度。举例说明,比如表中的“5300”,意思是测试文件大小为32M,以记录大小为4K来进行传输,它的传输速度为5300 Kbytes/s。

深入学习IOZone【转】的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. js substr和substring

    substr(start[,end]) 字符串截取 start从那里裁,end裁切为数 substring(start[,end = str.length]) // start和end会先处理数值较大 ...

  2. Vue.js中滚动条加载更多数据

    本文章参考:http://www.cnblogs.com/ssrsblogs/p/6108423.html 分析:1.需要判断滚动条是否到底部: 需要用到DOM的三个属性值,即scrollTop.cl ...

  3. GitLab使用公钥SSH key登录

    SSH key提供了一种与GitLab通信的方式,能够不输密码就进行版本控制 第一步,检查SSH key是否存在 如果存在则把SSH Key放到GitLab上,如果不存在则生成新的SSH Key,再放 ...

  4. python使用matplotlib绘制折线图教程

    Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形.下面这篇文章主要介绍了python使用matplot ...

  5. 从javaScript中学习正则表达式——RegExp

    正则表达式工具:http://regexper.com   由于国外网络可以选择 https://github.com/javallone/regexper-static 离线安装作为本地服务. 正则 ...

  6. IIS多个应用程序共享Session

    在应用程序目录下面添加一个Global.asax文件,在文件中添加以下代码: public override void Init() { base.Init(); foreach (string mo ...

  7. LeetCode 19 - 删除链表的倒数第N个节点 - [链表]

    题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 题解: 两个 $p,q$ 指针均指向头,然后 $q$ 先 ...

  8. Docker数据卷

    1.volume操作命名:docker volume Usage:    docker volume COMMAND Manage Docker volumes Options:       --he ...

  9. jmeter将JDBC Request查询出的数据作为下一个接口的参数

    现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_ ...

  10. SpringCloud微服务高级

    分布式配置中心 什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring c ...