今天一台Centos服务器出了问题,客户端访问非常慢,电影播放间歇性卡壳,web访问也是很慢。首先看了服务器的流量,然后从网上找了一些方法查看服务器的IO读写负载,记录下来分享:
1. 用top命令查看:
top - 11:41:22 up 51 min, 2 users, load average: 0.01, 0.04, 0.01
Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.2%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4151760k total, 2284628k used, 1867132k free, 47892k buffers
Swap: 4192956k total, 0k used, 4192956k free, 2145020k cached
分析:查看0.4%wa这里,IO等待所占用的CPU时间的百分比,高过30%时IO压力高
2. 用iostat查看
用iostat -x 1 10
如果 iostat 没有,要 yum install sysstat安装这个包
iostat -x 1 10
Linux 2.6.18-92.el5PAE (CZ-Jinglingmingdu.51mox.com) 2013年09月17日
avg-cpu: %user %nice %system %iowait %steal %idle
0.18 0.00 0.19 0.36 0.00 99.27
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 8.38 7.25 8.07 3.17 1348.21 83.34 127.47 0.04 3.98 1.27 1.42
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.25 0.00 0.00 99.75
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 13.00 6.00 2.00 776.00 120.00 112.00 0.02 2.12 2.12 1.70
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.25 0.00 0.00 99.50
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 3.96 0.00 467.33 0.00 118.00 0.01 3.00 3.00 1.19
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.25 0.00 0.00 99.75
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 6.00 0.00 704.00 0.00 117.33 0.02 3.00 3.00 1.80
分析:
查看%util 1.42 %idle 99.27
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)
[root@CZ-Jinglingmingdu ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1785708 49772 2219820 0 0 155 10 301 134 0 0 99 0 0
如果你想对硬盘做一个IO负荷的压力测试可以用如下命令
time dd if=/dev/zero bs=1M count=2048 of=direct_2G
此命令为在当前目录下新建一个2G的文件
我们在新建文件夹的同时来测试IO的负荷情况
再通过如下脚本查看高峰的进程io情况
monitor_io_stats.sh
#!/bin/sh
/etc/init.d/syslog stop
echo 1 > /proc/sys/vm/block_dump
sleep 60
dmesg | awk '/(READ|WRITE|dirtied)/ {process[$1]++} END {for (x in process) \
print process[x],x}' |sort -nr |awk '{print $2 " " $1}' | \
head -n 10
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/syslog start
或者用iodump.pl脚本