Answers:
到目前为止,这iotop
是最好的整体解决方案。以下命令为使用磁盘的所有进程提供实时输出。
iotop -bktoqqq -d .5
where: -b is batch mode
-k is kilobytes/s
-t adds timestamp
-o only show processes or threads actually doing I/O
-qqq removes output headers
-d .5 updates every .5 seconds
即使如此,您也会注意到该进程将访问磁盘。研究的简单方法是停止该过程,并使用strace启动它。例如:
sudo strace -f nmbd -D
这将向您显示文件系统访问的系统调用。
另一个选项是inotify(7),其中许多发行版都提供“ inotify-tools”,因此您可以通过以下方式查看路径
inotifywait -r -m
path_you_want_to_watch
nmbd
在给定的strace
命令?
另一个选择是http://linux.die.net/man/7/inotify,其中许多发行版都提供“ inotify-tools”,因此您可以通过以下方式查看路径
inotifywait -r -m /<path you want to watch>
最近,我碰上了fatrace它采用fanotify。作品漂亮,所以我想我会分享。它确实记录了所有类型的文件操作,包括打开/创建/修改为stdout或可选的文件,您甚至可以过滤为仅获得某些类型的操作。默认情况下,它监视除虚拟安装以外的所有安装。作者本人在这里对此做了很好的解释。
#!/usr/bin/perl
use Cwd;
use File::Touch;
use File::Temp qw/tempfile/;
use Time::HiRes qw/sleep time alarm/;
use Term::ReadKey;
my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
if($hchar < 10) {print "please increase window size"; exit; }
my $mydir = getcwd;
my ($fh, $tmpfile) = tempfile(UNLINK => 1);
while(1)
{
my $starttime = time;
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 0.4;
$query = `find -neweraa $tmpfile 2>&1`; #change to mm for writes only
touch($tmpfile);
@files = split(/\n/,$query);
alarm 0;
};
system('clear');
foreach $file(@files) { $filecount{$file}++; }
@sorted = sort {$filecount{$b} <=> $filecount{$a}} (keys %filecount);
for ($x = 0;$x < $hchar-2; $x++) {print $filecount{$sorted[$x]}."\t".$sorted[$x]."\n";}
my $endtime = time;
my $length = ($endtime-$starttime);
if ($length > 0.3) {print "program not designed for large trees, please use smaller tree.\n"; exit;}
print "\n$length"."s\n"
}
fanotify
是Linux内核中的新文件系统通知框架(最近于2012年添加)。您可能要检查一下。使用它的工具和实用程序仍在编写中,因此您可能必须自己编写一个,但它比inotify,famin或到目前为止可能看到的任何其他功能都健壮。