Linux硬盘性能检测

对于现在的计算机来讲,整个计算机的性能主要受磁盘IO速度的影响,内存、CPU包括主板总线的速度已经很快了。

基础检测方法

1、dd命令

dd命令功能很简单,就是从一个源读取数据以bit级的形式写到一个目标地址,通过这种方式我们就可以检测我们实际磁盘在linux系统中的读写性能,不需要经过任何检测软件而就是去读取数据,一般来讲用dd来检测磁盘的性能也被认为是最接近真实情况。

用法:dd if[数据从哪里读取,一般来讲从dev下的zero设备,这个设备不断返回0作为数据源]  of[把读取的文件写入哪个文件] bs[block size,每次读写基本快的大小] count[总共读写多少个bs] conv=fdatasync[在linux中有很强的内存缓存机制,为了提高系统性能,linux会大量使用内存作为硬盘读写缓存,所以这里用这个参数来保证数据是直接写入硬盘]

示例:

dd if=/dev/zero of=testfile bs=1M count=512 conv=fdatasync

在我的虚拟机上结果如下:

[root@localhost ~]# dd if=/dev/zero of=testfile bs=1M count=512 conv=fdatasync
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 19.6677 s, 27.3 MB/s

一般建议多次运行这个命令取平均值,在每次执行上面的命令前,建议用下面的命令来清除缓存:

echo 3 > /proc/sys/vm/drop_caches

通过dd命令测试往往不是很严谨也不是很科学,因为可能会受cpu使用率和后台服务影响。

2、hdparm命令

hdparm命令专门用来去获取修改测试磁盘信息。hdparm必须在管理员权限下运行。

用法:hdparm -t 要测试的磁盘

示例:

# hdparm -t /dev/sda

结果:

[root@localhost ~]# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 444 MB in  3.01 seconds = 147.35 MB/sec
[root@localhost ~]# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 808 MB in  3.00 seconds = 269.21 MB/sec

可以看到两次运行结果差距比较大,所以建议多次运行取平均值。

 

用这两种方式测试出来的结果是非常简单,专业测试磁盘性能时,不仅需要知道读写性能,还要区分读写数据大小(4k/16k/32k),还要测试是顺序读写还是随机读写,如果是机械硬盘还要测试内磁道和外磁道的速率差距等等。

高级检测方法

1、bonnie++

可通过yum安装(不包含在linux默认的yum源中,建议安装repoforge源):

yum install -y bonnie++

用法:bonnie++ -u 用户名 -s 测试读写文件大小

示例:

bonnie++ -u root -s 2g

默认情况下,会写一个4G大小的文件,分为4份,会通过读写随机操作对系统IO进行全面测试,由于写的文件比较大,所以时间会比较长。

结果:

[root@localhost ~]# bonnie++ -u root -s 2g
Using uid:0, gid:0.
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start em...done...done...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.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
localhost.locald 2G   287  99 31885  20 59035  15  2795  99 514292  64  9491 421
Latency             42230us    2804ms     284ms    8198us    5820us    4819us
Version  1.96       ------Sequential Create------ --------Random Create--------
localhost.localdoma -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 20946  92 +++++ +++ +++++ +++ 23169  94 +++++ +++ +++++ +++
Latency              2539us     853us     993us    1675us     284us    1234us
1.96,1.96,localhost.localdomain,1,1414376948,2G,,287,99,31885,20,59035,15,2795,99,514292,64,9491,421,16,,,,,20946,92,+++++,+++,+++++,+++,23169,94,+++++,+++,+++++,+++,42230us,2804ms,284ms,8198us,5820us,4819us,2539us,853us,993us,1675us,284us,1234us

这个格式实在有点乱,不过好在这个软件还提供了把结果转换成html表格的工具(用最后一行转换):

echo 1.96,1.96,localhost.localdomain,1,1414376948,2G,,287,99,31885,20,59035,15,2795,99,514292,64,9491,421,16,,,,,20946,92,+++++,+++,+++++,+++,23169,94,+++++,+++,+++++,+++,42230us,2804ms,284ms,8198us,5820us,4819us,2539us,853us,993us,1675us,284us,1234us | bon_csv2html >> bon_result.html

bon_result.html的显示如下:

这个就好看多了,简单解释一下:

Sequential Output(顺序输出,实际是写操作)下的 Per Char是值用putc方式写,毫无疑问,因为cache的line总是大于1字节的,所以不停的骚扰CPU执行putc,看到cpu使用率是99%.写的速度是0.3MB/s,非常慢了。

Sequential Output下的block是按照block去写的,明显CPU使用率就下来了,速度也上去了,是31MB/s,跟上面用dd测试的差不多。

Sequential Input(顺序输入,实际是读操作)下的Per Char是指用getc的方式读文件,速度是2.5MB/s,CPU使用率是99%。

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

Random Seeks是随机寻址,每秒寻址9000多次还算可以的。

Sequential Create(顺序创建文件)

Random Create(随机创建文件)

有的结果是很多+号,这表示bonner++认为值不可靠,于是不输出。一般来说是因为执行的很快,一般来说不是系统瓶颈,所以不用担心。

2、iozone

iozone提供的信息更全面和精确,所以iozone是系统性能测试中用的最多的工具之一。

iozone使用略复杂,这里只用最常用的一些参数:

-l:最小的进程数量,用于并发测试,不想测多进程可以设置为1。

-u:最大的进程数量,用于并发测试,不想测多进程可以设置为1。

-r:默认读写基本单位,如16k,这个值一般跟测试的应用有关,如要测试数据库,这个值就跟数据库的块大小一致。

-s:默认读写的大小,建议这个值大一些(一般为2倍内存大小),因为iozone并不会规避低层的缓存,所以如果值比较小,可能直接在内存中就完成了。

-F:指定缓存文件

示例:

iozone -l 1 -u 1 -r 16k -s 2g -F tempfile

结果:

Children see throughput for  1 initial writers  =   31884.46 kB/sec
Parent sees throughput for  1 initial writers   =   30305.05 kB/sec
Min throughput per process          =   31884.46 kB/sec 
Max throughput per process          =   31884.46 kB/sec
Avg throughput per process          =   31884.46 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for  1 rewriters    =  102810.49 kB/sec
Parent sees throughput for  1 rewriters     =   95660.98 kB/sec
Min throughput per process          =  102810.49 kB/sec 
Max throughput per process          =  102810.49 kB/sec
Avg throughput per process          =  102810.49 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for  1 readers      =  450193.59 kB/sec
Parent sees throughput for  1 readers       =  450076.28 kB/sec
Min throughput per process          =  450193.59 kB/sec 
Max throughput per process          =  450193.59 kB/sec
Avg throughput per process          =  450193.59 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 re-readers    =  451833.53 kB/sec
Parent sees throughput for 1 re-readers     =  451756.47 kB/sec
Min throughput per process          =  451833.53 kB/sec 
Max throughput per process          =  451833.53 kB/sec
Avg throughput per process          =  451833.53 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 reverse readers   =   61854.02 kB/sec
Parent sees throughput for 1 reverse readers    =   61851.88 kB/sec
Min throughput per process          =   61854.02 kB/sec 
Max throughput per process          =   61854.02 kB/sec
Avg throughput per process          =   61854.02 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 stride readers    =   43441.66 kB/sec
Parent sees throughput for 1 stride readers     =   43439.83 kB/sec
Min throughput per process          =   43441.66 kB/sec 
Max throughput per process          =   43441.66 kB/sec
Avg throughput per process          =   43441.66 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 random readers    =   47707.72 kB/sec
Parent sees throughput for 1 random readers     =   47705.00 kB/sec
Min throughput per process          =   47707.72 kB/sec 
Max throughput per process          =   47707.72 kB/sec
Avg throughput per process          =   47707.72 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 mixed workload    =   50807.69 kB/sec
Parent sees throughput for 1 mixed workload     =   50806.24 kB/sec
Min throughput per process          =   50807.69 kB/sec 
Max throughput per process          =   50807.69 kB/sec
Avg throughput per process          =   50807.69 kB/sec
Min xfer                    = 2097152.00 kB

Children see throughput for 1 random writers    =   45131.93 kB/sec
Parent sees throughput for 1 random writers     =   43955.32 kB/sec
Min throughput per process          =   45131.93 kB/sec 
Max throughput per process          =   45131.93 kB/sec
Avg throughput per process          =   45131.93 kB/sec
Min xfer                    = 2097152.00 kB

从上面的结果中可以看到各种方式下系统磁盘的读写性能。

PS:其实下面还有结果,只是我的虚拟机磁盘满了,崩溃了。

参考文档

1、Linux硬盘性能检测

2、了解你的磁盘之使用bonnie++测试磁盘性能

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。