当前位置: 首页 > 工具软件 > Bonnie++ > 使用案例 >

Linux测试工具研究之I/O 性能测试bonnie++

陶温书
2023-12-01

1、参数介绍

    bonnie++ [‐d scratch‐dir] [‐s size(Mb)[:chunk‐size(b)]]

    [‐n number‐to‐stat[:max‐size[:min‐size][:num‐directories]]]

    [‐m machine‐name]

    [‐r ram‐size‐in‐Mb]

    [‐x number‐of‐tests] [‐u uid‐to‐use:gid‐to‐use] [‐g gid‐to‐use]

    [‐q] [‐f] [‐b] [‐p processes | ‐y]

    首先说明一下命令中常用的参数。

        ‐d 生成测试文件的路径

        ‐s 生成测试文件的大小,以M 为单位(如果不使用‐r 参数,则要求文件大小至少是系统物理内存的2 倍)

        ‐m 机器名,实际上我们可以认为是本次测试的方案名,可以随便定义。默认是本机的hostname。

        ‐r 内存大小,指定内存大小,这样可以通过‐s 参数创建r*2 大小的文件,通常用于缩短测试时间,但是需要注意这样由于内存的cache 可能导致测试结果的不准确。

        ‐x 测试的次数

        ‐u 测试文件的属主和组,默认是执行bonnie++的当前用户和当前组

        ‐g 测试文件的组,默认是执行bonnie++的当前用组

        ‐b 在每次写文件时调用fsync()函数,对于测试邮件服务器或者数据库服务器这种通常需要同步操作的情况比较适合,而不使用该参数则比较适合测试copy 文件或者编译等操作的效率。

2、测试过程

 

2.1 执行命令

    bonnie++ ‐d /global/oradata –m sun3510

    这样将会在指定的目录下(通常我们会指定一个盘阵上卷的挂载点),生成相当于主机物理内存两倍的文件,如果总量大于1G,则生成多个大小为1G 的文件。假设主机内存为4G,那么在测试中就会生成8 个1G 的文件,到测试结束,这些文件会被自动删除。

    如果我们的主机内存是4G,但是我们想缩短测试的时间,比如说只写2G 的文件,就应该执行下面的命令:

        bonnie++ ‐d /global/oradata –m sun3510 –s 2048 –r 1024

        bonnie++的在测试的时候通常会占用大量的IO 和CPU,所以请不要在生产环境的业务高峰期进行测试。

    测试的过程如下:

           bonnie++ ‐d /global/oradata ‐s 8192 ‐m d2new ‐u oracle

        Using uid:1001, gid:101.

        Writing with putc()...done

        Writing intelligently...done

        Rewriting...done

        Reading with getc()...done

        Reading intelligently...done

        start 'em...done...done...done...

        Create files in sequential order...done.

        Stat files in sequential order...done.

        Delete files in sequential order...done.

        Create files in random order...done.

        Stat files in random order...done.

        Delete files in random order...done.

2.2 产生的测试结果数据

    Version 1.03 ‐‐‐‐‐‐Sequential Output‐‐‐‐‐‐ ‐‐Sequential Input‐ ‐‐Random‐‐Per Chr‐ ‐‐Block‐‐ ‐Rewrite‐ ‐Per Chr‐ ‐‐Block‐‐ ‐‐Seeks‐‐Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CPd2new 8G 18275 62 32832 26 25423 55 27444 94 106842 60 549.9 7‐‐‐‐‐‐Sequential Create‐‐‐‐‐‐ ‐‐‐‐‐‐‐Random Create‐‐‐‐‐‐‐‐‐Create‐‐ ‐‐Read‐‐‐ ‐Delete‐‐ ‐Create‐‐ ‐‐Read‐‐‐ ‐Delete‐‐files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++ 6535

    依次解读一下,从Writing with putc()开始到Delete files in random order…结束,这是bonnie++作的12 项测试,这12 项测试依次对应12 项结果,而这12 项结果又被分为了5 大类,分别是Sequential Output(顺序写测试),Sequential Input(顺序读测试),Random Seeks(随机读写测试),Sequential Create(顺序创建文件测试)和Random Create(随机创建文件测试)。

2.3 结果项解析

    Sequential Output(顺序写入)

    per char utc(),每次一个字符,顺序写入,完成整个文件

    The CPU overhead here is that required to do the stdio code plus the OS file space allocation.

    block:每次一个块,顺序写入,完成整个文件,

    The CPU overhead should be just the OS file space allocation.

    rewrite:每次读出一个块,修改其中一个字节,然后写回

    this should test the effectiveness of the filesystem cache and the speed of data transfer.

    Sequential Input(顺序读出)

    per char:get(),每次一个字符,顺序读出,完成整个文件

    This should exercise only stdio and sequential input.

    block:每次一个块,顺序读出,完成整个文件

    This should be a very pure test of sequential input performance.

    Random Seeks(随机寻道):

    3 个seeks 进程,8K 个随机寻道操作,每次都是整块读出,%10 得情况,修改一个字节,然后写回

    Sequential Create (建立文件时,是真正将文件写入磁盘的)

    create

    read(stat) 顺序遍历所有文件:操作:读取文件属性,如果文件大小不为0,还要对文件内容进行读取,

    delete 顺序删除所有文件

    Random Create

    create

    read(stat) 按随机顺序遍历文件,文档中说这一步不会遍历所有文件,但是代码里边反应的情况好像不是这样.

    delete 按随机顺序删除所有文件,那么测试步骤和测试结果依次对应的顺序就是:

    Writing with putc() ‐> Sequential Output 的Per Chr(字节方式)

    Writing intelligently ‐> Sequential Output 的Block(块方式)

    Rewriting ‐> Sequential Output 的Rewrite

    Reading with getc() ‐> Sequential Input 的Per Chr

    Reading intelligently ‐> Sequential Input 的Block

    start 'em ‐> Random Seeks

    Create files in sequential order ‐> Sequential Create 的Create

    Stat files in sequential order ‐> Sequential Create 的Read

    Delete files in sequential order ‐> Sequential Create 的Delete

    Create files in random order ‐> Random Create 的Create

    Stat files in random order ‐> Random Create 的Read

    Delete files in random order ‐> Random Create 的Delete

    每个结果中又包括了2 项数值,一个是K 字节数或者文件数,另一个是%CP,就是执行这项测试时CPU 的平均占用率, 12 项测试一共会产生24 个 测试数据。

    对于输出结果的评价,我们认为在相等CPU 的占用率情况下,存取字节数越高表示该存储设备的吞吐量越大,自然性能也就越好。

    值得注意的是,在测试RAID 的时候,对于多CPU 的系统,bonnie++并没有发挥CPU的最大潜力,也就是说bonnie++发出的I/O 请求通 常不够达到CPU 和磁盘的最大压力,这时候显示的吞吐量就不是这个存储设备能够达到的最大值。我们可以在测试的同时通过iostat,mpstat,sar 等命令监控系统状况,如果没有明显的I/O 等待,通常表示测试软件的压力不够。在bonnie++的主页上也表示对于 多CPU 多进程的支持将放到2.0 版本中去实现。

    明白了测试步骤和测试结果之后,我们再来进一步看看每个测试结果都是什么含义。

    Sequential Output

    1. Per Char

    就是Per‐Character 的含义。使用putc()函数进行循环写入,每次写入的字节很小,基本上可以放入任意一种I‐Cache 中,这种情况下的CPU 消耗在处理putc()代码和分配磁盘文件空间上。

    2. Block

    使用write(2)函数创建文件。这种情况下的CPU 消耗只是在分配磁盘文件空间上。

    3. Rewrite

    使用read(2)函数读取文件,然后修改再用write(2)函数写回。由于文件的空间已经分配好,所以这种方式可以很有效地测试文件系统缓存和数据传输的速度。

    Sequential Input

    1. Per Char

    使用getc()函数循环 读取文件内容

    2. Block

    使用read(2)函数循环读取文件内容,有效测试磁盘读取的效率。

    Random Seek

    默认3 个进程作8000 次的测试。用read(2)函数读取文件的block,同时有10%的操作是用write(2)函数将block 修改以后写回文 件中。在这个测试中,如果内存容量大于创建的文件大小,那么将会出现比较高的数值,而这个数值可能并不能准确反映磁盘本身的I/O 效率。

    Sequential Create 和Radom Create

    这两大类测试均是用创建,读取,删除大量的小文件来测试磁盘效率。文件名用7 位数字和任意个数(0‐12)的任意英文字母来组成。在Sequential 部分,字母在数字之后,而Random部分则是字母在数字之前。

    创建文件的最小值和最大值等参数可以在bonnie++命令行中用‐n 参数来控制。

    评测.我们通过bonnie++来测试各种磁盘配置,或者测试各种RAID 设置下的磁盘效率,可以有助于我们对于各个产品或者各个方案的磁盘吞吐效率有个大体认识。

    在测试结果的最后一行是用逗号隔开的一列数字,第一个位置是我们在运行bonnie++时用‐m 参数指定的机器名,第二个位置是测试时生成的文件大小, 后面依次是各类测试的。

    结果。我们将多个测试的最后一行粘贴到Excel 中,然后用图表功能生成柱状图,就可以对多项测试有一个极为直观的评测比较。

 

 类似资料: