linux根据io消耗找进程


本方法通过perl脚本对io情况进行实时抓取,非常方便。


perl脚本下载:
wget http://aspersa.googlecode.com/svn/trunk/iodump

可将该脚本命名为iodump.sh,内容如下:
=pod

=head1 NAME

iodump - Compute per-PID I/O stats for Linux when iotop/pidstat/iopp are not available.

=head1 SYNOPSIS

Prepare the system:

  dmesg -c
  /etc/init.d/klogd stop
  echo 1 > /proc/sys/vm/block_dump

Start the reporting:

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

Stop the system from dumping these messages:

  echo 0 > /proc/sys/vm/block_dump
  /etc/init.d/klogd start

=head1 AUTHOR

Baron Schwartz

=cut

use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use sigtrap qw(handler finish untrapped normal-signals);

my %tasks;

my $oktorun = 1;
my $line;
while ( $oktorun && (defined ($line = <>)) ) {
   my ( $task, $pid, $activity, $where, $device );
   ( $task, $pid, $activity, $where, $device )
      = $line =~ m/(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)/;
   if ( !$task ) {
      ( $task, $pid, $activity, $where, $device )
         = $line =~ m/(\S+)\((\d+)\): (dirtied) inode \(.*?\) (\d+) on (\S+)/;
   }
   if ( $task ) {
      my $s = $tasks{$pid} ||= { pid => $pid, task => $task };
      ++$s->{lc $activity};
      ++$s->{activity};
      ++$s->{devices}->{$device};
   }
}

printf("%-15s %10s %10s %10s %10s %10s %s\n",
   qw(TASK PID TOTAL READ WRITE DIRTY DEVICES));
foreach my $task (
   reverse sort { $a->{activity} <=> $b->{activity} } values %tasks
) {
   printf("%-15s %10d %10d %10d %10d %10d %s\n",
      $task->{task}, $task->{pid},
      ($task->{'activity'}  || 0),
      ($task->{'read'}      || 0),
      ($task->{'write'}     || 0),
      ($task->{'dirty'}     || 0),
      join(', ', keys %{$task->{devices}}));
}

sub finish {
   my ( $signal ) = @_;
   if ( $oktorun ) {
      print STDERR "# Caught SIG$signal.\n";
      $oktorun = 0;
   }
   else {
      print STDERR "# Exiting on SIG$signal.\n";
      exit(1);
   }
}


给执行权限
# chmod +x /root/iodump.sh

执行脚本
# while true; do sleep 1; dmesg -c; done | perl /root/iodump.sh
等待一段时间,然后通过ctrl+c来结束脚本,就可以得到详细的进程对应io信息。

如:
# while true; do sleep 1; dmesg -c; done | perl /root/iodump.sh
# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
oracle               10941       9645       9645          0          0 sdb1
oracle               25019       1726         10       1716          0 sdb1
oracle               10552        970        272        698          0 sdb1
kjournald             6356        613          0        613          0 sdb1
kjournald             2601        487          0        487          0 sda3
oracle               26100        415        415          0          0 sdb1
pdflush               1502        301          0        301          0 sdb1, sda3
oracle               10554        132         33         99          0 sdb1
oracle               26265         55         54          1          0 sdb1
oracle               10550         14          0         14          0 sdb1
oracle               10548         12          0         12          0 sdb1
oracle               10542          6          0          6          0 sdb1
oracle               10546          6          0          6          0 sdb1
oracle               10544          6          0          6          0 sdb1

oracle               10540          5          0          5          0 sdb1


参考:

http://os.51cto.com/art/201208/354609_1.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值