linux 找出耗io的,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
參考:
總結
以上是生活随笔為你收集整理的linux 找出耗io的,linux根据io消耗找进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux socket原理,socke
- 下一篇: c语言存储结构体,c语言结构体的保存和导