linux下查找最耗iowait的进程
kevin.Zhu 发布于:2013-1-16 11:53 分类:Linux 有 17 人浏览,获得评论 0 条
很多时候发现linux系统输入一些命令很慢,用top查看IOwait占用CPU很高,top下面列出的进程中,不论按cpu排序、内存排序、时间排序,都看不出来到底哪个进程(哪个分区)占用ipwait最高。
Waiting
|
那么到底怎么知道是哪个进程导致iowait过高?
系统日志是没有记录这些内容的,但是内核中有相应的方式。Linux 内核里提供了一个 block_dump 参数用来把 block 读写(WRITE/READ)状况 dump 到日志里,这样可以通过 dmesg 命令来查看。
看一下介绍
|
我们首先想个办法让iowait上来,可以用dd,也可以用cp,下面一个简单的脚本:
|
如果使用block_dump那么需要关闭syslog,否则klog会打印很多日志到messages中,这样更加让系统不堪重负。
service syslog stop |
打开block dump:
echo 1 > /proc/sys/vm/block_dump |
统计方法:
[root@fan3838 tmp]# dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z]*)' | sort | uniq -c | sort -rn | head |
网上有人写了一个perl脚本来处理输出,能得到更直观的结果:
参考:http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/
下载地址:http://aspersa.googlecode.com/svn/trunk/iodump
这是一个perl脚本,原理是:将dmesg清空,然后统计1秒内dmesg所dump的block信息。
while true; do sleep 1; dmesg -c; done | perl iodump |
因为给出的方法只要结果不要dmesg输出内容,所以封装到while true中然后交给iodump处理 所以执行此命令需要ctrl+c停止之后才能看到结果。
[root@fan3838 tmp]# while true; do sleep 1; dmesg -c; done|perl /root/iodump |
上面这个结果已经很清楚了,最高的就是cp产生的,说明cp在大概1秒钟之内读写最多,达到1051次 那么造成iowait的罪魁祸首就是cp了。 当然应该多执行几次能得到更精确的结果,有可能是“协助作案”呢。 另:为什么kjournald最多而不“验证”一下这个进程呢?这进程是干什么的?搜索一下,ext3文件系统日志相关。这个进程正常。 测试完毕不要忘记关掉block_dump和启动syslog:
echo 0 > /proc/sys/vm/block_dump service syslog start |
博客推荐文章
-
linux下dup2的实现 (34分钟前)
-
Makefile 需要注意的内容 (42分钟前)
-
Linux 内存管理 重要结构体 (转) (47分钟前)
-
yum 安装卸载软件 (48分钟前)
-
Linux 信号signal处理机制 (58分钟前)