Spec-Zone.ru › MySQL 5.7

14.17.2 Мониторинг ожиданий мьютексов InnoDB с помощью Performance Schema

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

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

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

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

    mysql> SELECT *
           FROM performance_schema.setup_instruments
           WHERE 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/buf_pool_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_sys_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/recalc_pool_mutex             | NO      | NO    |
    | wait/synch/mutex/innodb/file_format_max_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/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    |
    +-------------------------------------------------------+---------+-------+
    49 rows in set (0.02 sec)
    
  2. Некоторые экземпляры мьютексов InnoDB создаются при запуске сервера и отслеживаются только в том случае, если связанный инструмент также включен при запуске сервера. Чтобы убедиться, что все экземпляры мьютексов InnoDB отслеживаются и включены, добавьте следующую performance-schema-instrument инструкцию в файл конфигурации MySQL:

    performance-schema-instrument='wait/synch/mutex/innodb/%=ON'
    

    Если вам не требуются данные об ожидании событий для всех мьютексов InnoDB, вы можете отключить определенные инструменты, добавив дополнительные performance-schema-instrument правила в файл конфигурации MySQL. Например, чтобы отключить инструменты отслеживания событий ожидания мьютексов InnoDB, связанных с полнотекстовым поиском, добавьте следующее правило:

    performance-schema-instrument='wait/synch/mutex/innodb/fts%=OFF'
    
    Примечание

    Правила с более длинным префиксом, например wait/synch/mutex/innodb/fts%, имеют приоритет над правилами с более короткими префиксами, например wait/synch/mutex/innodb/%.

    После добавления performance-schema-instrument правил в файл конфигурации перезапустите сервер. Все мьютексы InnoDB, за исключением тех, которые связаны с полнотекстовым поиском, будут включены. Чтобы проверить, запросите таблицу setup_instruments. Столбцы ENABLED и TIMED должны быть установлены в YES для инструментов, которые вы включили.

    mysql> SELECT *
           FROM performance_schema.setup_instruments
           WHERE 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/zip_pad_mutex                 | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    49 rows in set (0.00 sec)
    
  3. Включите потребителей событий ожидания, обновив таблицу setup_consumers. Потребители событий ожидания по умолчанию отключены.

    mysql> UPDATE performance_schema.setup_consumers
           SET 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)
    
  4. После включения инструментов и потребителей запустите рабочую нагрузку, которую хотите отслеживать. В этом примере используется клиент эмуляции нагрузки mysqlslap для имитации рабочей нагрузки.

    $> ./mysqlslap --auto-generate-sql --concurrency=100 --iterations=10
           --number-of-queries=1000 --number-char-cols=6 --number-int-cols=6;
    
  5. Запросите данные о событиях ожидания. В этом примере данные о событиях ожидания запрашиваются из таблицы 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_MS
           FROM performance_schema.events_waits_summary_global_by_event_name
           WHERE 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/os_mutex                 |      78831 |           10.3283 |
    | wait/synch/mutex/innodb/log_sys_mutex            |      41488 |         6510.3233 |
    | wait/synch/mutex/innodb/trx_sys_mutex            |      29770 |         1107.9687 |
    | wait/synch/mutex/innodb/lock_mutex               |      24212 |          104.0724 |
    | wait/synch/mutex/innodb/trx_mutex                |      22756 |            1.9421 |
    | wait/synch/mutex/innodb/rseg_mutex               |      20333 |            3.6220 |
    | wait/synch/mutex/innodb/dict_sys_mutex           |      13422 |            2.2284 |
    | wait/synch/mutex/innodb/mutex_list_mutex         |      12694 |          344.1164 |
    | wait/synch/mutex/innodb/fil_system_mutex         |       9208 |            0.9542 |
    | wait/synch/mutex/innodb/rw_lock_list_mutex       |       8304 |            0.1794 |
    | wait/synch/mutex/innodb/trx_undo_mutex           |       6190 |            0.6801 |
    | wait/synch/mutex/innodb/buf_pool_mutex           |       2869 |           29.4623 |
    | wait/synch/mutex/innodb/innobase_share_mutex     |       2005 |            0.1349 |
    | wait/synch/mutex/innodb/flush_list_mutex         |       1274 |            0.1300 |
    | wait/synch/mutex/innodb/file_format_max_mutex    |       1016 |            0.0469 |
    | wait/synch/mutex/innodb/purge_sys_bh_mutex       |       1004 |            0.0326 |
    | wait/synch/mutex/innodb/buf_dblwr_mutex          |        640 |            0.0437 |
    | wait/synch/mutex/innodb/log_flush_order_mutex    |        437 |            0.0510 |
    | wait/synch/mutex/innodb/recv_sys_mutex           |        394 |            0.0202 |
    | wait/synch/mutex/innodb/srv_sys_mutex            |        169 |            0.5259 |
    | wait/synch/mutex/innodb/lock_wait_mutex          |        154 |            0.1172 |
    | wait/synch/mutex/innodb/ibuf_mutex               |          9 |            0.0027 |
    | wait/synch/mutex/innodb/srv_innodb_monitor_mutex |          2 |            0.0009 |
    | wait/synch/mutex/innodb/ut_list_mutex            |          1 |            0.0001 |
    | wait/synch/mutex/innodb/recv_writer_mutex        |          1 |            0.0005 |
    +--------------------------------------------------+------------+-------------------+
    25 rows in set (0.01 sec)
    
    Примечание

    Предыдущий результат включает данные о событиях ожидания, которые возникли во время процесса запуска. Чтобы исключить эти данные, вы можете обнулить таблицу 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/monitor-innodb-mutex-waits-performance-schema.html

Spec-Zone.ru

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