Spec-Zone .ru
спецификации, руководства, описания, API

5.7.1.10. Зонды блокировки

Зонды блокировки вызывают всякий раз, когда внешнюю блокировку требует 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)

Можно использовать массивы, чтобы контролировать блокировку и разблокирование отдельных таблиц и затем вычислить продолжительность всей блокировки таблицы, используя следующий сценарий:

#!/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