パフォーマンススキーマ ( 3 )

August 20, 2018

コンシューマの On/Off

計器がデータを収集するポイントという観点だとすると、コンシューマはデータを消費するための仕組みであり、データを一時保存しておく場所となる。個々のコンシューマはパフォーマンススキーマ上のテーブルとして具現化されており、どのようなコンシューマが存在するかは setup_consumers テーブルを見るのが手っ取り早い。

mysql> SELECT * FROM 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      | NO      |  
| events_transactions_history      | NO      |  
| events_transactions_history_long | NO      |  
| events_waits_current             | NO      |  
| events_waits_history             | NO      |  
| events_waits_history_long        | NO      |  
| global_instrumentation           | YES     |  
| thread_instrumentation           | YES     |  
| statements_digest                | YES     |  
+----------------------------------+---------+  
15 rows in set (0.00 sec)  

なお、個々のコンシューマには以下のような上下関係があり、上位のコンシューマが有効になっていないと下位のコンシューマは情報収集ができない。

global_instrumentation  
 thread_instrumentation  
   events_waits_current  
     events_waits_history  
     events_waits_history_long  
   events_stages_current  
     events_stages_history  
     events_stages_history_long  
   events_statements_current  
     events_statements_history  
     events_statements_history_long  
   events_transactions_current  
     events_transactions_history  
     events_transactions_history_long  
 statements_digest  

global_instrumentation というコンシューマが最上位であり、これが有効化されていないと、ほかのコンシューマは全て無効となる。
スレッドごと、ダイジェストごとのコンシューマが次の段階であり、スレッドの配下にはスコープに応じたコンシューマが 4 つある。
それぞれの意味を以下に記載する。

コンシューマ名 スコープ 説明
events_stages_current ステージ 個々のステージを対象にしたコンシューマ。ステージとは各 SQL の実行における段階のこと。SQL の種類によってどのようなステージが実行されるかは異なる
events_statements_current SQL 文 1 つの SQL 文ごとのコンシューマ
events_statements_current トランザクション トランザクション全体を対象にしたコンシューマ
events_waits_current 計器 1 つの計器を待っている間に集計されるコンシューマ

これら 4 つのコンシューマには同じ名前のテーブルがあり、そのテーブルへのデータ提供が行われるかどうかを setup_consumers テーブルで設定するようになっている。
データを取得するためのテーブルとオン種0まの関係性は _current 、_history 、_history_long というバリエーションの存在のために 1:1 にはなっていないが、以下はステートメントごとに集計を行うコンシューマを有効化するコマンドとなる。

mysql> UPDATE setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements%';  
Query OK, 1 row affected (0.00 sec)  
Rows matched: 3  Changed: 1  Warnings: 0  

なお、_history コンシューマはスレッドごとの履歴を、_history_long は MySQL サーバ全体の履歴を参照できるようになっている。

オブジェクトの On/Off

setup_objects テーブルを使用すると、各種オブジェクトごとにデータ収集の on/off を切り替えられる。デフォルトでは情報スキーマとパフォーマンススキーマを除く、すべてのオブジェクトに対してデータ収集が有効となっている。特定のオブジェクトだけを追跡したい場合は、一旦全てのオブジェクトに対するデータ取集をオフにし、それから個別のものだけをオンにすれば良い。
setup_objects で指定できるオブジェクトには TABLE 、FUNCTION 、PROCEDURE 、TRIGGER 、EVENT がある。
例えば hoge にあるテーブルだけを追跡したい場合は、以下のように setup_objects テーブルを更新する。

mysql> UPDATE setup_objects SET ENABLED='No', TIMED='No';  
Query OK, 5 rows affected (0.01 sec)  
Rows matched: 20  Changed: 5  Warnings: 0  
  
mysql> INSERT INTO setup_objects VALUES ('TABLE', 'hoge', '%', 'Yes', 'Yes');  
Query OK, 1 row affected (0.01 sec)  

スレッドの On/Off

データ収集は現在存在するスレッドごとに on/off を切り替えられるようになっている。threads テーブルを更新することで動的に各スレッドのデータ収集をコントロールできる。
しかしスレッドは必要に応じて作成と破棄が繰り返されるので、setup_actors により、ユーザーアカウントごとのスレッドの初期状態を設定することが可能となっている。ENABLED と HISTORY というカラムがあり、それぞれ YES か NO で設定する。ENABLED は _current コンシューマに対して、HISTORY は _history コンシューマに対して on/off を切り替える。

mysql> SELECT * FROM setup_actors;  
+------+------+------+---------+---------+  
| HOST | USER | ROLE | ENABLED | HISTORY |  
+------+------+------+---------+---------+  
| %    | %    | %    | YES     | YES     |  
+------+------+------+---------+---------+  
1 row in set (0.00 sec)  

 © 2023, Dealing with Ambiguity