bonnie++(Version: 1.03)的使用方法以及结果的含义。

usage: 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参数创建r2大小的文件,通常用于缩短测试时间,但是需要注意这样由于内存的cache可能导致测试结果的不准确

-x 测试的次数

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

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

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

通常我们可以简单地运行如下命令进行磁盘性能测试:

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++在测试过程中都作了什么,而每一个输出的结果又表示了什么。

这个测试结果是在一台SunFire V880 + D2阵列上进行的,主机配置是2个UltraSparc-III+ 900MHz的CPU,4G内存,而D2阵列是满配的12块36G SCSI磁盘,划分了两个LUN,我们的测试目的地/global/oradata建立在其中的一个LUN上,使用了8块磁盘,用Veritas Volum Manager作了RAID10,stripe(也就是ncol)设置为4。

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.
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 %CP
d2new            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 %CP
                 16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++   653   5

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

那么测试步骤和测试结果依次对应的顺序就是:

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的平均占用率。

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

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

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

Sequential Output部分表示写文件的相关信息
Sequential Input部分表示读文件的相关信息
Per Chr表示以字符为单位读写文件
Block表示以block为单位读写文件
Rewrite表示修改并重写已经存在的文件的每一个block
K/sec表示每秒读或写文件的速率,以K为单位
%CP表示在某阶段执行操作时平均消耗的CPU

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参数来控制。