プログラミングユーティリティ

カーネルのトレース制御 (prex)

-k フラグを付けてカーネルに対して、prex を起動します (必ず root として実行してください)。prex が正常にカーネルに接続されると、prex のコマンドプロンプトが表示されます。

# prex -k
prex>

注 -

カーネルには、一度に 1 つの prex セッションしか接続できません。


バッファーの割り当て

カーネルのトレースを行うための最初の手順は、カーネルトレースバッファーの割り当てです。トレースバッファーが一杯になると、古いデータの上に新しいデータが書き込まれます。

バッファーのデフォルトサイズは 384 KB ですが、バッファーを割り当てるときにこのサイズを変更することができます。このバッファーは物理メモリーとカーネルの仮想メモリーの両方を使用するため、バッファーサイズを決める際には、トレース対象のシステムにその影響が及ぶことを考慮してください。RAM の容量が大きいほど、トレース対象の処理に対する影響は少なくなり、より大きな容量のバッファーを割り当てることができます。

prexbuffer コマンドを使用して、バッファーを割り当てます。たとえば、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>

次に、必要なプローブをトレースして、そのプローブを有効にします。たとえば、threadvmio を指定するキーを持ったプローブをすべて選択して、そのプローブをトレースできるようにするには、以下のコマンドを実行します。

prex> trace thread vm io     #トレース関数をプローブに接続します。  
prex> enable thread vm io    #プローブを有効にします。
prex> 

注 -

ユーザーレベルのプローブとは違って、カーネルのプローブは、prex をカーネルに接続しても自動的にはトレースされません。上記のように、明示的に trace コマンドと enable コマンドを実行する必要があります。


これで、関連するプローブはトレースできる状態になりますが、カーネルのトレースは広域的には許可されていないので、トレース記録は書き込まれません。

プロセスのフィルタリング

システムの動作をすべてトレースする場合 (たとえば、ビジーサーバー上など) には、「トレースの有効と無効」に進んでください。これは、カーネルトレースの最も一般的な使い方であり、また、通常は最も有用な使い方です。

ただし、選択したプロセスに関するトレースデータの生成を制限するオプションも用意されています。このオプションを使用すると、収集して分析しなければならないデータの量を減らすことができます。

prex では、2 つの抽出条件によって、プロセスのフィルタリングを実現しています。

プロセスのフィルタリングを制御するには、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  
#