有幾個與 Performance Schema 相關的狀態變數
mysql> SHOW STATUS LIKE 'perf%';
+-----------------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------------+-------+
| Performance_schema_accounts_lost | 0 |
| Performance_schema_cond_classes_lost | 0 |
| Performance_schema_cond_instances_lost | 0 |
| Performance_schema_digest_lost | 0 |
| Performance_schema_file_classes_lost | 0 |
| Performance_schema_file_handles_lost | 0 |
| Performance_schema_file_instances_lost | 0 |
| Performance_schema_hosts_lost | 0 |
| Performance_schema_locker_lost | 0 |
| Performance_schema_memory_classes_lost | 0 |
| Performance_schema_metadata_lock_lost | 0 |
| Performance_schema_mutex_classes_lost | 0 |
| Performance_schema_mutex_instances_lost | 0 |
| Performance_schema_nested_statement_lost | 0 |
| Performance_schema_program_lost | 0 |
| Performance_schema_rwlock_classes_lost | 0 |
| Performance_schema_rwlock_instances_lost | 0 |
| Performance_schema_session_connect_attrs_lost | 0 |
| Performance_schema_socket_classes_lost | 0 |
| Performance_schema_socket_instances_lost | 0 |
| Performance_schema_stage_classes_lost | 0 |
| Performance_schema_statement_classes_lost | 0 |
| Performance_schema_table_handles_lost | 0 |
| Performance_schema_table_instances_lost | 0 |
| Performance_schema_thread_classes_lost | 0 |
| Performance_schema_thread_instances_lost | 0 |
| Performance_schema_users_lost | 0 |
+-----------------------------------------------+-------+
Performance Schema 狀態變數提供有關因記憶體限制而無法載入或建立的檢測資訊。這些變數的名稱有多種形式
Performance_schema_
表示有多少xxx
_classes_lostxxx
類型的儀器無法載入。Performance_schema_
表示有多少xxx
_instances_lostxxx
類型的物件執行個體無法建立。Performance_schema_
表示有多少xxx
_handles_lostxxx
類型的物件執行個體無法開啟。Performance_schema_locker_lost
表示有多少事件「遺失」或未記錄。
例如,如果在伺服器原始碼中檢測了一個互斥鎖,但伺服器在執行階段無法為檢測配置記憶體,它會遞增 Performance_schema_mutex_classes_lost
。互斥鎖仍然作為同步物件運作(也就是說,伺服器會繼續正常運作),但不會收集它的效能資料。如果可以配置儀器,則可用於初始化檢測的互斥鎖執行個體。對於單例互斥鎖(例如全域互斥鎖),只有一個執行個體。其他互斥鎖在每個連線,或在各種快取和資料緩衝區的每個頁面中都有一個執行個體,因此執行個體的數量會隨著時間而變化。增加最大連線數或某些緩衝區的最大大小會增加可能一次配置的最大執行個體數。如果伺服器無法建立給定的檢測互斥鎖執行個體,它會遞增 Performance_schema_mutex_instances_lost
。
假設以下條件成立
伺服器啟動時使用了
--performance_schema_max_mutex_classes=200
選項,因此有空間容納 200 個互斥鎖儀器。已載入 150 個互斥鎖儀器。
名為
plugin_a
的外掛程式包含 40 個互斥鎖儀器。名為
plugin_b
的外掛程式包含 20 個互斥鎖儀器。
伺服器根據外掛程式需要多少以及有多少可用來為外掛程式配置互斥鎖儀器,如下列陳述式序列所示
INSTALL PLUGIN plugin_a
伺服器現在有 150+40 = 190 個互斥鎖儀器。
UNINSTALL PLUGIN plugin_a;
伺服器仍然有 190 個儀器。外掛程式程式碼產生的所有歷史資料仍然可用,但不收集儀器的新事件。
INSTALL PLUGIN plugin_a;
伺服器偵測到已定義 40 個儀器,因此不會建立新的儀器,並且會重複使用先前指派的內部記憶體緩衝區。伺服器仍有 190 個儀器。
INSTALL PLUGIN plugin_b;
伺服器還有 200-190 = 10 個儀器(在本例中為互斥鎖類別)的空間,並發現外掛程式包含 20 個新的儀器。載入了 10 個儀器,並丟棄或「遺失」了 10 個。 Performance_schema_mutex_classes_lost
指示遺失的儀器(互斥鎖類別)數量
mysql> SHOW STATUS LIKE "perf%mutex_classes_lost";
+---------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------+-------+
| Performance_schema_mutex_classes_lost | 10 |
+---------------------------------------+-------+
1 row in set (0.10 sec)
儀器功能仍然有效,並為 plugin_b
收集(部分)資料。
當伺服器無法建立互斥鎖儀器時,會發生以下結果
不會將儀器的列插入
setup_instruments
資料表中。Performance_schema_mutex_instances_lost
不會變更。(當未建立互斥鎖儀器時,它無法用於稍後建立儀器化的互斥鎖實例。)
剛才描述的模式適用於所有類型的儀器,而不僅僅是互斥鎖。
Performance_schema_mutex_classes_lost
的值大於 0 會在兩種情況下發生
為了節省少量記憶體,您可以使用
--performance_schema_max_mutex_classes=
啟動伺服器,其中N
N
小於預設值。選擇預設值是為了足以載入 MySQL 發行版中提供的所有外掛程式,但是如果從未載入某些外掛程式,則可以減少此值。例如,您可能會選擇不載入發行版中的某些儲存引擎。您載入了針對效能架構進行儀器化的第三方外掛程式,但在啟動伺服器時,未考慮外掛程式的儀器記憶體需求。由於它來自第三方,因此在為
performance_schema_max_mutex_classes
選擇的預設值中,未將此引擎的儀器記憶體消耗考慮在內。如果伺服器的外掛程式儀器資源不足,並且您沒有使用
--performance_schema_max_mutex_classes=
明確分配更多資源,則載入外掛程式會導致儀器資源不足。N
如果為 performance_schema_max_mutex_classes
選擇的值太小,則錯誤日誌中不會報告任何錯誤,並且在執行時也不會發生任何故障。但是,performance_schema
資料庫中的資料表內容會遺漏事件。 Performance_schema_mutex_classes_lost
狀態變數是唯一可見的跡象,表明由於無法建立儀器,因此在內部丟棄了一些事件。
如果儀器沒有遺失,則效能架構會知道它,並且會在儀器化實例時使用它。例如,wait/synch/mutex/sql/LOCK_delete
是 setup_instruments
資料表中互斥鎖儀器的名稱。當在程式碼中(在 THD::LOCK_delete
中)建立互斥鎖時,會使用此單個儀器,但是隨著伺服器的執行,需要許多互斥鎖的實例。在這種情況下,LOCK_delete
是一個每個連線 (THD
) 的互斥鎖,因此如果伺服器有 1000 個連線,則有 1000 個執行緒,以及 1000 個儀器化的 LOCK_delete
互斥鎖實例 (THD::LOCK_delete
)。
如果伺服器沒有空間容納所有這 1000 個儀器化的互斥鎖(實例),則會建立一些帶有儀器化的互斥鎖,而另一些則會在沒有儀器化的情況下建立。如果伺服器只能建立 800 個實例,則會遺失 200 個實例。伺服器將繼續執行,但是 Performance_schema_mutex_instances_lost
會增加 200,以表示無法建立實例。
當程式碼在執行時初始化比為 --performance_schema_max_mutex_instances=
分配的互斥鎖多的時候,可能會發生 N
Performance_schema_mutex_instances_lost
的值大於 0 的情況。
最重要的是,如果 SHOW STATUS LIKE 'perf%'
顯示沒有遺失任何東西(所有值均為零),則效能架構資料是準確的,並且可以依賴。如果遺失了一些東西,則資料不完整,並且由於分配的記憶體不足,效能架構無法記錄所有內容。在這種情況下,特定的 Performance_schema_
變數會指出問題區域。xxx
_lost
在某些情況下,可能會導致故意儀器資源不足。例如,如果您不關心檔案 I/O 的效能資料,則可以啟動伺服器,並將與檔案 I/O 相關的所有效能架構參數設定為 0。不會為檔案相關的類別、實例或控制代碼分配任何記憶體,並且所有檔案事件都會遺失。
使用 SHOW ENGINE PERFORMANCE_SCHEMA STATUS
來檢查效能架構程式碼的內部運作
mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS\G
...
*************************** 3. row ***************************
Type: performance_schema
Name: events_waits_history.size
Status: 76
*************************** 4. row ***************************
Type: performance_schema
Name: events_waits_history.count
Status: 10000
*************************** 5. row ***************************
Type: performance_schema
Name: events_waits_history.memory
Status: 760000
...
*************************** 57. row ***************************
Type: performance_schema
Name: performance_schema.memory
Status: 26459600
...
此語句旨在幫助 DBA 了解不同的效能架構選項對記憶體需求產生的影響。 有關欄位含義的說明,請參閱第 15.7.7.16 節, “SHOW ENGINE 語句”。