mutex は、特定の時間に 1 つのスレッドのみが共通リソースにアクセスできるように強制するために、コードで使用される同期メカニズムです。 サーバーで実行されている複数のスレッドが同じリソースにアクセスする必要がある場合、スレッドは互いに競合します。 mutex のロックを取得する最初のスレッドは、ロックが解放されるまで他のスレッドを待機します。
インストゥルメントされた InnoDB
mutex の場合、mutex 待機は Performance Schema を使用してモニターできます。 「パフォーマンススキーマ」テーブルで収集された待機イベントデータは、たとえば、待機時間が最も多い相互排他ロックや合計待機時間が最も長い相互排他ロックの識別に役立ちます。
次の例は、InnoDB
mutex 待機インストゥルメントを有効にする方法、関連付けられたコンシューマを有効にする方法、および待機イベントデータをクエリーする方法を示しています。
-
使用可能な
InnoDB
mutex 待機インストゥルメントを表示するには、パフォーマンススキーマsetup_instruments
テーブルをクエリーします。 すべてのInnoDB
mutex 待機インストゥルメントはデフォルトで無効になっています。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/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 | +---------------------------------------------------------+---------+-------+
-
一部の
InnoDB
mutex インスタンスはサーバーの起動時に作成され、関連付けられたインストゥルメントがサーバーの起動時にも有効になっている場合にのみインストゥルメントされます。 すべてのInnoDB
mutex インスタンスがインストゥルメントされ、有効になっていることを確認するには、次のperformance-schema-instrument
ルールを MySQL 構成ファイルに追加します:performance-schema-instrument='wait/synch/mutex/innodb/%=ON'
すべての
InnoDB
mutex の待機イベントデータが不要な場合は、MySQL 構成ファイルにperformance-schema-instrument
ルールを追加することで、特定のインストゥルメントを無効にできます。 たとえば、全文検索に関連するInnoDB
mutex 待機イベントインストゥルメントを無効にするには、次のルールを追加します:performance-schema-instrument='wait/synch/mutex/innodb/fts%=OFF'
注記wait/synch/mutex/innodb/fts%
などの長い接頭辞を持つルールは、wait/synch/mutex/innodb/%
などの短い接頭辞を持つルールよりも優先されます。performance-schema-instrument
ルールを構成ファイルに追加した後、サーバーを再起動します。 全文検索に関連するものを除くすべてのInnoDB
mutex が有効になります。 確認するには、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/master_key_id_mutex | YES | YES | +-------------------------------------------------------+---------+-------+ 49 rows in set (0.00 sec)
-
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)
-
インストゥルメントおよびコンシューマが有効になったら、監視するワークロードを実行します。 この例では、mysqlslap ロードエミュレーションクライアントを使用してワークロードをシミュレートします。
shell> ./mysqlslap --auto-generate-sql --concurrency=100 --iterations=10 --number-of-queries=1000 --number-char-cols=6 --number-int-cols=6;
-
待機イベントデータをクエリーします。 この例では、
events_waits_current
、events_waits_history
およびevents_waits_history_long
テーブルで見つかったデータを集計するevents_waits_summary_global_by_event_name
テーブルから待機イベントデータをクエリーします。 データは、イベントを生成したインストゥルメントの名前であるイベント名 (EVENT_NAME
) 別に要約されます。 要約されたデータには次のものが含まれます:-
COUNT_STAR
要約された待機イベントの数。
-
SUM_TIMER_WAIT
要約された時間指定待機イベントの合計待機時間。
-
MIN_TIMER_WAIT
要約された時間指定待機イベントの最小待機時間。
-
AVG_TIMER_WAIT
要約された時間指定待機イベントの平均待機時間。
-
MAX_TIMER_WAIT
要約された時間指定待機イベントの最大待機時間。
次のクエリーは、インストゥルメント名 (
EVENT_NAME
)、待機イベントの数 (COUNT_STAR
) およびそのインストゥルメントのイベントの合計待機時間 (SUM_TIMER_WAIT
) を返します。 待機はデフォルトでピコ秒 (1 秒に 1 兆) で時間がかかるため、待機時間は 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/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;
-