マルチスレッドプログラムでは、別のスレッドで実行されるタスクの同期によって、プログラムの実行が遅延することがあります。たとえば、あるスレッドが、別のスレッドでロックされているデータへのアクセスを待機する必要が生じることがあります。 これらのイベントは同期遅延イベントと呼ばれ、Solaris または pthread のスレッド関数の呼び出しをトレースすることによって収集されます。 同期遅延イベントを収集して記録するプロセスを同期待ちトレースと言います。 また、ロック待ちに費やされる時間を待ち時間と言います。
ただし、イベントが記録されるのは、その待ち時間がしきい値 (ミリ秒単位) を超えた場合だけです。しきい値 0 は、待ち時間に関係なく、あらゆる同期遅延イベントをトレースすることを意味します。 デフォルトでは、同期遅延なしにスレッドライブラリを呼び出す測定試験を実施して、しきい値を決定します。こうして決定された場合、しきい値は、それらの呼び出しの平均時間に任意の係数 (現在は 6) を乗算して得られた値です。この方法によって、待ち時間の原因が本当の遅延ではなく、呼び出しそのものにあるイベントが記録されないようになります。この結果として、同期イベント数がかなり過小評価される可能性がありますが、データ量は大幅に少なくなります。
Java プログラムの場合、同期トレースは、プロファイルされるプログラムでの Java メソッド呼び出しを対象にしますが、JVM 内の内部同期呼び出しはトレースしません。
同期待ちトレースデータは、次の表に示すメトリックに変換されます。
|
この情報から、関数またはロードオブジェクトが頻繁にブロックされるかどうか、または同期ルーチンを呼び出したときの待ち時間が異常に長くなっているかどうかを調べることができます。同期待ち時間が大きいということは、スレッド間の競合が発生していることを示します。競合は、アルゴリズムの変更、具体的には、ロックする必要があるデータだけがスレッドごとにロックされるように、ロックを構成し直すことで減らすことができます。