1、IO系统性能之三:在 Linux中监视 IO性能2011年 03月 28日 05:00 it168网站原创 作者:DBABeta 马齿苋 编辑:李隽 评论:0 条 本文 Tag: 磁盘阵列 【IT168 专稿】dd 其实是工作于比较低层的一个数据拷贝和转换的*nix 平台的工具,但是因为dd命令支持*nix 平台的一些特殊设备,因此我们可以利用 dd命令的这个特性来简单的测试磁盘的性能。dd 命令先说一下两个相关的特殊设备/dev/null空设备,通常用作输出设备,这个是*nix 系统上面的黑洞,所有送到这个空设备上的内容都会凭空消失。/dev/zero空字符,通常用作输入,从/dev/zer
2、o 中读取时,它能源源不断的提供空字符(ASCII NUL, 000)出来,要多少有多少。于是就有了下面的用法:测试磁盘的写入:/usr/bin/time dd if=/dev/zero of=/tmp/foo bs=4k count=1024000这个命令时往磁盘的文件/tmp/foo 中写入一个 4G大小的文件,当然文件的内容全部是空字符了,同时用/usr/bin/time 来对命令的执行进行计时,命令中的 bs指的是写入文件时的块大小,其实就相当于 Oracle中的 block大小了,count 是写入的块数。采取这种方法来写入数据时只是测试的连续读磁盘的性能,而不是随机读的性能,不能采
3、取这种方法检查一个机器的 IOPS的,只能检查磁盘的吞吐率。测试磁盘的读取:/usr/bin/time dd if=/tmp/foo of=/dev/null bs=4k上面的命令是从/tmp/foo 文件中读取数据,然后扔掉,这里 bs用的是读取时块的大小。和上面写入的命令一样,这样测试的仅仅是最大的读取性能,而不是随机 IO的性能。还能读写同时测试:/usr/bin/time dd if=/tmp/foo of=/tmp/foo2 bs=4k在上面的命令中都用到了 time命令对操作进行计时,这样才能正确的进行判断。要记住的一点是 dd命令只能够提供一个大概的测试,通过这个简单的命令可以对
4、磁盘系统的最大性能有一个大概的了解,要了解更详细的信息还要通过其他方法来查看。理解 iostat的各项输出在 Linux中,我们执行一个 iostat -x命令,我们能看到如下的输出$iostat -xLinux 2.4.21-50a6smp (linux) 11/03/2009avg-cpu: %user %nice %sys %iowait %idle0.42 0.00 0.26 0.47 98.86Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilhdc 0
5、.01 0.00 0.00 0.00 0.07 0.00 0.03 0.00 24.48 0.00 4.90 4.57 0.00hda 0.89 8.54 0.74 4.49 12.60 104.22 6.30 52.11 22.32 0.03 5.41 1.01 0.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字节数。
6、avgrq-sz:平均每次设备 I/O操作的数据大小(扇区)。avgqu-sz:平均 I/O队列长度。await:平均每次设备 I/O操作的等待时间(毫秒)。svctm:平均每次设备 I/O操作的服务时间(毫秒)。%util:一秒中有百分之多少的时间用于 I/O操作,或者说一秒中有多少时间 I/O队列是非空的。要理解这些性能指标我们先看下图IO的执行过程的各个参数上图的左边是 iostat显示的各个性能指标,每个性能指标都会显示在一条虚线之上,这表明这个性能指标是从虚线之上的那个读写阶段开始计量的,比如说图中的 w/s从 Linux IO scheduler开始穿过硬盘控制器(CCIS/3wa
7、re),这就表明 w/s统计的是每秒钟从 Linux IO scheduler通过硬盘控制器的写 IO的数量。结合上图对读 IO操作的过程做一个说明,在从 OS Buffer Cache传入到 OS Kernel(Linux IO scheduler)的读 IO操作的个数实际上是 rrqm/s+r/s,直到读 IO请求到达 OS Kernel层之后,有每秒钟有 rrqm/s个读 IO操作被合并,最终转送给磁盘控制器的每秒钟读 IO的个数为 r/w;在进入到操作系统的设备层(/dev/sda)之后,计数器开始对 IO操作进行计时,最终的计算结果表现是await,这个值就是我们要的 IO响应时间了
8、;svctm 是在 IO操作进入到磁盘控制器之后直到磁盘控制器返回结果所花费的时间,这是一个实际 IO操作所花的时间,当 await与 svctm相差很大的时候,我们就要注意磁盘的 IO性能了;而 avgrq-sz是从 OS Kernel往下传递请求时单个 IO的大小,avgqu-sz则是在 OS Kernel中 IO请求队列的平均大小。现在我们可以将 iostat输出结果和我们前面讨论的指标挂钩了。平均单次 IO大小(IO Chunk Size) avgrq-sz平均 IO响应时间(IO Response Time) awaitIOPS(IO per Second) r/s + w/s吞吐率
9、(Throughtput) rkB/s + wkB/stopiostat 的应用实例观察 IO Scheduler的 IO合并(IO Merge)前面说过 IO在执行过程中会被合并以提高效率,下面就结合 dd命令和 iostat命令看一下。我们先执行 dd命令,设置 bs参数值为 1k,完整命令如下dd if=/dev/zero of=test bs=1k count=1024000同时打开另外一个终端执行 iostat命令,这里只查看变化那个磁盘的更改,每秒刷新一次数据,完整命令如下iostat -x hdc7 1然后我们可以得到下面的结果Device: rrqm/s wrqm/s r/s
10、w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilhdc7 0.00 9447.00 0.00 776.00 0.00 80616.00 0.00 40308.00 103.89 480.18 805.95 1.29 100.00avg-cpu: %user %nice %sys %iowait %idle0.50 0.00 56.00 43.50 0.00Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await
11、svctm %utilhdc7 0.00 9534.00 0.00 872.00 0.00 81384.00 0.00 40692.00 93.33 274.56 401.19 1.14 99.00avg-cpu: %user %nice %sys %iowait %idle2.50 0.00 46.50 14.00 37.00Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilhdc7 0.00 6766.00 1.00 276.00 8.00 58808.00
12、4.00 29404.00 212.33 197.27 321.66 1.95 54.00avg-cpu: %user %nice %sys %iowait %idle0.50 0.00 0.50 0.00 99.00看结果中第一组数据中的 avgrq-sz,为 103.89个扇区,磁盘的每个扇区为 512字节,因此平均 IO大小为 103.89*512/1024=52k字节,远远大于我们 dd命令时给定的参数 1k字节,也就是说IO在中间被合并了。看巨大的 wrqm/s也能得出同样的结论。附:在 Windows中监视 IO性能本来准备写一篇 windows中监视 IO性能的,后来发现好像可写
13、的内容不多,windows 在细节这方面做的不是那么的好,不过那些基本信息还是有的。在 Windows中监视性能基本都用性能监视器了,与 IO性能相关的有两个大类,一个是”LogicalDisk”,另外一个是”PhysicalDisk”,”LogicalDisk”更多的是用来监视文件相关的 IO性能,而”PhysicalDisk”则是用来监视 LUN或者是磁盘卷,下面就列举下与前面所列举的 IO性能相关的计数器,具体的自己研究了:单次 IO大小Avg. Disk Bytes/ReadAvg. Disk Bytes/WriteIO 响应时间Avg. Disk sec/ReadAvg. Disk sec/WriteIOPSDisk Reads/secDisk Writes/secDisk Transfers/secIO 吞吐率Disk Bytes/secDisk Read Bytes/secDisk Write Bytes/sec