Spec-Zone .ru
спецификации, руководства, описания, API
|
Зонды блокировки вызывают всякий раз, когда внешнюю блокировку требует MySQL на таблицу, используя соответствующий механизм блокировки на таблице как определено типом механизма таблицы. Есть три различных типов блокировки, блокировки чтения, пишут блокировку, и разблокировали операции. Используя зонды можно определить продолжительность внешней подпрограммы блокировки (то есть, время, потраченное механизмом хранения, чтобы реализовать блокировку, включая любое время, ожидая другой блокировки, чтобы стать свободными) и полная продолжительность блокировать/разблокировать процесса.
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 quietmysql*:::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.t2End: Lock->Read 0 msStart: Lock->Unlock test.t2 (25743 ms lock duration)End: Lock->Unlock 0 msStart: Lock->Read test.t2End: Lock->Read 0 msStart: Lock->Unlock test.t2 (1 ms lock duration)End: Lock->Unlock 0 msStart: Lock->Read test.t2End: Lock->Read 0 msStart: Lock->Unlock test.t2 (1 ms lock duration)End: Lock->Unlock 0 msStart: Lock->Read test.t2End: Lock->Read 0 ms