IO系统性能之三:在Linux中监视IO性能(zz)

from:http://www.dbabeta.com/2009/io-performence-03_check-performence-in-linux.html

dd命令

dd其实是工作于比较低层的一个数据拷贝和转换的*nix平台的工具,但是因为dd命令支持*nix平台的一些特殊设备,因此我们可以利用dd命令的这个特性来简单的测试磁盘的性能。

先说一下两个相关的特殊设备

/dev/null

空设备,通常用作输出设备,这个是*nix系统上面的黑洞,所有送到这个空设备上的内容都会凭空消失。

/dev/zero

空字符,通常用作输入,从/dev/zero中读取时,它能源源不断的提供空字符(ASCIINUL,0×00)出来,要多少有多少。

于是就有了下面的用法:

测试磁盘的写入

/usr/bin/timeddif=/dev/zeroof=/tmp/foobs=4kcount=1024000

这个命令时往磁盘的文件/tmp/foo中写入一个4G大小的文件,当然文件的内容全部是空字符了,同时用/usr/bin/time来对命令的执行进行计时,命令中的bs指的是写入文件时的块大小,其实就相当于Oracle中的block大小了,count是写入的块数。采取这种方法来写入数据时只是测试的连续读磁盘的性能,而不是随机读的性能,不能采取这种方法检查一个机器的IOPS的,只能检查磁盘的吞吐率。

测试磁盘的读取

/usr/bin/timeddif=/tmp/fooof=/dev/nullbs=4k

上面的命令是从/tmp/foo文件中读取数据,然后扔掉,这里bs用的是读取时块的大小。和上面写入的命令一样,这样测试的仅仅是最大的读取性能,而不是随机IO的性能。

还能读写同时测试

/usr/bin/timeddif=/tmp/fooof=/tmp/foo2bs=4k

在上面的命令中都用到了time命令对操作进行计时,这样才能正确的进行判断。要记住的一点是dd命令只能够提供一个大概的测试,通过这个简单的命令可以对磁盘系统的最大性能有一个大概的了解,要了解更详细的信息还要通过其他方法来查看。

topiostat命令

top理解iostat的各项输出

在Linux中,我们执行一个iostat-x命令,我们能看到如下的输出

$iostat-x

Linux2.4.21-50a6smp(linux)11/03/2009

avg-cpu:%user%nice%sys%iowait%idle

0.420.000.260.4798.86

Device:rrqm/swrqm/sr/sw/srsec/swsec/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

hdc0.010.000.000.000.070.000.030.0024.480.004.904.570.00

hda0.898.540.744.4912.60104.226.3052.1122.320.035.411.010.53

我们先列举一下各个性能指标的简单说明。

rrqm/s

每秒进行merge的读操作数目。

wrqm/s

每秒进行merge的写操作数目。

r/s

每秒完成的读I/O设备次数。

w/s

每秒完成的写I/O设备次数。

rsec/s

每秒读扇区数。

wsec/s

每秒写扇区数。

rkB/s

每秒读K字节数。

wkB/s

每秒写K字节数。

avgrq-sz

平均每次设备I/O操作的数据大小(扇区)。

avgqu-sz

平均I/O队列长度。

await

平均每次设备I/O操作的等待时间(毫秒)。

svctm

平均每次设备I/O操作的服务时间(毫秒)。

%util

一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。

要理解这些性能指标我们先看下图

IO的执行过程的各个参数

上图的左边是iostat显示的各个性能指标,每个性能指标都会显示在一条虚线之上,这表明这个性能指标是从虚线之上的那个读写阶段开始计量的,比如说图中的w/s从LinuxIOscheduler开始穿过硬盘控制器(CCIS/3ware),这就表明w/s统计的是每秒钟从LinuxIOscheduler通过硬盘控制器的写IO的数量。

结合上图对读IO操作的过程做一个说明,在从OSBufferCache传入到OSKernel(LinuxIOscheduler)的读IO操作的个数实际上是rrqm/s+r/s,直到读IO请求到达OSKernel层之后,有每秒钟有rrqm/s个读IO操作被合并,最终转送给磁盘控制器的每秒钟读IO的个数为r/w;在进入到操作系统的设备层(/dev/sda)之后,计数器开始对IO操作进行计时,最终的计算结果表现是await,这个值就是我们要的IO响应时间了;svctm是在IO操作进入到磁盘控制器之后直到磁盘控制器返回结果所花费的时间,这是一个实际IO操作所花的时间,当await与svctm相差很大的时候,我们就要注意磁盘的IO性能了;而avgrq-sz是从OSKernel往下传递请求时单个IO的大小,avgqu-sz则是在OSKernel中IO请求队列的平均大小。

现在我们可以将iostat输出结果和我们前面讨论的指标挂钩了。

平均单次IO大小(IOChunkSize)<=>avgrq-sz

平均IO响应时间(IOResponseTime)<=>await

IOPS(IOperSecond)<=>r/s+w/s

吞吐率(Throughtput)<=>rkB/s+wkB/s

topiostat的应用实例

top观察IOScheduler的IO合并(IOMerge)

前面说过IO在执行过程中会被合并以提高效率,下面就结合dd命令和iostat命令看一下。

我们先执行dd命令,设置bs参数值为1k,完整命令如下

ddif=/dev/zeroof=testbs=1kcount=1024000

同时打开另外一个终端执行iostat命令,这里只查看变化那个磁盘的更改,每秒刷新一次数据,完整命令如下

iostat-xhdc71

然后我们可以得到下面的结果

Device:rrqm/swrqm/sr/sw/srsec/swsec/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

hdc70.009447.000.00776.000.0080616.000.0040308.00103.89480.18805.951.29100.00

avg-cpu:%user%nice%sys%iowait%idle

0.500.0056.0043.500.00

Device:rrqm/swrqm/sr/sw/srsec/swsec/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

hdc70.009534.000.00872.000.0081384.000.0040692.0093.33274.56401.191.1499.00

avg-cpu:%user%nice%sys%iowait%idle

2.500.0046.5014.0037.00

Device:rrqm/swrqm/sr/sw/srsec/swsec/srkB/swkB/savgrq-szavgqu-szawaitsvctm%util

hdc70.006766.001.00276.008.0058808.004.0029404.00212.33197.27321.661.9554.00

avg-cpu:%user%nice%sys%iowait%idle

0.500.000.500.0099.00

看结果中第一组数据中的avgrq-sz,为103.89个扇区,磁盘的每个扇区为512字节,因此平均IO大小为103.89*512/1024=52k字节,远远大于我们dd命令时给定的参数1k字节,也就是说IO在中间被合并了。看巨大的wrqm/s也能得出同样的结论。

top附:在Windows中监视IO性能

本来准备写一篇windows中监视IO性能的,后来发现好像可写的内容不多,windows在细节这方面做的不是那么的好,不过那些基本信息还是有的。

在Windows中监视性能基本都用性能监视器了,与IO性能相关的有两个大类,一个是”LogicalDisk”,另外一个是”PhysicalDisk”,”LogicalDisk”更多的是用来监视文件相关的IO性能,而”PhysicalDisk”则是用来监视LUN或者是磁盘卷,下面就列举下与前面所列举的IO性能相关的计数器,具体的自己研究了:

单次IO大小

Avg.DiskBytes/Read

Avg.DiskBytes/Write

IO响应时间

Avg.Disksec/Read

Avg.Disksec/Write

IOPS

DiskReads/sec

DiskWrites/sec

DiskTransfers/sec

IO吞吐率

DiskBytes/sec

DiskReadBytes/sec

DiskWriteBytes/sec

top延伸阅读

time命令

dd(Unix)

LearnTheddCommand

iostat详解

linux下的sar工具命令小结

相关推荐