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


MySQL 8.4 參考手冊  /  ...  /  監控 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 綱要的 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 綱要查詢會依程式碼區域彙總目前已配置的記憶體 (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 綱要