本方法通过perl脚本对io情况进行实时抓取,非常方便。
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
参考: