17.16.2 Мониторинг ожиданий мьютексов InnoDB с помощью Performance Schema
Мьютекс — это механизм синхронизации, используемый в коде для обеспечения того, что только один поток в данный момент может получить доступ к общему ресурсу. Когда два или более потоков, выполняющихся в сервере, нуждаются в доступе к одному и тому же ресурсу, потоки конкурируют друг с другом. Первый поток, получивший блокировку мьютекса, заставляет другие потоки ожидать, пока блокировка не будет освобождена.
Для мьютексов, для которых включена инструментация, ожидания мьютексов можно отслеживать с помощью Performance Schema. Данные о событиях ожидания, собранные в таблицах Performance Schema, могут помочь в идентификации мьютексов с наибольшим количеством ожиданий или наибольшим общим временем ожидания, например.
Следующий пример демонстрирует, как включить инструменты ожидания мьютексов, как включить связанные потребители и как запросить данные событий ожидания.
-
Чтобы просмотреть доступные инструменты ожидания мьютексов, выполните запрос к таблице Performance Schema
setup_instruments. Все инструменты ожидания мьютексов по умолчанию отключены.mysql>
SELECT *FROM performance_schema.setup_instrumentsWHERE NAME LIKE '%wait/synch/mutex/innodb%';+---------------------------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +---------------------------------------------------------+---------+-------+ | wait/synch/mutex/innodb/commit_cond_mutex | NO | NO | | wait/synch/mutex/innodb/innobase_share_mutex | NO | NO | | wait/synch/mutex/innodb/autoinc_mutex | NO | NO | | wait/synch/mutex/innodb/autoinc_persisted_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_flush_state_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_LRU_list_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_free_list_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_zip_free_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_zip_hash_mutex | NO | NO | | wait/synch/mutex/innodb/buf_pool_zip_mutex | NO | NO | | wait/synch/mutex/innodb/cache_last_read_mutex | NO | NO | | wait/synch/mutex/innodb/dict_foreign_err_mutex | NO | NO | | wait/synch/mutex/innodb/dict_persist_dirty_tables_mutex | NO | NO | | wait/synch/mutex/innodb/dict_sys_mutex | NO | NO | | wait/synch/mutex/innodb/recalc_pool_mutex | NO | NO | | wait/synch/mutex/innodb/fil_system_mutex | NO | NO | | wait/synch/mutex/innodb/flush_list_mutex | NO | NO | | wait/synch/mutex/innodb/fts_bg_threads_mutex | NO | NO | | wait/synch/mutex/innodb/fts_delete_mutex | NO | NO | | wait/synch/mutex/innodb/fts_optimize_mutex | NO | NO | | wait/synch/mutex/innodb/fts_doc_id_mutex | NO | NO | | wait/synch/mutex/innodb/log_flush_order_mutex | NO | NO | | wait/synch/mutex/innodb/hash_table_mutex | NO | NO | | wait/synch/mutex/innodb/ibuf_bitmap_mutex | NO | NO | | wait/synch/mutex/innodb/ibuf_mutex | NO | NO | | wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | NO | NO | | wait/synch/mutex/innodb/log_sys_mutex | NO | NO | | wait/synch/mutex/innodb/log_sys_write_mutex | NO | NO | | wait/synch/mutex/innodb/mutex_list_mutex | NO | NO | | wait/synch/mutex/innodb/page_zip_stat_per_index_mutex | NO | NO | | wait/synch/mutex/innodb/purge_sys_pq_mutex | NO | NO | | wait/synch/mutex/innodb/recv_sys_mutex | NO | NO | | wait/synch/mutex/innodb/recv_writer_mutex | NO | NO | | wait/synch/mutex/innodb/redo_rseg_mutex | NO | NO | | wait/synch/mutex/innodb/noredo_rseg_mutex | NO | NO | | wait/synch/mutex/innodb/rw_lock_list_mutex | NO | NO | | wait/synch/mutex/innodb/rw_lock_mutex | NO | NO | | wait/synch/mutex/innodb/srv_dict_tmpfile_mutex | NO | NO | | wait/synch/mutex/innodb/srv_innodb_monitor_mutex | NO | NO | | wait/synch/mutex/innodb/srv_misc_tmpfile_mutex | NO | NO | | wait/synch/mutex/innodb/srv_monitor_file_mutex | NO | NO | | wait/synch/mutex/innodb/buf_dblwr_mutex | NO | NO | | wait/synch/mutex/innodb/trx_undo_mutex | NO | NO | | wait/synch/mutex/innodb/trx_pool_mutex | NO | NO | | wait/synch/mutex/innodb/trx_pool_manager_mutex | NO | NO | | wait/synch/mutex/innodb/srv_sys_mutex | NO | NO | | wait/synch/mutex/innodb/lock_mutex | NO | NO | | wait/synch/mutex/innodb/lock_wait_mutex | NO | NO | | wait/synch/mutex/innodb/trx_mutex | NO | NO | | wait/synch/mutex/innodb/srv_threads_mutex | NO | NO | | wait/synch/mutex/innodb/rtr_active_mutex | NO | NO | | wait/synch/mutex/innodb/rtr_match_mutex | NO | NO | | wait/synch/mutex/innodb/rtr_path_mutex | NO | NO | | wait/synch/mutex/innodb/rtr_ssn_mutex | NO | NO | | wait/synch/mutex/innodb/trx_sys_mutex | NO | NO | | wait/synch/mutex/innodb/zip_pad_mutex | NO | NO | | wait/synch/mutex/innodb/master_key_id_mutex | NO | NO | +---------------------------------------------------------+---------+-------+ -
Некоторые экземпляры мьютексов создаются при запуске сервера и будут инструментаризованы только в том случае, если соответствующий инструмент также включен при запуске сервера. Чтобы убедиться, что все экземпляры мьютексов будут инструментаризованы и включены, добавьте следующее правило
performance-schema-instrumentв ваш файл конфигурации MySQL:performance-schema-instrument='wait/synch/mutex/innodb/%=ON'
Если вам не нужны данные о событиях ожидания для всех мьютексов, вы можете отключить определенные инструменты, добавив дополнительные правила
performance-schema-instrumentв ваш файл конфигурации MySQL. Например, чтобы отключить инструменты событий ожидания мьютексов, связанных с полнотекстовым поиском, добавьте следующее правило:performance-schema-instrument='wait/synch/mutex/innodb/fts%=OFF'
ПримечаниеПравила с более длинным префиксом, например
wait/synch/mutex/innodb/fts%, имеют приоритет над правилами с более коротким префиксом, напримерwait/synch/mutex/innodb/%.После добавления правил
performance-schema-instrumentв ваш файл конфигурации перезапустите сервер. Все мьютексы, кроме тех, которые связаны с полнотекстовым поиском, будут включены. Чтобы проверить, выполните запрос к таблицеsetup_instruments. СтолбцыENABLEDиTIMEDдолжны быть установлены в значениеYESдля инструментов, которые вы включили.mysql>
SELECT *FROM performance_schema.setup_instrumentsWHERE NAME LIKE '%wait/synch/mutex/innodb%';+-------------------------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +-------------------------------------------------------+---------+-------+ | wait/synch/mutex/innodb/commit_cond_mutex | YES | YES | | wait/synch/mutex/innodb/innobase_share_mutex | YES | YES | | wait/synch/mutex/innodb/autoinc_mutex | YES | YES | ... | wait/synch/mutex/innodb/master_key_id_mutex | YES | YES | +-------------------------------------------------------+---------+-------+ 49 rows in set (0.00 sec) -
Включите потребители событий ожидания, обновив таблицу
setup_consumers. Потребители событий ожидания по умолчанию отключены.mysql>
UPDATE performance_schema.setup_consumersSET enabled = 'YES'WHERE name like 'events_waits%';Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0Вы можете проверить, что потребители событий ожидания включены, выполнив запрос к таблице
setup_consumers. Потребителиevents_waits_current,events_waits_historyиevents_waits_history_longдолжны быть включены.mysql>
SELECT * FROM performance_schema.setup_consumers;+----------------------------------+---------+ | NAME | ENABLED | +----------------------------------+---------+ | events_stages_current | NO | | events_stages_history | NO | | events_stages_history_long | NO | | events_statements_current | YES | | events_statements_history | YES | | events_statements_history_long | NO | | events_transactions_current | YES | | events_transactions_history | YES | | events_transactions_history_long | NO | | events_waits_current | YES | | events_waits_history | YES | | events_waits_history_long | YES | | global_instrumentation | YES | | thread_instrumentation | YES | | statements_digest | YES | +----------------------------------+---------+ 15 rows in set (0.00 sec) -
После включения инструментов и потребителей выполните рабочую нагрузку, которую хотите отслеживать. В этом примере используется клиент эмуляции нагрузки mysqlslap для моделирования рабочей нагрузки.
$>
./mysqlslap --auto-generate-sql --concurrency=100 --iterations=10--number-of-queries=1000 --number-char-cols=6 --number-int-cols=6; -
Выполните запрос к данным о событиях ожидания. В этом примере данные о событиях ожидания запрашиваются из таблицы
events_waits_summary_global_by_event_name, которая агрегирует данные, найденные в таблицахevents_waits_current,events_waits_historyиevents_waits_history_long. Данные обобщаются по имени события (EVENT_NAME), которое является именем инструмента, который сгенерировал событие. Обобщенные данные включают:-
COUNT_STARКоличество обобщенных событий ожидания.
-
SUM_TIMER_WAITОбщее время ожидания обобщенных событий ожидания с таймером.
-
MIN_TIMER_WAITМинимальное время ожидания обобщенных событий ожидания с таймером.
-
AVG_TIMER_WAITСреднее время ожидания обобщенных событий ожидания с таймером.
-
MAX_TIMER_WAITМаксимальное время ожидания обобщенных событий ожидания с таймером.
Следующий запрос возвращает имя инструмента (
EVENT_NAME), количество событий ожидания (COUNT_STAR) и общее время ожидания событий для этого инструмента (SUM_TIMER_WAIT). Поскольку ожидания по умолчанию отслеживаются в пикосекундах (триллионных долях секунды), время ожидания делится на 1000000000, чтобы показать время ожидания в миллисекундах. Данные представлены в порядке убывания по количеству обобщенных событий ожидания (COUNT_STAR). Вы можете изменить предложениеORDER BY, чтобы упорядочить данные по общему времени ожидания.mysql>
SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000 SUM_TIMER_WAIT_MSFROM performance_schema.events_waits_summary_global_by_event_nameWHERE SUM_TIMER_WAIT > 0 AND EVENT_NAME LIKE 'wait/synch/mutex/innodb/%'ORDER BY COUNT_STAR DESC;+---------------------------------------------------------+------------+-------------------+ | EVENT_NAME | COUNT_STAR | SUM_TIMER_WAIT_MS | +---------------------------------------------------------+------------+-------------------+ | wait/synch/mutex/innodb/trx_mutex | 201111 | 23.4719 | | wait/synch/mutex/innodb/fil_system_mutex | 62244 | 9.6426 | | wait/synch/mutex/innodb/redo_rseg_mutex | 48238 | 3.1135 | | wait/synch/mutex/innodb/log_sys_mutex | 46113 | 2.0434 | | wait/synch/mutex/innodb/trx_sys_mutex | 35134 | 1068.1588 | | wait/synch/mutex/innodb/lock_mutex | 34872 | 1039.2589 | | wait/synch/mutex/innodb/log_sys_write_mutex | 17805 | 1526.0490 | | wait/synch/mutex/innodb/dict_sys_mutex | 14912 | 1606.7348 | | wait/synch/mutex/innodb/trx_undo_mutex | 10634 | 1.1424 | | wait/synch/mutex/innodb/rw_lock_list_mutex | 8538 | 0.1960 | | wait/synch/mutex/innodb/buf_pool_free_list_mutex | 5961 | 0.6473 | | wait/synch/mutex/innodb/trx_pool_mutex | 4885 | 8821.7496 | | wait/synch/mutex/innodb/buf_pool_LRU_list_mutex | 4364 | 0.2077 | | wait/synch/mutex/innodb/innobase_share_mutex | 3212 | 0.2650 | | wait/synch/mutex/innodb/flush_list_mutex | 3178 | 0.2349 | | wait/synch/mutex/innodb/trx_pool_manager_mutex | 2495 | 0.1310 | | wait/synch/mutex/innodb/buf_pool_flush_state_mutex | 1318 | 0.2161 | | wait/synch/mutex/innodb/log_flush_order_mutex | 1250 | 0.0893 | | wait/synch/mutex/innodb/buf_dblwr_mutex | 951 | 0.0918 | | wait/synch/mutex/innodb/recalc_pool_mutex | 670 | 0.0942 | | wait/synch/mutex/innodb/dict_persist_dirty_tables_mutex | 345 | 0.0414 | | wait/synch/mutex/innodb/lock_wait_mutex | 303 | 0.1565 | | wait/synch/mutex/innodb/autoinc_mutex | 196 | 0.0213 | | wait/synch/mutex/innodb/autoinc_persisted_mutex | 196 | 0.0175 | | wait/synch/mutex/innodb/purge_sys_pq_mutex | 117 | 0.0308 | | wait/synch/mutex/innodb/srv_sys_mutex | 94 | 0.0077 | | wait/synch/mutex/innodb/ibuf_mutex | 22 | 0.0086 | | wait/synch/mutex/innodb/recv_sys_mutex | 12 | 0.0008 | | wait/synch/mutex/innodb/srv_innodb_monitor_mutex | 4 | 0.0009 | | wait/synch/mutex/innodb/recv_writer_mutex | 1 | 0.0005 | +---------------------------------------------------------+------------+-------------------+ПримечаниеПредставленный результат включает данные о событиях ожидания, сгенерированных во время процесса запуска. Чтобы исключить эти данные, вы можете обнулить таблицу
events_waits_summary_global_by_event_nameсразу после запуска и перед запуском рабочей нагрузки. Однако сама операция обнуления может генерировать незначительное количество данных о событиях ожидания.mysql>
TRUNCATE performance_schema.events_waits_summary_global_by_event_name; -
© 2025 Oracle
Licensed under the GPLv2 License.