文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 Performance Schema  /  Performance Schema 狀態監控

29.7 Performance Schema 狀態監控

有幾個與 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_lost 表示有多少 xxx 類型的儀器無法載入。

  • Performance_schema_xxx_instances_lost 表示有多少 xxx 類型的物件執行個體無法建立。

  • Performance_schema_xxx_handles_lost 表示有多少 xxx 類型的物件執行個體無法開啟。

  • 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 收集(部分)資料。

當伺服器無法建立互斥鎖儀器時,會發生以下結果

剛才描述的模式適用於所有類型的儀器,而不僅僅是互斥鎖。

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_deletesetup_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 語句”