Spec-Zone .ru
спецификации, руководства, описания, API
|
*row-{start,done}
зонды инициированы каждый раз, когда работа строки отталкивается к
механизму хранения. Например, если Вы выполняетесь INSERT
оператор с 100 строками данных, тогда insert-row-start
и insert-row-done
зонды будут инициированы 100 раз каждый, поскольку каждая строка
вставляет.
insert-row-start(database, table)insert-row-done(status)update-row-start(database, table)update-row-done(status)delete-row-start(database, table)delete-row-done(status)
insert-row-start
: Инициированный прежде, чем строка
вставляется в таблицу.
insert-row-done
: Инициированный после того, как строка
вставляется в таблицу.
update-row-start
: Инициированный прежде, чем строка
обновляется в таблице.
update-row-done
: Инициированный прежде, чем строка
обновляется в таблице.
delete-row-start
: Инициированный прежде, чем строка
удаляется из таблицы.
delete-row-done
: Инициированный прежде, чем строка
удаляется из таблицы.
Параметры, поддерживаемые зондами, являются непротиворечивыми для соответствия start
и done
зонды в каждом случае:
database
: Имя базы данных.
table
: Имя таблицы.
status
: Состояние; 0 для успеха или 1 для отказа.
Поскольку зонды на уровне строки инициированы для каждого отдельного доступа строки, эти зонды могут быть
инициированы много тысяч времен каждую секунду, у которых может быть неблагоприятное воздействие и на
контролирующий сценарий и на MySQL. Среда DTrace должна ограничить инициирование на этих зондах, чтобы
предотвратить оказываемую негативное влияние производительность. Или используйте зонды экономно, или используйте
счетчик или функции агрегации, чтобы сообщить относительно этих зондов и затем обеспечить сводку, когда сценарий
завершается или как часть a query-done
или query-exec-done
зонды.
Следующий сценарий в качестве примера суммирует продолжительность каждой работы строки в пределах большего запроса:
#!/usr/sbin/dtrace -s#pragma D option quietdtrace:::BEGIN{ printf("%-2s %-10s %-10s %9s %9s %-s \n", "St", "Who", "DB", "ConnID", "Dur ms", "Query");}mysql*:::query-start{ self->query = copyinstr(arg0); self->who = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4))); self->db = copyinstr(arg2); self->connid = arg1; self->querystart = timestamp; self->rowdur = 0;}mysql*:::query-done{ this->elapsed = (timestamp - self->querystart) /1000000; printf("%2d %-10s %-10s %9d %9d %s\n", arg0, self->who, self->db, self->connid, this->elapsed, self->query);}mysql*:::query-done/ self->rowdur /{ printf("%34s %9d %s\n", "", (self->rowdur/1000000), "-> Row ops");}mysql*:::insert-row-start{ self->rowstart = timestamp;}mysql*:::delete-row-start{ self->rowstart = timestamp;}mysql*:::update-row-start{ self->rowstart = timestamp;}mysql*:::insert-row-done{ self->rowdur += (timestamp-self->rowstart);}mysql*:::delete-row-done{ self->rowdur += (timestamp-self->rowstart);}mysql*:::update-row-done{ self->rowdur += (timestamp-self->rowstart);}
Выполняя вышеупомянутый сценарий с запросом, который вставляет данные в таблицу, можно контролировать, точное время потратило выполнение необработанной вставки строки:
St Who DB ConnID Dur ms Query 0 @localhost test 13 20767 insert into t1(select * from t2)4827 -> Row ops