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 節,「效能綱要連線表」。
記憶體檢測在 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
:增加 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
為新的最大值,則增加
當解除配置已檢測的記憶體區塊時,效能綱要會對記憶體摘要表欄位進行以下更新
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
為較低的估計值。效能綱要回報的值保證小於或等於執行時實際使用的最低計數或記憶體大小。HIGH_COUNT_USED
和HIGH_NUMBER_OF_BYTES_USED
為較高的估計值。效能綱要回報的值保證大於或等於執行時實際使用的最高計數或記憶體大小。
對於 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 之間。
對於容量規劃而言,回報最壞的情況實際上是預期的行為,因為它顯示當會話彼此不相關時可能發生的情況,而這通常是這種情況。