Spec-Zone.ru › MySQL 9.2

29.4.1 Временные метки событий Performance Schema

События собираются с помощью инструментов, добавленных в исходный код сервера. Инструменты измеряют время событий, что позволяет Performance Schema определить, сколько времени занимают события. Также можно настроить инструменты так, чтобы они не собирали информацию о времени. В этом разделе обсуждаются доступные таймеры и их характеристики, а также то, как значения времени представлены в событиях.

Таймеры Performance Schema

Таймеры Performance Schema различаются по точности и объёму накладных расходов. Чтобы увидеть доступные таймеры и их характеристики, см. таблицу performance_timers:

mysql> SELECT * FROM performance_schema.performance_timers;
+-------------+-----------------+------------------+----------------+
| TIMER_NAME  | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |
+-------------+-----------------+------------------+----------------+
| CYCLE       |      2389029850 |                1 |             72 |
| NANOSECOND  |      1000000000 |                1 |            112 |
| MICROSECOND |         1000000 |                1 |            136 |
| MILLISECOND |            1036 |                1 |            168 |
| THREAD_CPU  |       339101694 |                1 |            798 |
+-------------+-----------------+------------------+----------------+

Если значения, связанные с данным именем таймера, NULL, этот таймер не поддерживается на вашей платформе.

Столбцы имеют следующие значения:

  • Столбец TIMER_NAME показывает имена доступных таймеров. CYCLE относится к таймеру, основанному на счетчике циклов процессора.

  • TIMER_FREQUENCY указывает количество единиц таймера в секунду. Для таймера циклов частота обычно связана со скоростью процессора. Указанное значение было получено на системе с процессором 2,4 ГГц. Другие таймеры основаны на фиксированных долях секунды.

  • TIMER_RESOLUTION указывает количество единиц таймера, на которое значения таймера увеличиваются за раз. Если таймер имеет разрешение 10, его значение увеличивается на 10 каждый раз.

  • TIMER_OVERHEAD — минимальное количество циклов накладных расходов для получения одной временной метки с данным таймером. Накладные расходы на событие в два раза больше отображаемого значения, потому что таймер вызывается в начале и в конце события.

Performance Schema назначает таймеры следующим образом:

  • Таймер ожидания использует CYCLE.

  • Таймеры простоя, этапа, заявления и транзакции используют NANOSECOND на платформах, где доступен таймер NANOSECOND, и MICROSECOND в противном случае.

При запуске сервера Performance Schema проверяет, соответствуют ли предположения о назначении таймеров, сделанные на этапе компиляции, и выводит предупреждение, если таймер недоступен.

Для измерения событий ожидания важнейшим критерием является сокращение накладных расходов, возможно, в ущерб точности таймера, поэтому использование таймера CYCLE является наилучшим вариантом.

Время выполнения заявления (или этапа) обычно на несколько порядков больше времени выполнения одного события ожидания. Для измерения заявлений важнейшим критерием является точная оценка, которая не зависит от изменения частоты процессора, поэтому наилучшим вариантом является использование таймера, не основанного на циклах. По умолчанию для заявлений используется таймер NANOSECOND. Дополнительные “накладные расходы” по сравнению с таймером CYCLE несущественны, поскольку накладные расходы, вызванные вызовом таймера дважды (один раз при начале заявления, один раз при его завершении), на несколько порядков меньше по сравнению со временем процессора, затраченным на выполнение самого заявления. Использование таймера CYCLE здесь не принесёт пользы, только недостатки.

Точность, предоставляемая счетчиком циклов, зависит от скорости процессора. Если процессор работает на частоте 1 ГГц (один миллиард циклов/секунда) или выше, счетчик циклов обеспечивает точность ниже наносекунды. Использование счетчика циклов намного дешевле, чем получение фактического времени. Например, стандартная функция gettimeofday() может занимать сотни циклов, что является неприемлемыми накладными расходами для сбора данных, который может происходить тысячи или миллионы раз в секунду.

Счетчики циклов также имеют недостатки:

  • Конечные пользователи ожидают увидеть временные метки в единицах реального времени, таких как доли секунды. Преобразование из циклов в доли секунды может быть дорогостоящим. По этой причине преобразование представляет собой быструю и довольно грубую операцию умножения.

  • Частота циклов процессора может меняться, например, когда ноутбук переходит в режим экономии энергии или когда процессор замедляет работу для снижения тепловыделения. Если частота циклов процессора колеблется, преобразование из циклов в единицы реального времени подвержено ошибкам.

  • Счетчики циклов могут быть ненадежными или недоступными в зависимости от процессора или операционной системы. Например, на процессорах Pentium инструкция RDTSC (инструкция языка ассемблера, а не языка C) и теоретически операционная система может предотвратить использование её пользовательскими программами.

  • Некоторые детали процессора, связанные с выполнением операций вне очереди или с синхронизацией нескольких процессоров, могут привести к тому, что счетчик будет казаться быстрым или медленным на величину до 1000 циклов.

MySQL работает со счетчиками циклов на x386 (Windows, macOS, Linux, Solaris и другие Unix-подобные системы), PowerPC и IA-64.

Представление таймера Performance Schema в событиях

Строки в таблицах Performance Schema, хранящих текущие события и исторические события, имеют три столбца для представления информации о времени: TIMER_START и TIMER_END указывают, когда началось и закончилось событие, а TIMER_WAIT указывает продолжительность события.

Таблица setup_instruments имеет столбец ENABLED для указания инструментов, для которых необходимо собирать события. Таблица также имеет столбец TIMED для указания, какие инструменты отслеживаются. Если инструмент отключён, он не генерирует события. Если включенный инструмент не отслеживается, события, создаваемые инструментом, имеют NULL для значений таймера TIMER_START, TIMER_END и TIMER_WAIT. Это, в свою очередь, приводит к тому, что эти значения игнорируются при расчёте агрегированных значений времени в сводных таблицах (сумма, минимум, максимум и среднее).

Внутренне, время внутри событий хранится в единицах, заданных таймером, действующим в момент начала измерения события. Для отображения, когда события извлекаются из таблиц Performance Schema, время отображается в пикосекундах (триллионных долях секунды), чтобы нормализовать его к стандартной единице независимо от выбранного таймера.

Базовая линия таймера (“нулевое время”) возникает во время инициализации Performance Schema во время запуска сервера. Значения TIMER_START и TIMER_END в событиях представляют пикосекунды с момента базовой линии. Значение TIMER_WAIT — это продолжительность в пикосекундах.

Значения в пикосекундах в событиях являются приблизительными. Их точность зависит от стандартных ошибок, связанных с преобразованием из одной единицы в другую. Если используется таймер CYCLE и частота процессора изменяется, может произойти дрейф. По этим причинам неразумно рассматривать значение TIMER_START события как точное значение прошедшего времени с момента запуска сервера. С другой стороны, разумно использовать значения TIMER_START или TIMER_WAIT в предложениях ORDER BY для упорядочения событий по времени начала или продолжительности.

Выбор пикосекунд в событиях вместо значения, такого как микросекунды, имеет основания производительности. Одной из целей реализации было отображать результаты в единой единице времени независимо от таймера. В идеальном мире эта единица времени выглядела бы как единица реального времени и была бы достаточно точной; другими словами, микросекунды. Но для преобразования циклов или наносекунд в микросекунды было бы необходимо выполнить деление для каждого измерения. Деление дорогостоящее на многих платформах. Умножение не дорогостоящее, поэтому именно оно используется. Следовательно, единица времени является целым кратным максимальному возможному значению TIMER_FREQUENCY, используя множитель, достаточно большой для того, чтобы не было значительной потери точности. Результатом является то, что единица времени — “пикосекунды”. Эта точность является мнимой, но это решение позволяет свести накладные расходы к минимуму.

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

events_waits_current
events_stages_current
events_statements_current
events_transactions_current

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

  • TIMER_START заполняется.

  • TIMER_END заполняется текущим значением таймера.

  • TIMER_WAIT заполняется затраченным временем до сих пор (TIMER_END − TIMER_START).

У событий, которые ещё не завершены, значение END_EVENT_ID равно NULL. Для оценки прошедшего времени события используйте столбец TIMER_WAIT. Таким образом, для определения событий, которые ещё не завершены и длительность которых превышает N пикосекунд на данный момент, приложения мониторинга могут использовать это выражение в запросах:

WHERE END_EVENT_ID IS NULL AND TIMER_WAIT > N

Идентификация событий, как описано выше, предполагает, что соответствующие инструменты имеют ENABLED и TIMED, установленные в YES, и что соответствующие потребители включены.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/performance-schema-timing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API