FreeBSDシステムでIOジョブを確認する

FreeBSDシステムでIOジョブを確認する

FreeBSDでIOタスクをチェック/インターセプトする方法があるかどうか疑問に思います。 ktraceに似ていますが、プロセスがわからない場合(例:少し時間がかかります)。

答え1

モニタリングとパフォーマンスの分析には、次のような非常に強力なセミプログラマブルツールがあります。

dtraceを使用すると、必要なシステムコールを追跡できるコマンドラインまたはアプレットプログラムを作成できます。

やや強力で複雑です。非常に興味深い本を含むいくつかの例を見つけることができます。システムパフォーマンス:エンタープライズとクラウド

~からDTraceツールページ:

動的トレースの実装であるDTraceは、さまざまなオペレーティングシステム(Solaris、Mac OS X、FreeBSD ...)で利用できます。 DTraceは、以前は困難またはアクセスできなかったレベルでアプリケーションとシステム内部の新しい詳細ビューを提供し、サーバーの問題を解決するのに役立ちます。 DTrace スクリプトを作成するための C および awk に似たイベントベースの言語を提供します。

# Files opened by process:
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

# Read bytes by process:
dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }'

# Write bytes by process:
dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }'

# Read size distribution by process:
dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }'

# Write size distribution by process:
dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }'

答え2

他の回答で述べたように、システムアクティビティを追跡するための強力なツールであるDTraceをこのタスクに使用することもできます。

一部のDtraceスクリプトは移植可能ですが、多くのスクリプトはオペレーティングシステムによって異なります。多くの便利なスクリプトは次のように使用できます。追跡ツールキットしかし、rwsnootとopensnoopはまだFreeBSDでは動作しません。

パブリックシステムコールを監視するには、次のスクリプトを使用できます。

#!/usr/sbin/dtrace -s

dtrace:::BEGIN
{
    printf("%5s %5s %s","UID","PID", "Command  Path");
}

syscall::open*:entry
{
    printf("%5d %5d %s %s", uid, pid, execname,
                    probefunc == "open" ? copyinstr(arg0) : copyinstr(arg1));
}

シンプルだがあまり役に立たない読み書きスクリプト

#!/usr/sbin/dtrace -s

syscall::*read:entry,
syscall::*write:entry
{
    printf("%5d %s CALL %s(%d, .., %d)", pid, execname, probefunc, arg0, arg2);
    self->fd = arg0;
}

syscall::*readv:entry,
syscall::*writev:entry
{
     printf("%5d %s CALL %s(%d, ...)", pid, execname, probefunc, arg0);
}

syscall::*read*:return
{
    printf("%5d %s fd %d read %d bytes", pid, execname, self->fd, arg0);
    self->fd = 0;
}

syscall::*write*:return
{
    printf("%5d %s fd %d wrote %d bytes", pid, execname, self->fd, arg0);
    self->fd = 0;
}

フィルタが必要な場合があります。たとえば、dtrace自体を追跡しないでください。

syscall::foobar:entry
/execname != "dtrace"/
{
    ...
}

答え3

個人的に私はtop -m io

関連情報