Loading...
MySQL 9.5 Reference Manual 9.5의 17.16.2 Monitoring InnoDB Mutex Waits Using Performance Schema의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
mutex는 코드에서 동기화 메커니즘으로 사용되며, 특정 시점에 하나의 thread만 공통 자원에 접근할 수 있도록 강제합니다. server에서 실행 중인 두 개 이상의 thread가 동일한 자원에 접근해야 할 때, 이들 thread는 서로 경쟁합니다. mutex에 lock을 먼저 획득한 thread는 다른 thread들이 lock이 해제될 때까지 기다리게 합니다.
instrumentation이 적용된 InnoDB mutex에 대해서는
Performance Schema를 사용하여 mutex wait을 모니터링할 수 있습니다. Performance Schema table에 수집된 wait event data는 예를 들어, 가장 많은 wait이 발생한 mutex나 총 wait 시간이 가장 긴 mutex를 식별하는 데 도움이 됩니다.
다음 예제에서는 InnoDB mutex wait instrument를 활성화하는 방법, 관련 consumer를 활성화하는 방법, 그리고 wait event data를 조회하는 방법을 보여줍니다.
InnoDB mutex wait instrument를 확인하려면 Performance Schema의
setup_instruments table을 조회합니다. 모든
InnoDB mutex wait instrument는 기본적으로 비활성화되어 있습니다.1mysql> SELECT * 2 FROM performance_schema.setup_instruments 3 WHERE NAME LIKE '%wait/synch/mutex/innodb%'; 4+---------------------------------------------------------+---------+-------+ 5| NAME | ENABLED | TIMED | 6+---------------------------------------------------------+---------+-------+ 7| wait/synch/mutex/innodb/commit_cond_mutex | NO | NO | 8| wait/synch/mutex/innodb/innobase_share_mutex | NO | NO | 9| wait/synch/mutex/innodb/autoinc_mutex | NO | NO | 10| wait/synch/mutex/innodb/autoinc_persisted_mutex | NO | NO | 11| wait/synch/mutex/innodb/buf_pool_flush_state_mutex | NO | NO | 12| wait/synch/mutex/innodb/buf_pool_LRU_list_mutex | NO | NO | 13| wait/synch/mutex/innodb/buf_pool_free_list_mutex | NO | NO | 14| wait/synch/mutex/innodb/buf_pool_zip_free_mutex | NO | NO | 15| wait/synch/mutex/innodb/buf_pool_zip_hash_mutex | NO | NO | 16| wait/synch/mutex/innodb/buf_pool_zip_mutex | NO | NO | 17| wait/synch/mutex/innodb/cache_last_read_mutex | NO | NO | 18| wait/synch/mutex/innodb/dict_foreign_err_mutex | NO | NO | 19| wait/synch/mutex/innodb/dict_persist_dirty_tables_mutex | NO | NO | 20| wait/synch/mutex/innodb/dict_sys_mutex | NO | NO | 21| wait/synch/mutex/innodb/recalc_pool_mutex | NO | NO | 22| wait/synch/mutex/innodb/fil_system_mutex | NO | NO | 23| wait/synch/mutex/innodb/flush_list_mutex | NO | NO | 24| wait/synch/mutex/innodb/fts_bg_threads_mutex | NO | NO | 25| wait/synch/mutex/innodb/fts_delete_mutex | NO | NO | 26| wait/synch/mutex/innodb/fts_optimize_mutex | NO | NO | 27| wait/synch/mutex/innodb/fts_doc_id_mutex | NO | NO | 28| wait/synch/mutex/innodb/log_flush_order_mutex | NO | NO | 29| wait/synch/mutex/innodb/hash_table_mutex | NO | NO | 30| wait/synch/mutex/innodb/ibuf_bitmap_mutex | NO | NO | 31| wait/synch/mutex/innodb/ibuf_mutex | NO | NO | 32| wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | NO | NO | 33| wait/synch/mutex/innodb/log_sys_mutex | NO | NO | 34| wait/synch/mutex/innodb/log_sys_write_mutex | NO | NO | 35| wait/synch/mutex/innodb/mutex_list_mutex | NO | NO | 36| wait/synch/mutex/innodb/page_zip_stat_per_index_mutex | NO | NO | 37| wait/synch/mutex/innodb/purge_sys_pq_mutex | NO | NO | 38| wait/synch/mutex/innodb/recv_sys_mutex | NO | NO | 39| wait/synch/mutex/innodb/recv_writer_mutex | NO | NO | 40| wait/synch/mutex/innodb/redo_rseg_mutex | NO | NO | 41| wait/synch/mutex/innodb/noredo_rseg_mutex | NO | NO | 42| wait/synch/mutex/innodb/rw_lock_list_mutex | NO | NO | 43| wait/synch/mutex/innodb/rw_lock_mutex | NO | NO | 44| wait/synch/mutex/innodb/srv_dict_tmpfile_mutex | NO | NO | 45| wait/synch/mutex/innodb/srv_innodb_monitor_mutex | NO | NO | 46| wait/synch/mutex/innodb/srv_misc_tmpfile_mutex | NO | NO | 47| wait/synch/mutex/innodb/srv_monitor_file_mutex | NO | NO | 48| wait/synch/mutex/innodb/buf_dblwr_mutex | NO | NO | 49| wait/synch/mutex/innodb/trx_undo_mutex | NO | NO | 50| wait/synch/mutex/innodb/trx_pool_mutex | NO | NO | 51| wait/synch/mutex/innodb/trx_pool_manager_mutex | NO | NO | 52| wait/synch/mutex/innodb/srv_sys_mutex | NO | NO | 53| wait/synch/mutex/innodb/lock_mutex | NO | NO | 54| wait/synch/mutex/innodb/lock_wait_mutex | NO | NO | 55| wait/synch/mutex/innodb/trx_mutex | NO | NO | 56| wait/synch/mutex/innodb/srv_threads_mutex | NO | NO | 57| wait/synch/mutex/innodb/rtr_active_mutex | NO | NO | 58| wait/synch/mutex/innodb/rtr_match_mutex | NO | NO | 59| wait/synch/mutex/innodb/rtr_path_mutex | NO | NO | 60| wait/synch/mutex/innodb/rtr_ssn_mutex | NO | NO | 61| wait/synch/mutex/innodb/trx_sys_mutex | NO | NO | 62| wait/synch/mutex/innodb/zip_pad_mutex | NO | NO | 63| wait/synch/mutex/innodb/master_key_id_mutex | NO | NO | 64+---------------------------------------------------------+---------+-------+
InnoDB mutex instance는 server startup 시에 생성되며, 관련 instrument가 server startup 시에 활성화된 경우에만 instrument가 적용됩니다. 모든 InnoDB mutex instance에 instrumentation을 적용하고 활성화되도록 하려면 다음과 같은
performance-schema-instrument rule을 MySQL configuration file에 추가합니다:1performance-schema-instrument='wait/synch/mutex/innodb/%=ON'
모든 `InnoDB` mutex에 대한 wait event data가 필요하지 않은 경우, 추가적인
`performance-schema-instrument` rule을 MySQL configuration file에 추가하여 특정 instrument를 비활성화할 수 있습니다. 예를 들어, 전문 검색과 관련된 `InnoDB` mutex wait event instrument를 비활성화하려면 다음 rule을 추가합니다:
1performance-schema-instrument='wait/synch/mutex/innodb/fts%=OFF'
참고
wait/synch/mutex/innodb/fts%와 같이 더 긴 prefix를 가진 rule이
wait/synch/mutex/innodb/%와 같이 짧은 prefix를 가진 rule보다 우선합니다.
configuration file에 `performance-schema-instrument` rule을 추가한 후 server를 재시작합니다. 전문 검색과 관련된 mutex를 제외한 모든
`InnoDB` mutex가 활성화됩니다. 확인하려면
[`setup_instruments`](https://dev.mysql.com/doc/refman/9.5/en/performance-schema-setup-instruments-table.html "29.12.2.3 The setup_instruments Table") table을 조회합니다.
`ENABLED` 및 `TIMED` column은 활성화한 instrument에 대해 `YES`로 설정되어 있어야 합니다.
1mysql> SELECT * 2 FROM performance_schema.setup_instruments 3 WHERE NAME LIKE '%wait/synch/mutex/innodb%'; 4+-------------------------------------------------------+---------+-------+ 5| NAME | ENABLED | TIMED | 6+-------------------------------------------------------+---------+-------+ 7| wait/synch/mutex/innodb/commit_cond_mutex | YES | YES | 8| wait/synch/mutex/innodb/innobase_share_mutex | YES | YES | 9| wait/synch/mutex/innodb/autoinc_mutex | YES | YES | 10... 11| wait/synch/mutex/innodb/master_key_id_mutex | YES | YES | 12+-------------------------------------------------------+---------+-------+ 1349 rows in set (0.00 sec)
setup_consumers table을 업데이트하여 wait event consumer를 활성화합니다. wait event consumer는 기본적으로 비활성화되어 있습니다.1mysql> UPDATE performance_schema.setup_consumers 2 SET enabled = 'YES' 3 WHERE name like 'events_waits%'; 4Query OK, 3 rows affected (0.00 sec) 5Rows matched: 3 Changed: 3 Warnings: 0
[`setup_consumers`](https://dev.mysql.com/doc/refman/9.5/en/performance-schema-setup-consumers-table.html "29.12.2.2 The setup_consumers Table")
table을 조회하여 wait event consumer가 활성화되었는지 확인할 수 있습니다.
[`events_waits_current`](https://dev.mysql.com/doc/refman/9.5/en/performance-schema-events-waits-current-table.html "29.12.4.1 The events_waits_current Table"),
[`events_waits_history`](https://dev.mysql.com/doc/refman/9.5/en/performance-schema-events-waits-history-table.html "29.12.4.2 The events_waits_history Table"),
[`events_waits_history_long`](https://dev.mysql.com/doc/refman/9.5/en/performance-schema-events-waits-history-long-table.html "29.12.4.3 The events_waits_history_long Table")
consumer가 활성화되어 있어야 합니다.
1mysql> SELECT * FROM performance_schema.setup_consumers; 2+----------------------------------+---------+ 3| NAME | ENABLED | 4+----------------------------------+---------+ 5| events_stages_current | NO | 6| events_stages_history | NO | 7| events_stages_history_long | NO | 8| events_statements_current | YES | 9| events_statements_history | YES | 10| events_statements_history_long | NO | 11| events_transactions_current | YES | 12| events_transactions_history | YES | 13| events_transactions_history_long | NO | 14| events_waits_current | YES | 15| events_waits_history | YES | 16| events_waits_history_long | YES | 17| global_instrumentation | YES | 18| thread_instrumentation | YES | 19| statements_digest | YES | 20+----------------------------------+---------+ 2115 rows in set (0.00 sec)
1$> ./mysqlslap --auto-generate-sql --concurrency=100 --iterations=10 2 --number-of-queries=1000 --number-char-cols=6 --number-int-cols=6;
wait event data를 조회합니다. 이 예제에서는 wait event data가
events_waits_summary_global_by_event_name
table에서 조회되며, 이 table은
events_waits_current,
events_waits_history,
events_waits_history_long table에 있는 data를 집계합니다.
data는 event를 생성한 instrument의 이름인 event name
(EVENT_NAME)별로 요약됩니다. 요약된 data는 다음을 포함합니다:
COUNT_STAR
요약된 wait event의 개수입니다.
SUM_TIMER_WAIT
요약된 timed wait event의 총 wait 시간입니다.
MIN_TIMER_WAIT
요약된 timed wait event의 최소 wait 시간입니다.
AVG_TIMER_WAIT
요약된 timed wait event의 평균 wait 시간입니다.
MAX_TIMER_WAIT
요약된 timed wait event의 최대 wait 시간입니다.
다음 query는 instrument 이름
(EVENT_NAME), wait event 개수
(COUNT_STAR), 해당 instrument에 대한 event의 총 wait 시간
(SUM_TIMER_WAIT)을 반환합니다. wait은 기본적으로 피코초(1조분의 1초) 단위로 측정되므로, wait 시간은 밀리초 단위로 표시하기 위해 1000000000으로 나눕니다. data는 요약된 wait event 개수
(COUNT_STAR) 기준으로 내림차순 정렬되어 표시됩니다. total wait 시간 기준으로 data를 정렬하려면
ORDER BY 절을 조정할 수 있습니다.
1mysql> SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000 SUM_TIMER_WAIT_MS 2 FROM performance_schema.events_waits_summary_global_by_event_name 3 WHERE SUM_TIMER_WAIT > 0 AND EVENT_NAME LIKE 'wait/synch/mutex/innodb/%' 4 ORDER BY COUNT_STAR DESC; 5+---------------------------------------------------------+------------+-------------------+ 6| EVENT_NAME | COUNT_STAR | SUM_TIMER_WAIT_MS | 7+---------------------------------------------------------+------------+-------------------+ 8| wait/synch/mutex/innodb/trx_mutex | 201111 | 23.4719 | 9| wait/synch/mutex/innodb/fil_system_mutex | 62244 | 9.6426 | 10| wait/synch/mutex/innodb/redo_rseg_mutex | 48238 | 3.1135 | 11| wait/synch/mutex/innodb/log_sys_mutex | 46113 | 2.0434 | 12| wait/synch/mutex/innodb/trx_sys_mutex | 35134 | 1068.1588 | 13| wait/synch/mutex/innodb/lock_mutex | 34872 | 1039.2589 | 14| wait/synch/mutex/innodb/log_sys_write_mutex | 17805 | 1526.0490 | 15| wait/synch/mutex/innodb/dict_sys_mutex | 14912 | 1606.7348 | 16| wait/synch/mutex/innodb/trx_undo_mutex | 10634 | 1.1424 | 17| wait/synch/mutex/innodb/rw_lock_list_mutex | 8538 | 0.1960 | 18| wait/synch/mutex/innodb/buf_pool_free_list_mutex | 5961 | 0.6473 | 19| wait/synch/mutex/innodb/trx_pool_mutex | 4885 | 8821.7496 | 20| wait/synch/mutex/innodb/buf_pool_LRU_list_mutex | 4364 | 0.2077 | 21| wait/synch/mutex/innodb/innobase_share_mutex | 3212 | 0.2650 | 22| wait/synch/mutex/innodb/flush_list_mutex | 3178 | 0.2349 | 23| wait/synch/mutex/innodb/trx_pool_manager_mutex | 2495 | 0.1310 | 24| wait/synch/mutex/innodb/buf_pool_flush_state_mutex | 1318 | 0.2161 | 25| wait/synch/mutex/innodb/log_flush_order_mutex | 1250 | 0.0893 | 26| wait/synch/mutex/innodb/buf_dblwr_mutex | 951 | 0.0918 | 27| wait/synch/mutex/innodb/recalc_pool_mutex | 670 | 0.0942 | 28| wait/synch/mutex/innodb/dict_persist_dirty_tables_mutex | 345 | 0.0414 | 29| wait/synch/mutex/innodb/lock_wait_mutex | 303 | 0.1565 | 30| wait/synch/mutex/innodb/autoinc_mutex | 196 | 0.0213 | 31| wait/synch/mutex/innodb/autoinc_persisted_mutex | 196 | 0.0175 | 32| wait/synch/mutex/innodb/purge_sys_pq_mutex | 117 | 0.0308 | 33| wait/synch/mutex/innodb/srv_sys_mutex | 94 | 0.0077 | 34| wait/synch/mutex/innodb/ibuf_mutex | 22 | 0.0086 | 35| wait/synch/mutex/innodb/recv_sys_mutex | 12 | 0.0008 | 36| wait/synch/mutex/innodb/srv_innodb_monitor_mutex | 4 | 0.0009 | 37| wait/synch/mutex/innodb/recv_writer_mutex | 1 | 0.0005 | 38+---------------------------------------------------------+------------+-------------------+
참고
위 result set에는 startup 과정에서 생성된 wait event data가 포함됩니다. 이 data를 제외하려면, startup 직후 workload를 실행하기 전에
events_waits_summary_global_by_event_name
table을 truncate할 수 있습니다. 단, truncate 작업 자체도 무시할 수 있을 정도의 적은 양의 wait event data를 생성할 수 있습니다.
1mysql> TRUNCATE performance_schema.events_waits_summary_global_by_event_name;
17.16.1 Monitoring ALTER TABLE Progress for InnoDB Tables Using Performance Schema
17.17 InnoDB Monitors