ロックプローブは、テーブルのエンジンタイプによって定義されるテーブル上の対応するロックメカニズムを使用する、テーブルについての外部ロックが MySQL によってリクエストされるたびに呼び出されます。ロックには、読み取りロック、書き込みロック、およびロック解除操作という 3 つの異なるタイプがあります。プローブを使用することで、外部ロックルーチンの期間 (つまり、別のロックが解放されるのを待機する時間も含む、ストレージエンジンがロックを実装するために要する時間) およびロックとロック解除プロセスの合計期間を調査することができます。
handler-rdlock-start(database, table)
handler-rdlock-done(status)
handler-wrlock-start(database, table)
handler-wrlock-done(status)
handler-unlock-start(database, table)
handler-unlock-done(status)
handler-rdlock-start
: 指定されたdatabase
およびtable
に読み取りロックがリクエストされたときにトリガーされます。handler-wrlock-start
: 指定されたdatabase
およびtable
に書き込みロックがリクエストされたときにトリガーされます。handler-unlock-start
: 指定されたdatabase
およびtable
にロック解除リクエストが実行されたときにトリガーされます。handler-rdlock-done
: 読み取りロックリクエストが完了したときにトリガーされます。status
は、ロック操作が正常な場合は 0 で、失敗した場合は>0
です。handler-wrlock-done
: 書き込みロックリクエストが完了したときにトリガーされます。status
は、ロック操作が正常な場合は 0 で、失敗した場合は>0
です。handler-unlock-done
: ロック解除リクエストが完了したときにトリガーされます。status
は、ロック解除操作に成功した場合は 0 で、失敗した場合は>0
です。
次のスクリプトを使用して、個々のテーブルのロックおよびロック解除をモニターするための配列を使用し、テーブルロック全体の期間を計算することができます。
#!/usr/sbin/dtrace -s
#pragma D option quiet
mysql*:::handler-rdlock-start
{
self->rdlockstart = timestamp;
this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
self->lockmap[this->lockref] = self->rdlockstart;
printf("Start: Lock->Read %s.%s\n",copyinstr(arg0),copyinstr(arg1));
}
mysql*:::handler-wrlock-start
{
self->wrlockstart = timestamp;
this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
self->lockmap[this->lockref] = self->rdlockstart;
printf("Start: Lock->Write %s.%s\n",copyinstr(arg0),copyinstr(arg1));
}
mysql*:::handler-unlock-start
{
self->unlockstart = timestamp;
this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
printf("Start: Lock->Unlock %s.%s (%d ms lock duration)\n",
copyinstr(arg0),copyinstr(arg1),
(timestamp - self->lockmap[this->lockref])/1000000);
}
mysql*:::handler-rdlock-done
{
printf("End: Lock->Read %d ms\n",
(timestamp - self->rdlockstart)/1000000);
}
mysql*:::handler-wrlock-done
{
printf("End: Lock->Write %d ms\n",
(timestamp - self->wrlockstart)/1000000);
}
mysql*:::handler-unlock-done
{
printf("End: Lock->Unlock %d ms\n",
(timestamp - self->unlockstart)/1000000);
}
これを実行すると、ロック処理自体の期間と、特定のテーブルのロックの期間の両方に関する情報が得られるはずです。
Start: Lock->Read test.t2
End: Lock->Read 0 ms
Start: Lock->Unlock test.t2 (25743 ms lock duration)
End: Lock->Unlock 0 ms
Start: Lock->Read test.t2
End: Lock->Read 0 ms
Start: Lock->Unlock test.t2 (1 ms lock duration)
End: Lock->Unlock 0 ms
Start: Lock->Read test.t2
End: Lock->Read 0 ms
Start: Lock->Unlock test.t2 (1 ms lock duration)
End: Lock->Unlock 0 ms
Start: Lock->Read test.t2
End: Lock->Read 0 ms