-k フラグを付けてカーネルに対して、prex を起動します (必ず root として実行してください)。prex が正常にカーネルに接続されると、prex のコマンドプロンプトが表示されます。
# prex -k prex>
カーネルには、一度に 1 つの prex セッションしか接続できません。
カーネルのトレースを行うための最初の手順は、カーネルトレースバッファーの割り当てです。トレースバッファーが一杯になると、古いデータの上に新しいデータが書き込まれます。
バッファーのデフォルトサイズは 384 KB ですが、バッファーを割り当てるときにこのサイズを変更することができます。このバッファーは物理メモリーとカーネルの仮想メモリーの両方を使用するため、バッファーサイズを決める際には、トレース対象のシステムにその影響が及ぶことを考慮してください。RAM の容量が大きいほど、トレース対象の処理に対する影響は少なくなり、より大きな容量のバッファーを割り当てることができます。
prex で buffer コマンドを使用して、バッファーを割り当てます。たとえば、512 KB のバッファーを割り当てる場合は、以下のように行います。
prex> buffer #バッファーが割り当てられているか? No trace buffer allocated prex> buffer alloc 512k# 512 KB のバッファーを割り当てる Buffer of size 524288 bytes allocated prex>
バッファーの最小サイズは 128 KB です。128 KB よりも小さいバッファーを割り当てようとした場合には、prex によって 128 KB のバッファーが割り当てられます。
カーネルのプローブとその属性は、prex の標準リストコマンドを使用して一覧表示します。たとえば、pagein という名前のプローブの name 属性と keys 属性を表示するには、以下のコマンドを実行します。
prex> list name=pagein keys name=pagein keys=vm pageio io
io グループに含まれるすべてのプローブの name 属性と keys 属性を表示するには、以下のコマンドを実行します。
prex> list name keys probes io name=biodone keys=io blockio name=physio_start keys=io rawio name=pagein keys=vm pageio io name=pageout keys=vm pageio io name=physio_end keys=io rawio name=strategy keys=io blockio prex>
次に、必要なプローブをトレースして、そのプローブを有効にします。たとえば、thread、vm、io を指定するキーを持ったプローブをすべて選択して、そのプローブをトレースできるようにするには、以下のコマンドを実行します。
prex> trace thread vm io #トレース関数をプローブに接続します。 prex> enable thread vm io #プローブを有効にします。 prex>
ユーザーレベルのプローブとは違って、カーネルのプローブは、prex をカーネルに接続しても自動的にはトレースされません。上記のように、明示的に trace コマンドと enable コマンドを実行する必要があります。
これで、関連するプローブはトレースできる状態になりますが、カーネルのトレースは広域的には許可されていないので、トレース記録は書き込まれません。
システムの動作をすべてトレースする場合 (たとえば、ビジーサーバー上など) には、「トレースの有効と無効」に進んでください。これは、カーネルトレースの最も一般的な使い方であり、また、通常は最も有用な使い方です。
ただし、選択したプロセスに関するトレースデータの生成を制限するオプションも用意されています。このオプションを使用すると、収集して分析しなければならないデータの量を減らすことができます。
prex では、2 つの抽出条件によって、プロセスのフィルタリングを実現しています。
プロセスのフィルタセットは、トレースを有効にするプロセスのプロセス識別子 (PID) のリストです。このフィルタセットに含まれていないプロセス (に属するスレッド) は、トレースデータの書き込みを行いません。デフォルトのフィルタセットは空です。
プロセスのフィルタモードは、カーネルにおけるプロセスのフィルタリングの有効/無効を選択するための広域フラグです。デフォルトでは、プロセスのフィルタリングは無効にされています。つまり、すべてのプロセス (とスレッド) がトレース記録を書き込みます。フィルタリングを有効にすると、フィルタセット内のプロセス (に属するスレッド) だけがトレース記録を書き込みます。
プロセスのフィルタリングを制御するには、prex pfilter コマンドを使用します。
prex> pfilter # フィルタリングは行われているか? Process filtering is off Process filter set is empty. prex> pfilter add 408 # PID 408 をフィルタセットに追加 prex> pfilter Process filtering is off Process filter set is {408} prex> pfilter on # プロセスのフィルタリングを有効にする prex>
システムスレッド (割り込みスレッドなど) は、プロセス 0 に属するスレッドとして扱われます。
トレースを開始するために行う最後の手順は、広域的にカーネルのトレースを有効にすることです。この手順を実行すると、有効にしたプローブが検出されるたびに、そのプローブはカーネルトレースバッファーに記録を書き込みます。
prex> ktrace # トレースの状態を検査 Tracing is off prex> ktrace on # カーネルのトレースを有効にする prex>
アプリケーションのカーネル動作をトレース (同時に、ユーザーレベルのトレースも開始) するには、この時点でそのアプリケーションを起動します。アプリケーションが終了したとき、またはアプリケーションの動作をサンプリングできるだけの十分なトレースデータを得たときには、広域的にカーネルのトレースを無効にします。
prex> ktrace off # カーネルのトレースを無効にする prex>
トレースバッファーは、カーネル内にそのまま残っています。tnfxtract を使用して、そのトレースバッファーを TNF ファイルにコピーしてください。この操作の手順については、「カーネルトレースデータの抽出 (tnfxtract)」を参照してください。
トレースバッファーを TNF ファイルにコピーしたら、すべてのプローブを無効にして、バッファーの割り当てを解除することによって、カーネルのトレースをリセットします。リセットすることによって、カーネルのパフォーマンスはトレースを開始する前の状態に戻るため、この操作は重要です。
次のように標準の prex コマンドを使用して、すべてのプローブを無効にし、そのトレースも解除します。
prex> disable $all # すべてのプローブを無効にする prex> untrace $all # すべてのプローブのトレースを解除 prex>
最後に、prex buffer コマンドを使用して、トレースバッファーの割り当てを解除します。
トレースバッファーをトレースファイルにすべてコピーしてから、トレースバッファーの割り当てを解除してください。コピーを行う前にトレースバッファーの割り当てを解除すると、検証用に収集したトレースデータがすべて失われてしまいます。
prex> buffer dealloc # バッファーの割り当てを解除 buffer deallocated prex>
バッファーの割り当てを解除したら、prex を終了して、収集したトレースデータを検証できます。
prex> quit #