Linux操作系统下测试磁盘读写速度

来源:互联网 发布:网上做账软件 编辑:程序博客网 时间:2024/05/16 11:03

如何提高系统的性能是所有Linux系统工程师都要考虑的问题,尤其对于大数据处理,不得不考虑系统的读写性能。要知道读写性能,前面博客中提到/O性能,可以看到每个I/O的状态,现在需要知道一个磁盘每秒读写数据的速度到底可以达到多少?

可以使用hdparm工具,需要注意的是这个命令是用来获取或者设置SATA/IDE设备参数的命令。其命令的使用格式如下:

hdparm [flag] [device]   ...
有关这个命令具体的使用参数可以使用man进行查看。这里我们使用下面的命令进行磁盘读写速度的查看:

hdparm -Tt  /dev/sda
这里的T表示直接从Linux的缓存区而不通过磁盘读取数据的速度,t表示读取磁盘数据的速度,可以看到下面的结果:

/dev/sda:Timing cached reads: 6676 MB in 2.00 seconds = 3340.18 MB/secTiming buffered disk reads: 218 MB in 3.11 seconds = 70.11 MB/sec
以上只是早期的Linux工程师为了测试磁盘的读写状态而写的一个命令。但实际中有IDE、SATA、SCSI、光纤,这四种类型的磁盘接口,前两种比较普遍,主要使用与家用设备,一些服务器上也使用;SCSI主要用于服务器接口且支持热插拔,其具有多任务、带宽大、CPU的占用率低等特点;光纤则用于高端服务器接口,它也具有热插拔、高速带宽、远程连接、可连接设备多等特点。使用这个命令,只是能解决前面两种,后面两种无法解决,这种情况下只能另寻出路了。

Linux系统有个命令,df与dd。我们可以首先使用df查看一下系统中可用的磁盘容量,然后再利用time命令,结合dd命令最后得出磁盘的读写速度,这样就可以解决上面的问题了。

这里需要注意的一点是,提取这个time的输出内容的时候要注意,我们通过使用man time可以看见这么一句话:

When command finishes ,time writes a message to standard error giving timing statistics about this program run.

可以得time命令是使用标准出错(STDERROR)将程序的运行结果输出,所以直接使用管道通过标准输出获取结果是错误的。这里我们需要进行重定向,命令之间的重定向我们利用管道可以实现,输出重定向有以下几种:
>等价于1>重定向标准输出;

> file重定向到文件file;

2>&1将标准错误输出重定向到标准输出。这里的形式n>&m,可以使得文件描述符n成为输出文件描述符m的副本,也就是n的输出重定向到m;

&>file,标准错误输出与标准输出重定向到文件file中。

可以使用下面两种命令来实现

(time dd if=/dev/zero of=/opt/hello.txt bs=8k count=100000 conv=fdatasync) 2>&1 | grep 'real'
上面的命令,我们将time作为一个子命令进行运行用()操作,然后再利用2>&1将标准出错重定向到标准输出,然后再提取出含real字符串的一项。
{time dd if=/dev/zero of=/opt/hello.txt bs=8k count=100000 conv=fdatasync; }2>&1 |grep 'real'

上面命令使用{}进行子命令的执行,注意结尾的}前面有一个空格,否则此命令无法执行。

可以写一个脚本进行测试:

#!/bin/bashtestfile=/opt/tempfile.txtoption1=syncoption2=fsyncoption3=fdatasyncfreespace=$(df -m |sed -n '2p' | awk '{print $4}')echo $freespaceif [ $(($freespace > 2048)) ]thencosttime=$( (time dd if=/dev/zero  of=$testfile bs=8k count=200000 conv=$option3) 2>&1 |grep 'real'|awk '{print $2}')    echo $costtimemin=${costtime%m*}sectemp=${costtime#*m}sec=${sectemp%s*}total_time=$(echo "$min*60+$sec" | bc -l)if [ $(echo "$total_time>0"|bc) -eq 1 ];then    echo "the total time is $total_time secs"    average=$( echo "1638.4/$total_time"|bc -l)    echo "the speed of this disk is $average Mb/s"firm -rf $testfilefi
以上脚本测试往磁盘写入1.6G数据的时候磁盘的速度,这里在使用dd命令的时候,使用了参数conv=fdatasync,表示直接将数据写入到磁盘,这样测得的数据就是实际写入磁盘的速度,了解IO同步可以看下本博客中这篇。






1 0