linux硬盘多维度测试,了解你的磁盘之使用bonnie++测试磁盘性能

这些选项当中

-f 表示fast mode,快速模式,因为bonnie++写有putc的测试,读有getc的测试,不用block,每次读或者写一个字节的测试,如果加了-f这个option,这个字节的测试就跳过了。

-D open的时候,带上O_DIRECT标志,对应的代码逻辑在bon_io.cpp

flags = O_RDWR | O_CREAT | O_EXCL;

if(m_use_direct_io)

{

flags |= O_DIRECT;

}

-b 写完之后,会调用fsync,刷到磁盘。

-s 是用来制定测试用的文件的大小,如果你没有加 -s这个option,系统会默认使用2倍内存大小的文件,比如我的内存是2G,那么bonnie会使用4G的文件来测试性能,原因在于减少缓存的影响。对Linux下文件和page cache感兴趣的筒子可以看我的这篇博文:file和page cache的一些事儿。代码逻辑在bonnie++.cpp

if(globals.ram && !setSize)

{

if(file_size < (globals.ram * 2))

file_size = globals.ram * 2;

// round up to the nearest gig

if(file_size % 1024 > 512)

file_size = file_size + 1024 - (file_size % 1024);

}

如果用户-s选项,又当如何?

常用的指定-s选项的是这样的:

bonnie++ -d /home/disk_test/ -s 16000:1048576 -r 1024 -u root

-s 16000:1048576的含义是用16000MB的文件来做实验,chunksize是1048576B,注意冒号前半部分的单位是MB,后半部分的单位是B。当然了-s16G:1048576也是合法的参数。代码逻辑在bonnie++.cpp :

case 's':

{

char *sbuf = strdup(optarg);

char *size = strtok(sbuf, ":");

file_size = atoi(size);

char c = size[strlen(size) - 1];

if(c == 'g' || c == 'G')

file_size *= 1024;

size = strtok(NULL, "");

if(size)

{

int tmp = atoi(size);

c = size[strlen(size) - 1];

if(c == 'k' || c == 'K')

tmp *= 1024;

globals.set_chunk_size(tmp);

}

setSize = true;

}

break;

注意chunksize也好,filesize也好,都是有限制的。先说chunksize最小是256B,最大是1MB,而且必须是256,512,1024,2048这种256×2^n的值,否则也报错。至于filesize,要大于2倍的内存值。下面二个误用,第一个是因为file_size小于2倍内存,bonnie十分kind的提醒内存大小是1936M,第二个原因是非256的2的幂次倍。

39ce4387563cb4a9e823bd56ba0b5837.png

如果filesize超过1G,会存储到多个文件,最大filesize不能超过1000G.

#define MaxIOFiles 1000

#define IOFileSize 1024

m_chunks_per_file(Unit / m_chunk_size * IOFileSize)

....

if(file_size > IOFileSize * MaxIOFiles)

usage();

其他的就没啥好说的了,直接开始测试吧,我比较懒,直接用了默认选项:

bonnie++ -u manu

输出是这样子的:

Version 1.03e ------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

manu 4G 33516 92 70332 11 23182 6 35877 83 83433 10 127.8 0

------Sequential Create------ --------Random Create--------

-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--

files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++

manu,4G,33516,92,70332,11,23182,6,35877,83,83433,10,127.8,0,16,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++

有一陀++,表示测试结果没有出来,作者采取了审慎的态度,他认为不准确的数据宁愿用++,也不愿意show出来,作者在bonnie++.8中有如下的说明:对作者认真负责的态度赞一个。

For every test two numbers are reported, the amount of work done (higher numbers are better) and the percentage of CPU time taken to perform the work (lower numbers are better). If a test completes in less than 500ms then the output will be displayed as "++++". This is because such a test result can't be calculated accurately due to rounding errors and I would rather display no result than a wrong result.

对这个问题耿耿于怀的筒子,可以看下How To Get Rid Of The Plus Signs In Bonnie++ Output,作者提供了解决之道,就是使用更大一点的 -n选项,-n选项的意思是做create文件实验的时候,创建多少个文件,默认是16×1024个,如果把这个值放大成128×1024,我们就有更大的机会获取准确值:即采用 -n 128参数。这个我没有试过,感兴趣的筒子去阅读并实验可也。

OK,这个++解释完了,我们继续。这个输出也太丑了,完全没有考虑到人的感受啊,幸好提供了bon_csv2html工具:

echo manu,4G,33516,92,70332,11,23182,6,35877,83,83433,10,127.8,0,16,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++ |bon_csv2html >> bon_result.htm

将输出的最后一行,调用bon_csv2html,就得到了html文件:如下所示:

63a5eafe8d8236900d3b2d0b87026294.png

我的磁盘的性能就测试出来了:

Sequential Output下的 Per Char是值用putc方式写,毫无疑问,因为cache的line总是大于1字节的,所以不停的骚扰CPU执行putc,看到cpu使用率是92%.写的速度是33MB/s,还不错。

Sequential Output是按照block去写的,明显CPU使用率就下来了,速度也上去了,越是70MB/s。

Sequential Input下的Per Char是指用getc的方式读文件,速度是35.8MB/s,CPU使用率是83%。

Sequential Input下的block是指按照block去读文件,速度是83MB/s,CPU使用率是10%。

另一个比较有意思的Random Seeks,含义是随机寻址。但是实际上,不仅是seek,还包括100%的读和10%的写, 这项性能指标是127.8次/s。对应如下代码

#define UpdateSeek (10)

if(rc == 1 && ticket) do

{

bool update;

if( (lseek_count++ % UpdateSeek) == 0)

update = true;

else

update = false;

if(file->doseek(rand() % num_chunks, update) )

exit(1);

}

....

int

CFileOp::doseek(long where, bool update)

{

if (seek(where, SEEK_SET) == -1) // 100%的seek

return io_error("lseek in doseek");

if (read_block(PVOID(m_buf)) == -1) //100%的读

return io_error("read in doseek");

/* every so often, update a block */

if (update) //10%的写

{ /* update this block */

/* touch a byte */

m_buf[int(rand()) % m_chunk_size]--;

if(seek(where, SEEK_SET) == -1)

return io_error("lseek in doseek update");

if (write_block(PVOID(m_buf)) == -1)

return io_error("write in doseek");

if(m_sync)

{

if(fsync(m_fd[m_file_ind]))

{

fprintf(stderr, "Can't sync file.n");

return -1;

}

}

} /* update this block */

return 0;

}

另外,bonnie++提供了zcav工具,至于zcav的详细原理我还知之不深,我要陪老婆了,今天还没散步。总之了,我照葫芦画瓢招 也得到了数据:原理部分希望以后补充,和Coker还有其他大神的得到的图片是相似的。原谅我没搞懂就show 图片出来,谁让我是个虚荣的人呢,阿弥托佛,善勒个哉的。

zcav -f /dev/sda

然后用gnuplot绘制的图片,大爱这张图片:

b33e14213c404f71ce5f396e0b929a29.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值