plockstat プロバイダが提供するプローブを使用すると、ユーザーレベルの同期プリミティブの動作 (ロック競合やロック保持時間など) を観察できます。plockstat(1M) コマンドは DTrace コンシューマの一種であり、plockstat プロバイダを利用して、ユーザーレベルのロックイベントに関するデータを収集します。
plockstat プロバイダは、次のようなイベントに対応したプローブを提供します。
これらのプローブは、ユーザーレベルの同期プリミティブの競合に関するプローブです。リソースが使えるようになるまで、スレッドが強制的に待機させられるときに起動します。通常、Solaris は、競合が起こっていない状態に合わせて最適化されています。長期にわたる競合状態は想定されていません。これらのプローブは、実際に競合が発生したとき、その状況を把握するために使用してください。競合は比較的まれにしか起こりません。このため、通常は、競合イベントプローブを有効にしたからといって、プローブの深刻な影響はありません。これらのプローブを有効にするとき、パフォーマンスへの影響を心配する必要はありません。
これらのプローブは、ユーザーレベルの同期プリミティブの獲得や解放などの操作に関連しています。これらのプローブは、ユーザーレベルの同期プリミティブの操作方法に関する問題に答えるために使用します。一般に、アプリケーションは、同期プリミティブの獲得と解放を非常に頻繁に行います。したがって、保持イベントプローブを有効にしたときのほうが、競合イベントプローブを有効にしたときよりも、プローブの及ぼす影響は大きくなります。プローブを有効にしたときの影響は甚大になりえますが、決して異常なものではありません。本稼働アプリケーションでプローブを有効にしても、まったく問題はありません。
これらのプローブは、ユーザーレベルの同期プリミティブの獲得または解放時に起こる異常な動作に関連したプローブです。これらのイベントを利用して、ユーザーレベルの同期プリミティブでスレッドがブロックしているときに発生したエラーを検出できます。エラーイベントは非常にまれにしか発生しないので、エラーイベントプローブを有効にしても、プローブの深刻な影響はありません。
「相互排他ロック」は、クリティカルセクションの相互排他を行います。あるスレッドから、mutex_lock(3C) や pthread_mutex_lock(3C)を使って、別のスレッドが保持している相互排他ロックを獲得できます。このとき、ロックを獲得しようとしているスレッドは、ロックを所有しているスレッドが別の CPU 上で実行されているかどうかを確認します。ロックの所有スレッドが別の CPU 上で実行されている場合、ロックを獲得しようとしているスレッドは、相互排他ロックが使用可能な状態になるまでしばらく「スピン」して待機します。所有スレッドが別の CPU 上で実行されていない場合、ロックを獲得しようとしているスレッドは「ブロック」されます。
表 31–1 に、相互排他ロック関連の 4 種類の plockstat プローブを示します。それぞれの arg0 には、相互排他ロックを表す mutex_t または pthread_mutex_t 構造体 (型はすべて同じ) のポインタが入ります。
表 31–1 相互排他ロックプローブ
mutex-acquire |
相互排他ロックの獲得後すぐに起動する保持イベントプローブ。arg1 には、獲得したロックが再帰型相互排他ロックで再帰的に機能するかどうかを示すブール値が入ります。arg2 には、ロックを獲得しようとしているスレッドがこの相互排他ロック上でスピンする回数が入ります。この相互排他ロックの獲得時に mutex-spin プローブが起動している場合にのみ、arg2 にはゼロ以外の値が入ります。 |
mutex-block |
保持されている相互排他ロックでスレッドがブロックされる前に起動する競合イベントプローブ。1 回のロック獲得で mutex-block と mutex-spin の両者が起動することもあります。 |
mutex-spin |
保持されている相互排他ロックでスレッドがスピンを開始する前に起動する競合イベントプローブ。1 回のロック獲得で mutex-block と mutex-spin の両者が起動することもあります。 |
mutex-release |
相互排他ロックの解放後すぐに起動する保持イベントプローブ。arg1 には、このイベントが再帰型相互排他ロックでの再帰的な解放に当たるかどうかを示すブール値が入ります。 |
mutex-error |
相互排他処理でエラーが発生したときに起動するエラーイベントプローブ。arg1 には、発生したエラーの errno 値が入ります。 |
「読み取り/書き込みロック」では、同一クリティカルセクション内で同時に複数の読み取り、または 1 回の書き込みを行うことができます。両方を同時に行うことはできません。通常、これらのロックを使用するのは、変更されるより検索される機会のほうが多い構造体や、クリティカルセクションに長時間を費やすスレッドです。読み取り/書き込みロックの操作は、Solaris の rwlock(3C) または POSIX の pthread_rwlock_init(3C) インタフェースを介して行います。
読み取り/書き込みロック関連のプローブは、表 31–2 のとおりです。それぞれの arg0 には、rwlock_t 構造体または pthread_rwlock_t 構造体 (型はすべて同じ) のポインタが入ります。これは適応型ロックを表します。arg1 には、行われた操作が書き込みであるかどうかを示すブール値が入ります。
表 31–2 読み取り/書き込みロックプローブ
rw-acquire |
読み取り/書き込みロックの獲得後すぐに起動する保持イベントプローブ。 |
rw-block |
ロックの獲得中、スレッドがブロックする前に起動する競合イベントプローブ。有効にすると、rw-acquire プローブまたは rw-error プローブが rw-block に続いて起動します。 |
rw-release |
読み取り/書き込みロックの解放後すぐに起動する保持イベントプローブ。 |
rw-error |
読み取り/書き込みロック処理でエラーが発生したときに起動するエラーイベントプローブ。arg1 には、発生したエラーの errno 値が入ります。 |
以下の表に、plockstat プロバイダの安定性を DTrace の安定性機構に従って示します。安定性機構の詳細については、第 39 章安定性を参照してください。
要素 |
名前の安定性 |
データの安定性 |
依存クラス |
---|---|---|---|
プロバイダ |
発展中 |
発展中 |
ISA |
モジュール |
非公開 |
非公開 |
不明 |
機能 |
非公開 |
非公開 |
不明 |
名前 |
発展中 |
発展中 |
ISA |
引数 |
発展中 |
発展中 |
ISA |