※追記しました。後述のドキュメントの話は修正されました!(^▽^)
計器(インストゥルメント)とは
計器(インストゥルメント)と呼ばれるコードを通じてMySQL(NDB Clusterを含む)はパフォーマンスに関するデータを取得しています。
取得されたデータはバッファ上に格納されます。
それがperformance_schemaデータベースのテーブル達です。
ユーザーはperformance_schemaデータベースのテーブルやsysビューを参照することでこれらの計器が収集した結果を取得することができます。
命名規則
計器(インストゥルメント)の名前は '/' 文字で区切られた一連のコンポーネントから構成されます。
この命名規則はどのような情報を取得しているかのおおよその目安になります。
名前空間がツリー上の構造を持っており、インストゥルメント名のコンポーネントは左から右に、より一般的からより具体的になります。
例えば、
wait/io/file
といった場合、ファイル I/O 操作の待機系情報を取得するコンポーネントが含まれています。
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-instrument-naming.html
トップレベルインストゥルメントコンポーネント
計器(インストゥルメント)の一番大枠となる部分です。
以下、各トップレベルインストゥルメントコンポーネント下にあるものの数を8.0.20版でざっと書き出します。(performance_schema.setup_instrumentsより)
トップ | コンポーネント数 | 説明 |
---|---|---|
error | 1 | インストゥルメント化されたエラーイベント |
idle | 1 | インストゥルメント化されたアイドルイベント |
memory | 489 | インストゥルメント化されたメモリイベント |
stage | 121 | インストゥルメント化されたステージイベント |
statement | 212 | インストゥルメント化されたステートメントイベント |
transaction | 1 | インストルメント化されたトランザクションイベント |
wait | 381 | インストゥルメント化された待機イベント |
この中で言葉からイメージが湧きづらいのはstageだと思います。
でも、名前空間を見るとなんとなくわかります。
例)
stage/innodb/alter table (end) stage/innodb/alter table (flush) stage/innodb/alter table (insert) stage/innodb/alter table (log apply index) … stage/mysys/Waiting for table level lock stage/sql/After create stage/sql/altering table stage/sql/Applying batch of row changes (delete) stage/sql/Applying batch of row changes (update) stage/sql/Applying batch of row changes (write) stage/sql/Changing master stage/sql/Checking master version stage/sql/checking permissions stage/sql/cleaning up stage/sql/closing tables stage/sql/committing alter table to storage engine stage/sql/Compressing gtid_executed table stage/sql/Compressing transaction changes. stage/sql/Connecting to master stage/sql/converting HEAP to ondisk stage/sql/copy to tmp table stage/sql/creating table stage/sql/Creating tmp table … stage/sql/Waiting for acl cache lock stage/sql/Waiting for an event from Coordinator stage/sql/Waiting for backup lock stage/sql/Waiting for check constraint metadata lock stage/sql/Waiting for column statistics lock stage/sql/Waiting for commit lock stage/sql/Waiting for dependent transaction to commit
これを見るとドキュメントの言ってることもなんとなくわかります。(ドキュメントだけだと僕は最初なんのこっちゃでしたw)
ステージインストゥルメントは、形式 stage/code_area/stage_name の名前を持ちます。ここで code_area は sql や myisam などの名前で、stage_name は、Sorting result や Sending data などのステートメント処理のステージを示します。ステージは SHOW PROCESSLIST によって表示されるか、または INFORMATION_SCHEMA.PROCESSLIST テーブルに表示されるスレッドの状態に対応します。
Stage instruments have names of the form stage/code_area/stage_name, where code_area is a value such as sql or myisam, and stage_name indicates the stage of statement processing, such as Sorting result or Sending data. Stages correspond to the thread states displayed by SHOW PROCESSLIST or that are visible in the INFORMATION_SCHEMA.PROCESSLIST table.
https://dev.mysql.com/doc/refman/5.6/ja/performance-schema-instrument-naming.html
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-instrument-naming.html
パフォーマンススキーマ関連のシステムパラメータ
mysql> SHOW VARIABLES LIKE 'perf%';
で確認できますが、各パラメータの詳細についてはドキュメントを参照してください。
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-system-variables.html
ご存じだと思いますが、パフォーマンススキーマを有効にするにはperformance_schemaをONにするんですが、MySQL5.7以降はデフォルトONです。
最大登録数について
そしてここからが本題
performance_schema_max_xxxx_classesは計器の種類がxxxxのものの最大登録数を設定しています。
例えば、performance_schema_max_file_classesであれば ****/file/xxx といった計器が登録できる最大数という意味です。
パフォーマンススキーマの計器はバージョンを重ねるごとに増えており、計器の最大登録数もそれに併せて増えているようです。
また、計器自体は既存のもの以外にサードパーティプラグインを追加することもできるようになっており、そういったことから追加したい場合にその数に併せて最大登録数を調整できるようにしています。
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-status-monitoring.html
実際にどう増えていってるか確認してみる
とみたさんの例のパラメータ比較するやつをお借りします。
https://mysql-params.tmtms.net/mysqld/?vers=5.6.47,5.7.24,5.7.25,8.0.11,8.0.12,8.0.13&diff=true
パラメータ名 | MySQL 5.6.47 |
MySQL 5.7.24 |
MySQL 5.7.25 |
MySQL 8.0.11 |
MySQL 8.0.12 |
MySQL 8.0.13 |
MySQL 8.0.19 |
---|---|---|---|---|---|---|---|
performance-schema-max-cond-classes | 80 | 80 | 80 | 80 | 80 | 100 | 100 |
performance-schema-max-file-classes | 50 | 80 | 80 | 80 | 80 | 80 | 80 |
performance-schema-max-memory-classes | - | 320 | 320 | 450 | 450 | 450 | 450 |
performance-schema-max-mutex-classes | 200 | 210 | 210 | 250 | 300 | 300 | 300 |
performance-schema-max-rwlock-classes | 40 | 40 | 50 | 60 | 60 | 60 | 60 |
performance-schema-max-stage-classes | 150 | 150 | 150 | 150 | 150 | 175 | 175 |
performance-schema-max-statement-classes | 168 | 193 | 193 | 212 | 212 | 212 | 218 |
performance-schema-max-thread-classes | 50 | 50 | 50 | 100 | 100 | 100 | 100 |
ところどころマイナーバージョンアップ時に上がってます。
ところが・・・
MySQL8.0のドキュメントを見ると・・・
あれ?一部のデフォルト値がおかしい。
マイナーバージョンで数値が上がっているのであれば、そのマイナーバージョンごとの記載があるべきなんですが・・・。
ソースも見てみる
#ifndef PFS_MAX_MUTEX_CLASS #define PFS_MAX_MUTEX_CLASS 300 #endif #ifndef PFS_MAX_RWLOCK_CLASS #define PFS_MAX_RWLOCK_CLASS 60 #endif #ifndef PFS_MAX_COND_CLASS #define PFS_MAX_COND_CLASS 100 #endif #ifndef PFS_MAX_THREAD_CLASS #define PFS_MAX_THREAD_CLASS 100 #endif #ifndef PFS_MAX_FILE_CLASS #define PFS_MAX_FILE_CLASS 80 #endif ・・・ #endif #ifndef PFS_MAX_STAGE_CLASS #define PFS_MAX_STAGE_CLASS 175 #endif ・・・ #ifndef PFS_MAX_MEMORY_CLASS #define PFS_MAX_MEMORY_CLASS 450 #endif
https://github.com/mysql/mysql-server/blob/8.0/storage/perfschema/pfs_server.h#L56-L85
あー、やっぱりドキュメントが未修正っぽい・・・。
いずれ修正されると思いますが、気になるパラメータについてはデフォルト値についてはソースや実際にインストールしたDBの初期値で確認するのが確実ですね。
追記
修正されました!
Default Value (≥ 8.0.13)という欄が追加されてます!やったね!