文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  監控 MySQL 記憶體用量

10.12.3.2 監控 MySQL 記憶體用量

下列範例示範如何使用 Performance Schemasys schema 來監控 MySQL 記憶體用量。

大多數 Performance Schema 記憶體檢測預設為停用。檢測可以透過更新 Performance Schema setup_instruments 資料表的 ENABLED 欄位來啟用。記憶體檢測的名稱格式為 memory/程式碼區塊/檢測名稱,其中 程式碼區塊 是諸如 sqlinnodb 之類的值,而 檢測名稱 是檢測詳細資訊。

  1. 若要檢視可用的 MySQL 記憶體檢測,請查詢 Performance Schema setup_instruments 資料表。下列查詢會傳回所有程式碼區塊的數百個記憶體檢測。

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%memory%';

    您可以透過指定程式碼區塊來縮小結果範圍。例如,您可以透過指定 innodb 作為程式碼區塊,將結果限制為 InnoDB 記憶體檢測。

    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 安裝,程式碼區塊可能包括 performance_schemasqlclientinnodbmyisamcsvmemoryblackholearchivepartition 等。

  2. 若要啟用記憶體檢測,請將 performance-schema-instrument 規則新增至您的 MySQL 組態檔。例如,若要啟用所有記憶體檢測,請將此規則新增至您的組態檔並重新啟動伺服器

    performance-schema-instrument='memory/%=COUNTED'
    注意

    在啟動時啟用記憶體檢測可確保會計算在啟動時發生的記憶體配置。

    重新啟動伺服器之後,Performance Schema setup_instruments 資料表的 ENABLED 欄位應針對您啟用的記憶體檢測報告 YESsetup_instruments 資料表中的 TIMED 欄位會針對記憶體檢測遭到忽略,因為記憶體操作不會計時。

    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    |
    ...
  3. 查詢記憶體檢測資料。在此範例中,記憶體檢測資料會在 Performance Schema memory_summary_global_by_event_name 資料表中查詢,該資料表會依 EVENT_NAME 摘要資料。EVENT_NAME 是檢測的名稱。

    下列查詢會傳回 InnoDB 緩衝池的記憶體資料。如需欄位描述,請參閱 第 29.12.20.10 節,「記憶體摘要資料表」

    mysql> SELECT * FROM performance_schema.memory_summary_global_by_event_name
           WHERE EVENT_NAME LIKE 'memory/innodb/buf_buf_pool'\G
                      EVENT_NAME: memory/innodb/buf_buf_pool
                     COUNT_ALLOC: 1
                      COUNT_FREE: 0
       SUM_NUMBER_OF_BYTES_ALLOC: 137428992
        SUM_NUMBER_OF_BYTES_FREE: 0
                  LOW_COUNT_USED: 0
              CURRENT_COUNT_USED: 1
                 HIGH_COUNT_USED: 1
        LOW_NUMBER_OF_BYTES_USED: 0
    CURRENT_NUMBER_OF_BYTES_USED: 137428992
       HIGH_NUMBER_OF_BYTES_USED: 137428992

    相同的基礎資料可以使用 sys schema 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

    sys schema 查詢會依程式碼區塊彙總目前配置的記憶體 (current_alloc)

    mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS
           code_area, 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     |
    +---------------------------+---------------+

    關於 sys 綱要的更多資訊,請參閱第 30 章,MySQL sys 綱要