linux系统性能优化及瓶颈分析一,用vmstat分析系统I/O情况[root@localhost ~]# vmstat -n 3 (每个3秒刷新一次)procs-----------memory--------------------swap--- ---io---- --system---- ------cpu--------r b swpd free buff cache si so bi bo in cs us sy id wa1 0 144 186164 1052522386848 0 0 18 166 83 2 48 21 31 02 0 144 189620 1052522386848 0 0 0 177 10391210 34 10 56 00 0 144 214324 1052522386848 0 0 0 10 1071 670 32 5 63 00 0 144 202212 1052522386848 0 0 0 189 1035 558 20 377 02 0 144 158772 1052522386848 0 0 0 203 10652832 70 14 15 0IO-bi:从块设备读入的数据总量(读磁盘)(KB/S)-bo:写入到块设备的数据总量(写磁盘)(KB/S)随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在IO等待的值也会越大二,用iostat分析I/O子系统情况如果你的系统没有iostat,sar,mpstat等命令,安装sysstat-7.0.2-1.el5.i386.rpm包,iostat工具将对系统的磁盘操作活动进行监视。
它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU 使用情况。
同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat的语法如下:程序代码iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。
iostat在内核2.4和内核2.6中数据来源不太一样,对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions;在2.6中,数据来源主要是/proc/diskstats和/sys/block/sd*/stat这两个文件#cat /proc/diskstats | grep sda8 0 sda 17945521 1547188 466667211 174042714 1585387442776252 469241932 2406054445 0 137655809 25809604228 1 sda1 936 1876 6128 2 sda2 19489178 466659986 58655070 4692402248 3 sda3 1270 1441 332648 4 sda4 4 80 08 5 sda5 648 1442 08 6 sda6 648 1442 0第1列 : 磁盘主设备号(major)第2列 : 磁盘次设备号(minor)第3列 : 磁盘的设备名(name)第4列 : 读请求总数(rio)第5列 : 合并的读请求总数(rmerge)第6列 : 读扇区总数(rsect)第7列 : 读数据花费的时间,单位是ms.(从__make_request到end_that_request_last)(ruse)第8列 : 写请求总数(wio)第9列 : 合并的写请求总数(wmerge)第10列 : 写扇区总数(wsect)第11列 : 写数据花费的时间,单位是ms. (从__make_request到end_that_request_last)(wuse)第12列 : 现在正在进行的I/O数(running),等于I/O队列中请求数第13列 : 系统真正花费在I/O上的时间,除去重复等待时间(aveq)第14列 : 系统在I/O上花费的时间(use)。
#iostat -x 1Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/27/2009avg-cpu: %user %nice %system %iowait %steal %idle30.72 0.00 5.00 5.72 0.00 58.56 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %utilsda 0.79 21.81 9.15 8.08 237.99 2 39.29 27.69 1.32 76.31 4.07 7.02sdb 0.69 19.13 3.26 2.99 153.08 176.92 52.85 0.43 68.80 5.96 3 .72sdc 3.47 89.30 10.95 7.30 213.30 7 72.94 54.04 1.32 72.43 4.18 7.63每项数据的含义如下,rrqm/s: 每秒进行 merge 的读操作数目。
即 rmerge/swrqm/s: 每秒进行 merge 的写操作数目。
即 wmerge/sr/s: 每秒完成的读 I/O 设备次数。
即 rio/sw/s: 每秒完成的写 I/O 设备次数。
即 wio/srsec/s: 每秒读扇区数。
即 rsect/swsec/s: 每秒写扇区数。
即 wsect/srkB/s: 每秒读K字节数。
是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。
是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
即(rsect+wsect)/(rio+wio)avgqu-sz: 平均I/O队列长度。
即 aveq/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
即(ruse+wuse)/(rio+wio)svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
即 use/(rio+wio) %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间I/O队列是非空的,即use/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 洪水。
io/s = r/s +w/sawait=(ruse+wuse)/io(每个请求的等待时间)await*io/s=每秒内的I/O请求总共需要等待的msavgqu-sz=await*(r/s+w/s)/1000(队列长度)以下数据其实与/proc/diskstats中除设备号与设备名外的其它数据是一一对应关系,只是统计的方法略有差别而已。
#cat /sys/block/sda/stat17949157 1547772 466744707 174070520 15855905 42781288 469298468 2406092114 2 137680700 2581025934三,sar -b 监控I/O#sar -b 1 10Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/200912:19:40AM tps rtps wtps bread/s bwrtn /s12:19:42AM 21.48 9.40 12.08 187.92 429.5312:19:43AM 14.00 14.00 0.00 840.00 0.00 12:19:44AM 10.29 8.82 1.47 235.29 217.65 12:19:45AM 12.87 10.89 1.98 752.48 142.5712:19:46AM 19.82 12.61 7.21 425.23 381.98 12:19:47AM 19.00 19.00 0.00 512.00 0.00 12:19:49AM 9.29 9.29 0.00 262.86 0.00 12:19:50AM 16.00 5.00 11.00 144.00 536.00 12:19:51AM 17.65 8.82 8.82 211.76 235.29 12:19:52AM 41.41 29.29 12.12 614.14 363.64 Average: 17.75 12.30 5.45 397.19 231.99-tps:每秒钟对磁盘发送transfer的总数,一个transfer就是一个I/O,多个逻辑请求组合成一个对磁盘的I/O请求,一个transfer的大小不确定。
-rtps:每秒钟的物理读的总数-wtps:每秒钟的物理写的总数-bread/s:每秒钟从磁盘读取的数据总数-bwrtn/s:每秒钟写入磁盘的数据的总数四,sar -d 1 10Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/200912:38:56 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util12:38:57 AM dev8-0 15.00 232.00 0.00 15.47 0.010.87 0.87 1.3012:38:57 AM dev8-16 6.00 80.00 320.00 66.67 0.058.67 8.67 5.2012:38:57 AM dev8-32 10.00 224.00 0.00 22.40 0.099.20 9.20 9.20tps:每秒钟对磁盘发送transfer的总数,一个transfer就是一个I/O,多个逻辑请求组合成一个对磁盘的I/O请求,一个transfer的大小不确定rd_sec/s每秒钟读取的扇区数,每个扇区512 bytes.wr_sec/s每秒钟写入的扇区数,每个扇区512 bytes.avgrq-sz对磁盘请求的扇区的平均大小。