美文网首页
如何使用iozone来统计和对比操作系统底层IO性能差异

如何使用iozone来统计和对比操作系统底层IO性能差异

作者: 缘觉如来 | 来源:发表于2019-02-20 15:50 被阅读3次

    iozone是什么

    官网链接:http://iozone.org/ 。官网说明了IOzone是一个文件系统基准测试工具。该测试套可以测量各种不同的文件操作,测试出不同读写操作模式下的吞吐量。

    可以测试哪些读写模式?

    • 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功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小从而增强应用程序的性能。

    执行测试

    下载源码

    地址:http://www.iozone.org/src/current/iozone3_487.tar

    解压编译

    tar -xvf iozone3_487.tar
    cd iozone3_487/src/current
    make linux
    

    运行测试

    #!/bin/bash
    
    memtotal=`grep MemTotal /proc/meminfo |awk '{print $2}'`
    maxsize=$[$memtotal+$memtotal]
    for i in $(seq 1 5 )
    do
    ./iozone -a -g $maxsize -Rb iozone$i.xls > iozone$i.output
    sleep 120
    done
    

    上面的脚本会执行五次iozone的自动模式测试,测试的最大文件为系统内存的两倍大小。测试结果分别保存在文件iozone.xls 和 iozone.output中。

    测试结果分析

    上面提到过,运行的脚本会收集测试数据到两个文件:一个是表格文件,一个是文本文件。

    表格文件示例

    在Deepin 桌面操作系统上,可以直接使用wps-office打开,可以看到生成的表格数据很详细,见下图:


    a.png

    列是文件大小,横是record的大小,中间的值是速度。表格文件可以直接使用各种office软件打开,各位看管做图能力非常强的,直接拿着这个原始数据就可以用了,也省的来回转换数据格式了。

    文本文件用法一

    文本文件可以使用流行的画图工具gnuplot进行作图,使用方法很简单,iozone测试套中src目录已经自带了画图的脚本,唯一要求的是系统安装gunplot软件。

    sudo apt-get install gnuplot 
    

    在iozone的源码目,运行下面的脚本,文本文件作为参数输入:

    ./Generate_Graphs iozone1.output  
    

    画图效果如下:


    b.png

    从这个速度的走势图暂时可以看出write的性能表现有两个波峰,分别是cache和buffer的数据。随着测试文件size变大,文件操作就变成了磁盘的操作,吞吐量就会下降的非常快。

    上面的只是画出了write的数据走势图,在运行该脚本的窗口直接enter会继续画剩余的各项操作的走势图,录制出动画,让大家感受下。


    c.gif

    文本文件用法二

    使用生成的文本文件和自带的画图脚本,除了可以画出眼花缭绕的走势图之外,好像还没有完全发挥它的最大功效。比如,我想对比两个版本之间数据的差异,去准确地检查相关的性能数据是提升还是下降了,那这个自带的脚本是做不到这一点的。

    github.com上查到有现成的工具可以使用,见github:https://github.com/Rovanion/iozone-results-comparator。 使用方法直接参考readme文件即可。

    它需要两组或更多组Iozone结果作为输入,脚本工具会使用各种统计方法对它们进行比较。主输出是一个包含表格和图表的HTML页面。还可以生成用于进一步处理的csv数据文件。

    我们使用iozone处理性能测试。需求是比较不同版本上的iozone结果。但是事实证明这是一项复杂的任务。要正确地比较数据

    • 在每个Linux内核版本上执行几个(推荐的5)运行
    • 使用统计测试来查找给定参数水平下结果是否不同

    该工具使用步骤:

    使用该工具之前,我们已经收集了两个系统的iozone的性能数据,每一系统上分别跑了5轮iozone的数据,分别为iozone1.output iozone2.output iozone3.output iozone4.output iozone5.output 文件。

    下载

    git clone https://github.com/Rovanion/iozone-results-comparator.git 
    

    安装依赖

    sudo apt-get install python-scipy python-matplotlib python-pip 
    pip install https://github.com/pallets/jinja/zipball/master
    

    复制两个版本的性能数据到目录examples/。两个目录分别命名为basline和target
    修改脚本run.sh如下:

    BASELINE=$(find ./baseline -name "*.output" | sort)
    SET1=$(find ./target -name "*.output" | sort)
    
    

    运行脚本run.sh

    deepin@deepin-PC:~/Documents/iozone-results-comparator/examples$ ./run.sh 
    Processing...
    Finished
    To view results open in your web browser:
    file:///home/deepin/Documents/iozone-results-comparator/examples/html_out/index.html
    

    直接打开生成的index.html页面文件,可以很直观的查看到baseline和target的性能差异。工具iozone-results-comparator会对测试数据集进行各种不同的数学运算,如四分位数运算、平均数、几何平均数、区间估计运算等多维度运算,得出多种对比结果,再针对数学运算的出来的结果进行比较。

    下面是使用该工具对Deepin15.5 和Deepin15.5 SP2的结果对比图。把Deepin15.5 的数据当做是基线版本,查看Deepin15.5 SP2上的性能数据是否优于基线版本。为了让人一睹该工具统计出的结果真容,我录了一个屏展示一下。

    d.gif

    从上面结果可以看出,target的IO性能数据要整体好于baseline的数据。target系统的内核版本是Linux deepin-PC 4.15.0-30deepin-generic 。而baseline的内核版本是Linux deepin-PC 4.9.0-deepin9-amd64 。

    总结

    Iozone是测试文件系统各项指标很好的工具,适合IO性能调优的时候使用,把iozone,Generate_Graphs和iozone-results-comparator结合起来使用,才应该是一个完整的操作。

    相关文章

      网友评论

          本文标题:如何使用iozone来统计和对比操作系统底层IO性能差异

          本文链接:https://www.haomeiwen.com/subject/gauhyqtx.html