使用バージョン:MySQL 5.7
公式ドキュメント
performance_schemaには、メモリ使用状況を記録する以下のテーブルがあります。
mysql> show tables like '%memory%summary%';
+-------------------------------------------------+
| Tables_in_performance_schema (%memory%summary%) |
+-------------------------------------------------+
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
+-------------------------------------------------+
各メモリ統計テーブルには、以下の統計列があります:
* COUNT_ALLOC、COUNT_FREE:メモリ割り当てと解放関数の呼び出し総回数
* SUM_NUMBER_OF_BYTES_ALLOC、SUM_NUMBER_OF_BYTES_FREE:割り当て済みと解放済みのメモリブロックの総バイトサイズ
* CURRENT_COUNT_USED:これは便利な列で、COUNT_ALLOC - COUNT_FREEに等しいです
* CURRENT_NUMBER_OF_BYTES_USED:現在割り当て済みで未解放のメモリブロックの統計サイズ。これは便利な列で、SUM_NUMBER_OF_BYTES_ALLOC - SUM_NUMBER_OF_BYTES_FREEに等しいです
* LOW_COUNT_USED、HIGH_COUNT_USED:CURRENT_COUNT_USED列に対応する低水位と高水位マーク
* LOW_NUMBER_OF_BYTES_USED、HIGH_NUMBER_OF_BYTES_USED:CURRENT_NUMBER_OF_BYTES_USED列に対応する低水位と高水位マーク
メモリ統計テーブルではTRUNCATE TABLEステートメントの使用が許可されています。TRUNCATEステートメントを使用する際の動作は以下の通りです:
* 通常、TRUNCATE操作は統計情報の基準データをリセット(以前のデータをクリア)しますが、現在のサーバーのメモリ割り当てなどの状態は変更しません。つまり、メモリ統計テーブルをTRUNCATEしても、割り当て済みのメモリは解放されません
* COUNT_ALLOCとCOUNT_FREE列をリセットし、カウントを再開します(メモリ統計情報がリセット後の値を基準データとして使用します)
* SUM_NUMBER_OF_BYTES_ALLOCとSUM_NUMBER_OF_BYTES_FREE列のリセットは、COUNT_ALLOCとCOUNT_FREE列のリセットと同様です
* LOW_COUNT_USEDとHIGH_COUNT_USEDはCURRENT_COUNT_USED列の値にリセットされます
* LOW_NUMBER_OF_BYTES_USEDとHIGH_NUMBER_OF_BYTES_USEDはCURRENT_NUMBER_OF_BYTES_USED列の値にリセットされます
* さらに、アカウント、ホスト、ユーザー、またはスレッドで分類されたメモリ統計テーブル、またはmemory_summary_global_by_event_nameテーブルの場合、依存するaccounts、hosts、usersテーブルでTRUNCATEを実行すると、メモリ統計テーブルに対して暗黙的にTRUNCATEステートメントが実行されます
要約すると、ユーザー、ホスト、スレッド、アカウント、グローバルの各次元に基づいてメモリを監視できます。同時に、sysライブラリはこれらのテーブルに対してさらにフォーマットを適用し、各オブジェクトのメモリ使用量をユーザーが簡単に確認できるようにしています:
mysql> select event_name,current_alloc from sys.memory_global_by_current_bytes limit 10;
+-----------------------------------------------------------------------------+---------------+
| event_name | current_alloc |
+-----------------------------------------------------------------------------+---------------+
| memory/performance_schema/events_statements_history_long | 13.66 MiB |
| memory/performance_schema/events_statements_history_long.sqltext | 9.77 MiB |
| memory/performance_schema/events_statements_history_long.tokens | 9.77 MiB |
| memory/performance_schema/events_statements_summary_by_digest.tokens | 9.77 MiB |
| memory/performance_schema/table_handles | 9.06 MiB |
| memory/performance_schema/events_statements_summary_by_thread_by_event_name | 8.67 MiB |
| memory/sql/String::value | 6.02 MiB |
| memory/performance_schema/memory_summary_by_thread_by_event_name | 5.62 MiB |
| memory/performance_schema/events_statements_summary_by_digest | 4.88 MiB |
| memory/sql/TABLE | 4.35 MiB |
+-----------------------------------------------------------------------------+---------------+
デフォルトでは、performance_schemaはperformance_schema自体のメモリ使用量のみを統計しています。MySQLのインストールコード領域に応じて、performance_schema、sql、client、innodb、myisam、csv、memory、blackhole、archive、partitionなどが含まれる場合があります。
InnoDB関連のメモリ監視が有効かどうかを確認します。デフォルトでは無効です。
mysql> SELECT * FROM performance_schema.setup_instruments
-> WHERE NAME LIKE '%memory%';
+--------------------------------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+--------------------------------------------------------------------------------+---------+-------+
| memory/performance_schema/mutex_instances | YES | NO |
| memory/performance_schema/rwlock_instances | YES | NO |
| memory/performance_schema/cond_instances | YES | NO |
| memory/performance_schema/file_instances | YES | NO |
| memory/performance_schema/socket_instances | YES | NO |
| memory/performance_schema/metadata_locks | YES | NO |
| memory/performance_schema/file_handle | YES | NO |
| memory/performance_schema/accounts | YES | NO |
| memory/performance_schema/events_waits_summary_by_account_by_event_name | YES | NO |
| memory/performance_schema/events_stages_summary_by_account_by_event_name | YES | NO |
| memory/performance_schema/events_statements_summary_by_account_by_event_name | YES | NO |
| memory/performance_schema/events_transactions_summary_by_account_by_event_name | YES | NO |
| memory/performance_schema/memory_summary_by_account_by_event_name | YES | NO |
| memory/performance_schema/events_stages_summary_global_by_event_name | YES | NO |
| memory/performance_schema/events_statements_summary_global_by_event_name | YES | NO |
| memory/performance_schema/memory_summary_global_by_event_name | YES | NO |
| memory/performance_schema/hosts | YES | NO |
| memory/performance_schema/events_waits_summary_by_host_by_event_name | YES | NO |
| memory/performance_schema/events_stages_summary_by_host_by_event_name | YES | NO |
| memory/performance_schema/events_statements_summary_by_host_by_event_name | YES | NO |
| memory/performance_schema/events_transactions_summary_by_host_by_event_name | YES | NO |
条件を絞って確認することもできます:
mysql> SELECT * FROM performance_schema.setup_instruments
WHERE NAME LIKE '%memory/innodb%';
+-------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+-------------------------------------------+---------+-------+
| memory/innodb/adaptive hash index | NO | NO |
| memory/innodb/buf_buf_pool | NO | NO |
| memory/innodb/dict_stats_bg_recalc_pool_t | NO | NO |
| memory/innodb/dict_stats_index_map_t | NO | NO |
| memory/innodb/dict_stats_n_diff_on_level | NO | NO |
| memory/innodb/other | NO | NO |
| memory/innodb/row_log_buf | NO | NO |
| memory/innodb/row_merge_sort | NO | NO |
| memory/innodb/std | NO | NO |
| memory/innodb/trx_sys_t::rw_trx_ids | NO | NO |
すべての可能性のあるオブジェクトに対してメモリ監視を行うためには、以下の設定も必要です:
mysql> update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
Query OK, 306 rows affected (0.00 sec)
Rows matched: 376 Changed: 306 Warnings: 0
ただし、このオンラインでのメモリ統計の有効化方法は、後に追加されたメモリオブジェクトにのみ有効です。データベースを再起動すると、設定が元に戻ります:
グローバルライフサイクル中のオブジェクトに対してメモリ統計を行いたい場合は、設定ファイルで設定を行い、再起動する必要があります:
[mysqld]
performance-schema-instrument='memory/%=COUNTED'
sysライブラリのmemory_global_by_current_bytesテーブルを使用して、同じ基礎データをクエリできます。このスキーマテーブルは、サーバー内の現在のメモリ使用状況を、割り当てタイプごとに細分化して表示します。
mysql> SELECT * FROM sys.memory_global_by_current_bytes
WHERE event_name LIKE 'memory/innodb/buf_buf_pool'\G
*************************** 1. row ***************************
event_name: memory/innodb/buf_buf_pool
current_count: 1
current_alloc: 131.06 MiB
current_avg_alloc: 131.06 MiB
high_count: 1
high_alloc: 131.06 MiB
high_avg_alloc: 131.06 MiB
このスキーマクエリは、current_alloc()コード領域を基にして現在割り当てられたメモリを集約します:
mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS
code_area, sys.format_bytes(SUM(current_alloc))
AS current_alloc
FROM sys.x$memory_global_by_current_bytes
GROUP BY SUBSTRING_INDEX(event_name,'/',2)
ORDER BY SUM(current_alloc) DESC;
+---------------------------+---------------+
| code_area | current_alloc |
+---------------------------+---------------+
| memory/innodb | 843.24 MiB |
| memory/performance_schema | 81.29 MiB |
| memory/mysys | 8.20 MiB |
| memory/sql | 2.47 MiB |
| memory/memory | 174.01 KiB |
| memory/myisam | 46.53 KiB |
| memory/blackhole | 512 bytes |
| memory/federated | 512 bytes |
| memory/csv | 512 bytes |
| memory/vio | 496 bytes |
+---------------------------+---------------+