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


29.12.20.10 記憶體摘要表格

Performance Schema 會檢測記憶體用量,並彙總記憶體用量統計資訊,詳細資訊如下列因素所列:

  • 使用的記憶體類型 (各種快取、內部緩衝區等)

  • 間接執行記憶體作業的執行緒、帳戶、使用者、主機

Performance Schema 會檢測下列記憶體用量的層面

  • 使用的記憶體大小

  • 操作計數

  • 低水位標記和高水位標記

記憶體大小有助於了解或調整伺服器的記憶體消耗。

操作計數有助於了解或調整伺服器施加在記憶體配置器上的整體壓力,這會影響效能。配置一百萬次單一位元組與配置一次一百萬位元組不同;追蹤大小和計數可以顯示差異。

低水位標記和高水位標記對於偵測工作負載峰值、整體工作負載穩定性和可能的記憶體洩漏至關重要。

記憶體摘要表格不包含時間資訊,因為記憶體事件不會計時。

如需收集記憶體用量資料的相關資訊,請參閱記憶體檢測行為

記憶體事件摘要資訊範例

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

每個記憶體摘要表格都有一個或多個群組資料行,以指出表格如何彙總事件。事件名稱指的是 setup_instruments 表格中的事件工具名稱

每個記憶體摘要表格都具有這些包含彙總值的摘要資料行

  • COUNT_ALLOCCOUNT_FREE

    記憶體配置和記憶體釋放函數的彙總呼叫次數。

  • SUM_NUMBER_OF_BYTES_ALLOCSUM_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_USEDHIGH_COUNT_USED

    對應於 CURRENT_COUNT_USED 欄位的低水位標記和高水位標記。

  • LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED

    對應於 CURRENT_NUMBER_OF_BYTES_USED 欄位的低水位標記和高水位標記。

記憶體摘要表具有以下索引

記憶體摘要表允許使用 TRUNCATE TABLE。 它具有以下效果

  • 一般來說,截斷會重置統計基準,但不會變更伺服器狀態。也就是說,截斷記憶體表不會釋放記憶體。

  • COUNT_ALLOCCOUNT_FREE 會重置為新的基準,方法是將每個計數器減少相同的值。

  • 同樣地,SUM_NUMBER_OF_BYTES_ALLOCSUM_NUMBER_OF_BYTES_FREE 會重置為新的基準。

  • LOW_COUNT_USEDHIGH_COUNT_USED 會重置為 CURRENT_COUNT_USED

  • LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED 會重置為 CURRENT_NUMBER_OF_BYTES_USED

此外,每個依帳戶、主機、使用者或執行緒聚合的記憶體摘要表,都會因截斷其所依賴的連線表,或截斷 memory_summary_global_by_event_name 而隱式截斷。如需詳細資訊,請參閱 第 29.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:增加 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_USEDLOW_NUMBER_OF_BYTES_USED 為較低的估計值。效能綱要回報的值保證小於或等於執行時實際使用的最低計數或記憶體大小。

  • HIGH_COUNT_USEDHIGH_NUMBER_OF_BYTES_USED 為較高的估計值。效能綱要回報的值保證大於或等於執行時實際使用的最高計數或記憶體大小。

對於 memory_summary_global_by_event_name 以外的摘要表中的較低估計值,如果記憶體所有權在執行緒之間轉移,則值有可能會變為負數。

以下為估計值計算的範例;但請注意,估計值實作方式可能會變更

執行緒 1 在執行期間使用的記憶體範圍從 1MB 到 2MB,如 memory_summary_by_thread_by_event_name 表的 LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED 欄位所回報。

執行緒 2 在執行期間使用的記憶體範圍從 10MB 到 12MB,同樣如上述欄位所回報。

當這兩個執行緒屬於相同的使用者帳戶時,每個帳戶的摘要會估計此帳戶使用的記憶體範圍從 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.5MB 到 13.5MB 之間。

對於容量規劃而言,回報最壞的情況實際上是預期的行為,因為它顯示當會話彼此不相關時可能發生的情況,而這通常是這種情況。