mutex_instances
テーブルは、サーバーの実行中にパフォーマンススキーマによって確認されるすべての相互排他ロックを一覧表示します。 相互排他ロックは、特定の時間に 1 つだけのスレッドが特定の共通リソースにアクセスできるようにする、コードで使用される同期メカニズムです。 リソースは相互排他ロックによって「保護されている」と呼ばれます。
サーバーで実行されている 2 つのスレッド (たとえば、クエリーを同時に実行する 2 つのユーザーセッション) が同じリソース (ファイル、バッファまたは一部のデータ) にアクセスする必要がある場合、これらの 2 つのスレッドは互いに競合するため、mutex でロックを取得する最初のクエリーによって、最初のクエリーが完了するまで待機し、mutex のロックを解除します。
相互排他ロックの保持中に実行される作業は「クリティカルセクション」にあると呼ばれ、複数のクエリーがこのクリティカルセクションを連続して (一度に 1 つずつ) 実行するため、これは潜在的なボトルネックになります。
mutex_instances
テーブルにはこれらのカラムがあります。
-
NAME
相互排他ロックに関連付けられているインストゥルメント名。
-
OBJECT_INSTANCE_BEGIN
インストゥルメントされた相互排他ロックのメモリー内のアドレス。
-
LOCKED_BY_THREAD_ID
スレッドが現在相互排他ロックされている場合、
LOCKED_BY_THREAD_ID
はロックしているスレッドのTHREAD_ID
になり、そうでない場合、それはNULL
になります。
mutex_instances
テーブルには次のインデックスがあります:
主キー (
OBJECT_INSTANCE_BEGIN
)(
NAME
) のインデックス(
LOCKED_BY_THREAD_ID
) のインデックス
TRUNCATE TABLE
は、mutex_instances
テーブルに対して許可されていません。
コードにインストゥルメントされた各相互排他ロックについて、パフォーマンススキーマは次の情報を提供します。
setup_instruments
テーブルは、プリフィクスwait/synch/mutex/
を付けて、インストゥルメンテーションポイントの名前を一覧表示します。一部のコードで相互排他ロックが作成されると、行が
mutex_instances
テーブルに追加されます。OBJECT_INSTANCE_BEGIN
カラムは相互排他ロックを一意に識別するプロパティーです。スレッドが相互排他ロックのロックを試みた場合、
events_waits_current
テーブルにそのスレッドの行が表示され、それが相互排他ロックを待機していることが示され (EVENT_NAME
カラム内)、待機されている相互排他ロックが示されます (OBJECT_INSTANCE_BEGIN
カラム内)。-
スレッドが相互排他ロックのロックに成功した場合:
events_waits_current
は相互排他ロックへの待機が完了したことを示します (TIMER_END
およびTIMER_WAIT
カラム内)完了した待機イベントは
events_waits_history
およびevents_waits_history_long
テーブルに追加されます。mutex_instances
は相互排他ロックがスレッドによって所有されるようになったことを示します (THREAD_ID
カラム内)。
スレッドが相互排他ロックのロックを解除すると、
mutex_instances
は相互排他ロックに所有者がいなくなったことを示します (THREAD_ID
カラムがNULL
になります)。相互排他ロックオブジェクトが破棄されると、対応する行が
mutex_instances
から削除されます。
次の両方のテーブルに対してクエリーを実行することによって、モニタリングアプリケーションまたは DBA は相互排他ロックを伴うスレッド間のボトルネックやデッドロックを検出できます。
events_waits_current
、スレッドが待機している相互排他ロックを確認する場合mutex_instances
、相互排他ロックを現在所有しているほかのスレッドを確認する場合