统计Linux上进程的I/O情况

最近在做性能测试时,有一台同时运行activemq和mysql的linux服务器cpu1出现iowait达到95%的情况。于是想要定位哪个进程有大量i/o草组。

使用了几个工具,iostat,iodump,每个工具都各有千秋,总结如下。

1、使用iostat

特点:iostat可统计磁盘使用情况,包括是否处于忙碌状态、每秒读写次数、读写字节大小等。但好像无法定位到时哪个进程有较高的I/O。

应该不是linux自带的工具,因为我见过一些相同版本的Linux服务器有些带有iostat,有些则没有。

可以通过安装sysstat包,包括了iostat,mpstat,sra等工具包。

使用命令:

rpm -ivh sysstat-7.0.2-12.el5.x86_64.rpm

或者更简单(对于yum可用的系统):

yum install sysstat

使用yum安装成功的提示信息:

Installed:
  sysstat.x86_64 0:7.0.2-12.el5                                                                                                                                         

Complete!


完成安装则可以使用iostat了。

1)查看磁盘使用状态

命令:

 [root@virt001 man1]# iostat -d -k

输出:

Linux 2.6.18-308.el5xen (virt001)       08/01/2013

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
xvda            437.62         0.00      4249.50          0       4292
xvda1           437.62         0.00      4249.50          0       4292
xvda2             0.00         0.00         0.00          0          0

说明:

第一行显示磁盘xvda总的信息,下面两行分别说明各分区磁盘I/O信息。

使用-x可显示更多信息。

2)查看CPU使用信息

命令:

[root@virt001 man1]# iostat -c

输出:

Linux 2.6.18-308.el5xen (virt001)       08/01/2013

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.25    0.02    3.46    2.14    0.09   87.04

 

更详细命令说明可参考:http://www.orczhou.com/index.php/2010/03/iostat-detail/

 

2 使用iodump

在“google code”上有一个工程aspersa,提供了一个工具iodump,可统计每个进程的I/O情况,很方便用来定位产生iowait问题的进程。

下载工具包:wget http://aspersa.googlecode.com/svn/trunk/iodump

具体使用见作者博文:http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/

特点:方便定位cpu产生iowait问题的进程,适用于没有iotop工具包的linux旧版本。作者原话是“Compute per-PID I/O stats for Linux when iotop/pidstat/iopp are not available.”。

使用方法:

1、首先开启与I/O相关的内核消息统计,工具应该是基于这些消息统计数据的。

echo 1 > /proc/sys/vm/block_dump

2、将统计的与I/O相关的内核消息作为工具iodump的输入:

while true; do sleep 1; dmesg -c; done | perl iodump

 

3、等待运行一段时间,按ctrl + c终止程序运行,得到如下统计信息(单位不清楚,不过信息还是有用):

# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
kjournald              622     187254          0     187254          0 dm-0
mysqld               17505      70996         91      70905          0 dm-0
mysqld               22182      34441         74      34367          0 dm-0
mysqld               22454      30861         44      30817          0 dm-0
mysqld               22227      29812         53      29759          0 dm-0
java                  3924      24881          0      24881          0 dm-0
mysqld               21699      13510          3      13507          0 dm-0
mysqld               21513      10334          2      10332          0 dm-0

上述信息简单明了。

4、关闭I/O信息内核统计

echo 0 > /proc/sys/vm/block_dump


这次使用iodump和iostat就定位到时mysql有大量I/O操作。其他工具比如iotop,iopp,dstat就没有使用。有篇文章写得比较详细,链接是:http://www.51testing.com/html/24/n-822524-2.html

 

你可能感兴趣的:(统计Linux上进程的I/O情况)