MySQL 8.0 リファレンスマニュアル


27.12.18.10 メモリーサマリーテーブル

パフォーマンススキーマは、メモリー使用量を計測し、メモリー使用量の統計を集約します。詳細は、次の要因を参照してください:

  • 使用されるメモリーのタイプ (様々なキャッシュ、内部バッファなど)

  • メモリー操作を間接的に実行するスレッド、アカウント、ユーザー、ホスト

パフォーマンススキーマは、メモリー使用の次の側面を計測

  • 使用済メモリーサイズ

  • 操作数

  • 最低水位標と最高水位標

メモリーサイズは、サーバーのメモリー消費を理解またはチューニングするのに役立ちます。

操作数は、サーバーがメモリーアロケータに与える全体的な圧力を理解またはチューニングするのに役立ちます。これはパフォーマンスに影響します。 シングルバイトを 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 には、USERHOST および 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_ALLOCCOUNT_FREE と同等の便利なカラムです。

  • CURRENT_NUMBER_OF_BYTES_USED

    まだ解放されていない、現在割り当てられているメモリーブロックの集計サイズ。 これは、SUM_NUMBER_OF_BYTES_ALLOCSUM_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:

    • 主キー (HOSTEVENT_NAME)

  • memory_summary_by_thread_by_event_name:

    • 主キー (THREAD_IDEVENT_NAME)

  • memory_summary_by_user_by_event_name:

    • 主キー (USEREVENT_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_USEDCURRENT_COUNT_USED にリセットされます。

  • LOW_NUMBER_OF_BYTES_USED および HIGH_NUMBER_OF_BYTES_USEDCURRENT_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_instrumentsTIMED カラムは無視されます。

サーバー内のスレッドがインストゥルメントされたメモリー割当てを実行する場合、次のルールが適用されます:

  • スレッドがインストゥルメントされていない場合、またはメモリーインストゥルメントが有効になっていない場合、割り当てられたメモリーブロックはインストゥルメントされません。

  • それ以外の場合 (つまり、スレッドとインストゥルメントの両方が有効になっている場合)、割り当てられたメモリーブロックがインストゥルメントされます。

割当て解除には、次のルールが適用されます:

  • メモリー割当て操作がインストゥルメントされた場合、現在のインストゥルメントまたはスレッド有効ステータスに関係なく、対応する空き操作がインストゥルメントされます。

  • メモリー割当て操作がインストゥルメントされていない場合、現在のインストゥルメントまたはスレッド有効ステータスに関係なく、対応する空き操作はインストゥルメントされません。

スレッドごとの統計には、次のルールが適用されます。

計測されたサイズ N のメモリーブロックが割り当てられると、パフォーマンススキーマはメモリーサマリーテーブルのカラムを次のように更新します:

  • COUNT_ALLOC: 増加 1

  • CURRENT_COUNT_USED: 増加 1

  • HIGH_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: 増加 1

  • CURRENT_COUNT_USED: 減少 1

  • LOW_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 の範囲内である可能性があります。

キャパシティプランニングでは、セッションが相関していない場合に発生する可能性がある可能性があることが示されているため (通常は、最悪のケースのレポートが望ましい動作です)。


関連キーワード:  テーブル, メモリー, NUMBER, OF, BYTES, パフォーマンス, スキーマ, COUNT, memory, カラム