全部博文(76)
分类: LINUX
2010-09-16 15:36:39
1. /proc/partitions iostat 的数据的主要来源是 /proc/partitions,所以需要先看看 /proc/partitions 中有些什么。 # cat /proc/partitions major minor #blocks name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq 3 0 19535040 hda 12524 31127 344371 344360 12941 25534 308434 1097290 -1 15800720 28214662 3 1 7172991 hda1 13 71 168 140 0 0 0 0 0 140 140 3 2 1 hda2 0 0 0 0 0 0 0 0 0 0 0 3 5 5116671 hda5 100 477 665 620 1 1 2 30 0 610 650 3 6 265041 hda6 518 92 4616 2770 257 3375 29056 143880 0 46520 146650 3 7 6980211 hda7 11889 30475 338890 340740 12683 22158 279376 953380 0 509350 1294120 major: 主设备号。3 代表 hda。 minor: 次设备号。7 代表 No.7 分区。 #blocks: 设备总块数 (1024 bytes/block)。19535040*1024 => 20003880960(bytes) ~2G name: 设备名称。如 hda7。 rio: 完成的读 I/O 设备总次数。指真正向 I/O 设备发起并完成的读操作数目, 也就是那些放到 I/O 队列中的读请求。注意很多进程发起的读操作 (read())很可能会和其他的操作进行 merge,不一定每个 read() 调用 都引起一个 I/O 请求。 rmerge: 进行了 merge 的读操作数目。 rsect: 读扇区总数 (512 bytes/sector) ruse: 从进入读队列到读操作完成的时间累积 (毫秒)。上面的例子显示从开机 开始,读 hda7 操作共用了约340秒。 wio: 完成的写 I/O 设备总次数。 wmerge: 进行了 merge 的写操作数目。 wsect: 写扇区总数 wuse: 从进入写队列到写操作完成的时间累积 (毫秒) running: 已进入 I/O 请求队列,等待进行设备操作的请求总数。上面的例子显 示 hda7 上的请求队列长度为 0。 use: 扣除重叠等待时间的净等待时间 (毫秒)。一般比 (ruse+wuse) 要小。比 如 5 个读请求同时等待了 1 毫秒,那么 ruse值为5ms, 而 use值为 1ms。use 也可以理解为I/O队列处于不为空状态的总时间。hda7 的I/O 队列非空时间为 509 秒,约合8分半钟。 aveq: 在队列中总的等待时间累积 (毫秒) (约等于ruse+wuse) 2. iostat 结果解析 # iostat -x Linux 2.4.21-9.30AX (localhost) 2004年07月14日 avg-cpu: %user %nice %sys %idle 3.85 0.00 0.95 95.20 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util /dev/hda 1.70 1.70 0.82 0.82 19.88 20.22 9.94 10.11 24.50 11.83 57.81 610.76 99.96 /dev/hda1 0.00 0.00 0.00 0.00 0.01 0.00 0.00 0.00 12.92 0.00 10.77 10.77 0.00 /dev/hda5 0.02 0.00 0.00 0.00 0.03 0.00 0.02 0.00 6.60 0.00 6.44 6.04 0.00 /dev/hda6 0.01 0.38 0.05 0.03 0.43 3.25 0.21 1.62 46.90 0.15 193.96 52.25 0.41 /dev/hda7 1.66 1.33 0.76 0.79 19.41 16.97 9.70 8.49 23.44 0.79 51.13 19.79 3.07 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s: 每秒读扇区数。即 delta(rsect)/s wsec/s: 每秒写扇区数。即 delta(wsect)/s rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。 wkB/s: 每秒写K字节数。是 wsect/s 的一半。 avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio) avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。 即 delta(use)/s/1000 (因为use的单位为毫秒) 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘 可能存在瓶颈。 svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了), svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多 也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用 得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑 更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是 按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。 3. I/O 系统 vs. 超市排队 举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当 是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人 购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队 排了。还有就是收银员的速度了,如果碰上了连钱都点不清楚的新手,那就有的 等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人 去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情 比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。 I/O 系统也和超市排队有很多类似之处: r/s+w/s 类似于交款人的总数 平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数 平均服务时间(svctm)类似于收银员的收款速度 平均等待时间(await)类似于平均每人的等待时间 平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少 I/O 操作率 (%util)类似于收款台前有人排队的时间比例。 我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间。 4. 一个例子 # iostat -x 1 avg-cpu: %user %nice %sys %idle 16.24 0.00 4.31 79.44 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util /dev/cciss/c0d0 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p1 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s + w/s = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。 平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是 同时发出的,那么平均等待时间可以这样计算: 平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数 应用到上面的例子: 平均等待时间 = 5ms * (1+2+...+28)/29 = 70ms,和 iostat 给出的 78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。 每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右), 这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。 一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。 delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s = 78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需 要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz 值应为 2.23,而不是 22.35。 用vmstat监视内存使用情况 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。 vmstat的语法如下: 程序代码 vmstat [-V] [-n] [delay [count]] procs memory page disk faults cpu r b w swap free re mf mi po fr de sr f0 s0 s1 s2 in sy cs us sy id 0 0 0 14888 19120 0 4 2 11 10 0 0 0 0 0 8 198 2158 98 11 19 69 SWAP的单位应该是K,不是M。还有两个比较重要的参数是PI、PO,表示内存的调入、调出页面,单位也是K,但是多大值作为一个衡量标准,我也不清楚,不知道是否有经验值。 还有,最好使用vmstat t [n]命令,例如 vmstat 5 5,表示在T(5)秒时间内进行N(5)次采样。如果只使用vmstat,无法反映真正的系统情况,试一下,看看结果就知道了。 procs: r-->在运行队列中等待的进程数 b-->在等待io的进程数 w-->可以进入运行队列但被替换的进程 memoy swap-->现时可用的交换内存(k表示) free-->空闲的内存(k表示) pages re--》回收的页面 mf--》非严重错误的页面 pi--》进入页面数(k表示) po--》出页面数(k表示) fr--》空余的页面数(k表示) de--》提前读入的页面中的未命中数 sr--》通过时钟算法扫描的页面 disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号 fault 显示每秒的中断数 in--》设备中断 sy--》系统中断 cy--》cpu交换 cpu 表示cpu的使用状态 cs--》用户进程使用的时间 sy--》系统进程使用的时间 id--》cpu空闲的时间 解释: 如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。 如果pi,po 长期不等于0,表示内存不足。 如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。 在使用UNIX操作系统的过程中,我们常常会用到各种各样的问题,比如系统运行速度 sar [options] [-A] [-o file] t [n] 在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有 -A:所有报告的总和。 下面将举例说明。 例一:使用命令行 sar -u t n 例如,每60秒采样一次,连续采样5次,观察CPU 的使用情况,并将采样结果以二进制 # sar -u -o zhou 60 5 屏幕显示: SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 在显示内容包括: %usr:CPU处在用户模式下的时间百分比。 在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈, 如果要查看二进制文件zhou中的内容,则需键入如下sar命令: # sar -u -f zhou 可见,sar命令即可以实时采样,又可以对以往的采样结果进行查询。 例二:使用命行sar -v t n 例如,每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令: # sar -v 30 5 屏幕显示: 显示内容包括: proc-sz:目前核心中正在使用或分配的进程表的表项数,由核心参数MAX-PROC控制。 inod-sz:目前核心中正在使用或分配的i节点表的表项数,由核心参数 file-sz: 目前核心中正在使用或分配的文件表的表项数,由核心参数MAX-FILE控 ov:溢出出现的次数。 Lock-sz:目前核心中正在使用或分配的记录加锁的表项数,由核心参数MAX-FLCKRE 显示格式为 实际使用表项/可以使用的表项数 显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如 例三:使用命行sar -d t n 例如,每30秒采样一次,连续采样5次,报告设备使用情况,需键入如下命令: # sar -d 30 5 屏幕显示: SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 显示内容包括: device: sar命令正在监视的块设备的名字。 在显示的内容中,wd-0是硬盘的名字,%busy的值比较小,说明用于处理传送请求的有 例四:使用命行sar -b t n 例如,每30秒采样一次,连续采样5次,报告缓冲区的使用情况,需键入如下命令: # sar -b 30 5 屏幕显示: SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001 显示内容包括: bread/s: 每秒从硬盘读入系统缓冲区buffer的物理块数。 在显示的内容中,最重要的是%cache和%wcache两列,它们的值体现着buffer的使用效 例五:使用命行sar -g t n 例如,每30秒采样一次,连续采样5次,报告串口I/O的操作情况,需键入如下命令: # sar -g 30 5 屏幕显示: SCO_SV scosysv 3.2v5.0.5 i80386 11/22/2001 显示内容包括: ovsiohw/s:每秒在串口I/O硬件出现的溢出。 ovsiodma/s:每秒在串口I/O的直接输入输出通道高速缓存出现的溢出。 ovclist/s :每秒字符队列出现的溢出。 在显示的内容中,每一列的值都是零,表明在采样时间内,系统中没有发生串口I/O溢 CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和 sar-d来看,以上举出的五例仅仅是其中的一部分,有兴趣的朋友不妨一试。 |