パフォーマンススキーマは、メモリー使用量を計測し、メモリー使用量の統計を集約します。詳細は、次の要因を参照してください:
使用されるメモリーのタイプ (様々なキャッシュ、内部バッファなど)
メモリー操作を間接的に実行するスレッド、アカウント、ユーザー、ホスト
パフォーマンススキーマは、メモリー使用の次の側面を計測
使用済メモリーサイズ
操作数
最低水位標と最高水位標
メモリーサイズは、サーバーのメモリー消費を理解またはチューニングするのに役立ちます。
操作数は、サーバーがメモリーアロケータに与える全体的な圧力を理解またはチューニングするのに役立ちます。これはパフォーマンスに影響します。 シングルバイトを 100 万回割り当てることは、100 万バイトを一度に割り当てることと同じではありません。サイズとカウントの両方を追跡すると、違いが生じる可能性があります。
最低水位標と最高水位標は、ワークロードのスパイク、全体的なワークロードの安定性およびメモリーリークの可能性を検出するために重要です。
メモリーサマリーテーブルには、メモリーイベントが時間指定されていないため、タイミング情報は含まれません。
メモリー使用量データの収集の詳細は、メモリーインストゥルメンテーションの動作 を参照してください。
メモリーイベントのサマリー情報の例:
mysql> SELECT *
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME = 'memory/sql/TABLE'\G
*************************** 1. row ***************************
EVENT_NAME: memory/sql/TABLE
COUNT_ALLOC: 1381
COUNT_FREE: 924
SUM_NUMBER_OF_BYTES_ALLOC: 2059873
SUM_NUMBER_OF_BYTES_FREE: 1407432
LOW_COUNT_USED: 0
CURRENT_COUNT_USED: 457
HIGH_COUNT_USED: 461
LOW_NUMBER_OF_BYTES_USED: 0
CURRENT_NUMBER_OF_BYTES_USED: 652441
HIGH_NUMBER_OF_BYTES_USED: 669269
各メモリーサマリーテーブルには、テーブルがイベントを集約する方法を示す 1 つまたは複数のグループ化カラムがあります。 イベント名は、setup_instruments
テーブル内のイベントインストゥルメントの名前を参照します:
memory_summary_by_account_by_event_name
には、USER
、HOST
およびEVENT_NAME
カラムがあります。 各行には、特定のアカウント (ユーザーとホストの組合せ) およびイベント名のイベントが要約されます。memory_summary_by_host_by_event_name
には、HOST
カラムおよびEVENT_NAME
カラムがあります。 各行には、特定のホストおよびイベント名のイベントが要約されます。memory_summary_by_thread_by_event_name
には、THREAD_ID
カラムおよびEVENT_NAME
カラムがあります。 各行は特定のスレッドおよびイベント名のイベントを要約します。memory_summary_by_user_by_event_name
には、USER
カラムおよびEVENT_NAME
カラムがあります。 各行には、特定のユーザーおよびイベント名のイベントが要約されます。memory_summary_global_by_event_name
には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
カラムに対応する最低水位標および最高水位標。
メモリーサマリーテーブルには、次のインデックスがあります:
-
memory_summary_by_account_by_event_name
:主キー (
USER
,HOST
,EVENT_NAME
)
-
memory_summary_by_host_by_event_name
:主キー (
HOST
、EVENT_NAME
)
-
memory_summary_by_thread_by_event_name
:主キー (
THREAD_ID
、EVENT_NAME
)
-
memory_summary_by_user_by_event_name
:主キー (
USER
、EVENT_NAME
)
-
memory_summary_global_by_event_name
:主キー (
EVENT_NAME
)
TRUNCATE TABLE
はメモリーサマリーテーブルに対して許可されています。 これには次の効果があります:
通常、切捨てによって統計のベースラインがリセットされますが、サーバーの状態は変更されません。 つまり、メモリーテーブルを切り捨ててもメモリーは解放されません。
COUNT_ALLOC
およびCOUNT_FREE
は、各カウンタを同じ値だけ減らすことで、新しいベースラインにリセットされます。同様に、
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
にリセットされます。
また、アカウント、ホスト、ユーザーまたはスレッド別に集計された各メモリーサマリーテーブルは、依存する接続テーブルの切捨てまたは memory_summary_global_by_event_name
の切捨てによって暗黙的に切り捨てられます。 詳細は、セクション27.12.8「パフォーマンススキーマ接続テーブル」を参照してください。
メモリーインストゥルメントは setup_instruments
テーブルにリストされ、memory/
という形式の名前を持ちます。 メモリーインストゥルメンテーションはデフォルトで有効になっています。
code_area
/instrument_name
接頭辞 memory/performance_schema/
が付いたインストゥルメントは、パフォーマンススキーマ自体の内部バッファーに割り当てられているメモリー量を公開します。 memory/performance_schema/
インストゥルメントは組込みであり、常に有効になっており、起動時または実行時に無効にすることはできません。 組込みメモリーインストルメントは、memory_summary_global_by_event_name
テーブルにのみ表示されます。
サーバー起動時のメモリーインストゥルメンテーションの状態を制御するには、my.cnf
ファイルで次のような行を使用します:
-
有効化:
[mysqld] performance-schema-instrument='memory/%=ON'
-
無効化:
[mysqld] performance-schema-instrument='memory/%=OFF'
実行時のメモリーインストゥルメンテーションの状態を制御するには、setup_instruments
テーブルの関連インストゥルメントの ENABLED
カラムを更新します:
-
有効化:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';
-
無効化:
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'memory/%';
メモリーインストルメントの場合、メモリー操作は時間外であるため、setup_instruments
の TIMED
カラムは無視されます。
サーバー内のスレッドがインストゥルメントされたメモリー割当てを実行する場合、次のルールが適用されます:
スレッドがインストゥルメントされていない場合、またはメモリーインストゥルメントが有効になっていない場合、割り当てられたメモリーブロックはインストゥルメントされません。
それ以外の場合 (つまり、スレッドとインストゥルメントの両方が有効になっている場合)、割り当てられたメモリーブロックがインストゥルメントされます。
割当て解除には、次のルールが適用されます:
メモリー割当て操作がインストゥルメントされた場合、現在のインストゥルメントまたはスレッド有効ステータスに関係なく、対応する空き操作がインストゥルメントされます。
メモリー割当て操作がインストゥルメントされていない場合、現在のインストゥルメントまたはスレッド有効ステータスに関係なく、対応する空き操作はインストゥルメントされません。
スレッドごとの統計には、次のルールが適用されます。
計測されたサイズ N
のメモリーブロックが割り当てられると、パフォーマンススキーマはメモリーサマリーテーブルのカラムを次のように更新します:
COUNT_ALLOC
: 増加 1CURRENT_COUNT_USED
: 増加 1HIGH_COUNT_USED
:CURRENT_COUNT_USED
が新しい最大値の場合に増加SUM_NUMBER_OF_BYTES_ALLOC
:N
による増加CURRENT_NUMBER_OF_BYTES_USED
:N
による増加HIGH_NUMBER_OF_BYTES_USED
:CURRENT_NUMBER_OF_BYTES_USED
が新しい最大値の場合に増加
インストゥルメントされたメモリーブロックの割り当てが解除されると、パフォーマンススキーマはメモリーサマリーテーブルのカラムを次のように更新します:
COUNT_FREE
: 増加 1CURRENT_COUNT_USED
: 減少 1LOW_COUNT_USED
:CURRENT_COUNT_USED
が新しい最小値の場合は減少SUM_NUMBER_OF_BYTES_FREE
:N
による増加CURRENT_NUMBER_OF_BYTES_USED
:N
による減少LOW_NUMBER_OF_BYTES_USED
:CURRENT_NUMBER_OF_BYTES_USED
が新しい最小値の場合は減少
高レベルの集計 (アカウント別、ユーザー別、ホスト別) では、最低水位標と最高水位標に同じルールが適用されます。
LOW_COUNT_USED
およびLOW_NUMBER_OF_BYTES_USED
は、より低い見積りです。 パフォーマンススキーマによって報告される値は、実行時に効率的に使用されるメモリーの最小数または最小サイズ以下であることが保証されます。HIGH_COUNT_USED
およびHIGH_NUMBER_OF_BYTES_USED
は、より高い見積りです。 パフォーマンススキーマによって報告される値は、実行時に効率的に使用されるメモリーの最大数または最大サイズ以上であることが保証されます。
memory_summary_global_by_event_name
以外のサマリーテーブルの見積りが低い場合、スレッド間でメモリー所有権が転送されると、値が負になる可能性があります。
見積計算の例を次に示しますが、見積実装は変更される可能性があることに注意してください:
スレッド 1 は、memory_summary_by_thread_by_event_name
テーブルの LOW_NUMBER_OF_BYTES_USED
カラムおよび HIGH_NUMBER_OF_BYTES_USED
カラムで報告されているように、実行中に 1MB から 2MB の範囲のメモリーを使用します。
スレッド 2 は、同様に、実行中に 10MB から 12MB の範囲のメモリーを使用します。
これらの 2 つのスレッドが同じユーザーアカウントに属している場合、アカウントごとのサマリーでは、このアカウントが 11MB から 14MB の範囲でメモリーを使用したと推定されます。 つまり、上位レベルの集計の LOW_NUMBER_OF_BYTES_USED
は、各 LOW_NUMBER_OF_BYTES_USED
の合計です (最悪の場合)。 同様に、上位レベルの集計の HIGH_NUMBER_OF_BYTES_USED
は、各 HIGH_NUMBER_OF_BYTES_USED
の合計です (最悪の場合)。
11MB は、両方のスレッドが同時に低い使用マークに達した場合にのみ発生する可能性のある低い見積りです。
14MB は、両方のスレッドが同時に高使用量マークに達した場合にのみ発生する可能性のある高い見積りです。
このアカウントの実際のメモリー使用量は、11.5 MB から 13.5 MB の範囲内である可能性があります。
キャパシティプランニングでは、セッションが相関していない場合に発生する可能性がある可能性があることが示されているため (通常は、最悪のケースのレポートが望ましい動作です)。