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
表格中事件儀器的名稱
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
而隱含地截斷。如需詳細資訊,請參閱第 29.12.8 節,「Performance Schema 連線表」。
記憶體檢測工具列在 setup_instruments
表中,並且具有 memory/
形式的名稱。記憶體檢測預設為啟用。code_area
/instrument_name
名稱以 memory/performance_schema/
為前綴的檢測工具,會公開 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
的已檢測記憶體區塊配置時,Performance Schema 會對記憶體摘要表欄位進行以下更新
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
是新的最大值,則增加
當已檢測的記憶體區塊解除配置時,Performance Schema 會對記憶體摘要表欄位進行以下更新
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
是較低的估計值。Performance Schema 報告的值保證小於或等於執行階段實際使用的最低計數或記憶體大小。HIGH_COUNT_USED
和HIGH_NUMBER_OF_BYTES_USED
是較高的估計值。Performance Schema 報告的值保證大於或等於執行階段實際使用的最高計數或記憶體大小。
對於 memory_summary_global_by_event_name
以外的摘要表中的較低估計值,如果記憶體所有權在執行緒之間轉移,則值可能會變為負數。
以下是估計值計算範例;但請注意,估計值實作可能會變更
執行緒 1 在執行期間使用的記憶體範圍為 1MB 到 2MB,如 memory_summary_by_thread_by_event_name
表的 LOW_NUMBER_OF_BYTES_USED
和 HIGH_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 之間。
對於容量規劃,報告最差的情況實際上是所需的行為,因為它顯示當工作階段不相關時(通常是這種情況)可能會發生的情況。