本節簡要介紹 Performance Schema,並提供範例說明如何使用它。如需其他範例,請參閱第 29.19 節,「使用 Performance Schema 診斷問題」。
Performance Schema 預設為啟用。若要明確啟用或停用它,請使用設定為適當值的performance_schema
變數啟動伺服器。例如,在伺服器 my.cnf
檔案中使用以下幾行
[mysqld]
performance_schema=ON
當伺服器啟動時,它會看到performance_schema
,並嘗試初始化 Performance Schema。若要驗證是否成功初始化,請使用此陳述式
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
值為 ON
表示 Performance Schema 已成功初始化,且可供使用。值為 OFF
表示發生某些錯誤。請檢查伺服器錯誤記錄檔,以取得有關發生錯誤原因的資訊。
Performance Schema 是以儲存引擎實作,因此您可以在 Information Schema ENGINES
表格或 SHOW ENGINES
陳述式的輸出中看到它
mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE ENGINE='PERFORMANCE_SCHEMA'\G
*************************** 1. row ***************************
ENGINE: PERFORMANCE_SCHEMA
SUPPORT: YES
COMMENT: Performance Schema
TRANSACTIONS: NO
XA: NO
SAVEPOINTS: NO
mysql> SHOW ENGINES\G
...
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
...
PERFORMANCE_SCHEMA
儲存引擎會在 performance_schema
資料庫中的表格上運作。您可以將 performance_schema
設定為預設資料庫,這樣對其表格的參考就不需要以資料庫名稱限定
mysql> USE performance_schema;
Performance Schema 表格儲存在 performance_schema
資料庫中。關於此資料庫及其表格的結構資訊可以透過從 INFORMATION_SCHEMA
資料庫中選取,或使用 SHOW
陳述式來取得,如同其他任何資料庫一樣。例如,使用以下任一陳述式來查看有哪些 Performance Schema 表格
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'performance_schema';
+------------------------------------------------------+
| TABLE_NAME |
+------------------------------------------------------+
| accounts |
| cond_instances |
...
| events_stages_current |
| events_stages_history |
| events_stages_history_long |
| events_stages_summary_by_account_by_event_name |
| events_stages_summary_by_host_by_event_name |
| events_stages_summary_by_thread_by_event_name |
| events_stages_summary_by_user_by_event_name |
| events_stages_summary_global_by_event_name |
| events_statements_current |
| events_statements_history |
| events_statements_history_long |
...
| file_instances |
| file_summary_by_event_name |
| file_summary_by_instance |
| host_cache |
| hosts |
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
| metadata_locks |
| mutex_instances |
| objects_summary_global_by_type |
| performance_timers |
| replication_connection_configuration |
| replication_connection_status |
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| rwlock_instances |
| session_account_connect_attrs |
| session_connect_attrs |
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| socket_instances |
| socket_summary_by_event_name |
| socket_summary_by_instance |
| table_handles |
| table_io_waits_summary_by_index_usage |
| table_io_waits_summary_by_table |
| table_lock_waits_summary_by_table |
| threads |
| users |
+------------------------------------------------------+
mysql> SHOW TABLES FROM performance_schema;
+------------------------------------------------------+
| Tables_in_performance_schema |
+------------------------------------------------------+
| accounts |
| cond_instances |
| events_stages_current |
| events_stages_history |
| events_stages_history_long |
...
隨著額外檢測的實作持續進行,Performance Schema 表格的數量會隨著時間增加。
performance_schema
資料庫的名稱是小寫,其中的表格名稱也是小寫。查詢時應指定小寫名稱。
要查看個別表格的結構,請使用 SHOW CREATE TABLE
。
mysql> SHOW CREATE TABLE performance_schema.setup_consumers\G
*************************** 1. row ***************************
Table: setup_consumers
Create Table: CREATE TABLE `setup_consumers` (
`NAME` varchar(64) NOT NULL,
`ENABLED` enum('YES','NO') NOT NULL,
PRIMARY KEY (`NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
表格結構也可以透過從諸如 INFORMATION_SCHEMA.COLUMNS
之類的表格中選取,或使用諸如 SHOW COLUMNS
之類的陳述式來取得。
performance_schema
資料庫中的表格可以根據其中的資訊類型進行分組:目前事件、事件歷史記錄和摘要、物件實例以及設定(組態)資訊。以下範例說明這些表格的幾種用途。有關每個群組中表格的詳細資訊,請參閱 第 29.12 節「效能架構表格描述」。
最初,並非所有工具和消費者都已啟用,因此效能架構不會收集所有事件。若要開啟所有這些項目並啟用事件計時,請執行兩個陳述式(列數可能因 MySQL 版本而異)
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES';
Query OK, 560 rows affected (0.04 sec)
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES';
Query OK, 10 rows affected (0.00 sec)
若要查看伺服器目前正在執行的作業,請檢查 events_waits_current
表格。它包含每個執行緒的一列,顯示每個執行緒最近監控的事件
mysql> SELECT *
FROM performance_schema.events_waits_current\G
*************************** 1. row ***************************
THREAD_ID: 0
EVENT_ID: 5523
END_EVENT_ID: 5523
EVENT_NAME: wait/synch/mutex/mysys/THR_LOCK::mutex
SOURCE: thr_lock.c:525
TIMER_START: 201660494489586
TIMER_END: 201660494576112
TIMER_WAIT: 86526
SPINS: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
INDEX_NAME: NULL
OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 142270668
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
OPERATION: lock
NUMBER_OF_BYTES: NULL
FLAGS: 0
...
此事件表示執行緒 0 正在等待 86,526 皮秒以取得 THR_LOCK::mutex
的鎖定,這是 mysys
子系統中的互斥鎖。前幾個欄位提供以下資訊
ID 欄位表示事件來自哪個執行緒和事件編號。
EVENT_NAME
表示已檢測的內容,而SOURCE
表示哪個原始程式碼檔案包含已檢測的程式碼。計時器欄位顯示事件開始和停止的時間以及所花費的時間。如果事件仍在進行中,則
TIMER_END
和TIMER_WAIT
值為NULL
。計時器值是近似值,並以皮秒表示。有關計時器和事件時間收集的資訊,請參閱 第 29.4.1 節「效能架構事件計時」。
歷史記錄表格包含與目前事件表格相同種類的列,但具有更多列,並顯示伺服器最近所執行的作業,而不是目前所執行的作業。events_waits_history
和 events_waits_history_long
表格分別包含每個執行緒最近的 10 個事件和最近的 10,000 個事件。例如,若要查看執行緒 13 產生的最近事件資訊,請執行以下操作
mysql> SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
FROM performance_schema.events_waits_history
WHERE THREAD_ID = 13
ORDER BY EVENT_ID;
+----------+-----------------------------------------+------------+
| EVENT_ID | EVENT_NAME | TIMER_WAIT |
+----------+-----------------------------------------+------------+
| 86 | wait/synch/mutex/mysys/THR_LOCK::mutex | 686322 |
| 87 | wait/synch/mutex/mysys/THR_LOCK_malloc | 320535 |
| 88 | wait/synch/mutex/mysys/THR_LOCK_malloc | 339390 |
| 89 | wait/synch/mutex/mysys/THR_LOCK_malloc | 377100 |
| 90 | wait/synch/mutex/sql/LOCK_plugin | 614673 |
| 91 | wait/synch/mutex/sql/LOCK_open | 659925 |
| 92 | wait/synch/mutex/sql/THD::LOCK_thd_data | 494001 |
| 93 | wait/synch/mutex/mysys/THR_LOCK_malloc | 222489 |
| 94 | wait/synch/mutex/mysys/THR_LOCK_malloc | 214947 |
| 95 | wait/synch/mutex/mysys/LOCK_alarm | 312993 |
+----------+-----------------------------------------+------------+
當新事件新增至歷史記錄表格時,如果表格已滿,則會捨棄較舊的事件。
摘要表格提供一段時間內所有事件的彙總資訊。此群組中的表格會以不同的方式摘要事件資料。若要查看哪個工具執行次數最多或佔用最多的等待時間,請根據 COUNT_STAR
或 SUM_TIMER_WAIT
欄位排序 events_waits_summary_global_by_event_name
表格,這些欄位分別對應於 COUNT(*)
或 SUM(TIMER_WAIT)
值,這些值是針對所有事件計算得出的。
mysql> SELECT EVENT_NAME, COUNT_STAR
FROM performance_schema.events_waits_summary_global_by_event_name
ORDER BY COUNT_STAR DESC LIMIT 10;
+---------------------------------------------------+------------+
| EVENT_NAME | COUNT_STAR |
+---------------------------------------------------+------------+
| wait/synch/mutex/mysys/THR_LOCK_malloc | 6419 |
| wait/io/file/sql/FRM | 452 |
| wait/synch/mutex/sql/LOCK_plugin | 337 |
| wait/synch/mutex/mysys/THR_LOCK_open | 187 |
| wait/synch/mutex/mysys/LOCK_alarm | 147 |
| wait/synch/mutex/sql/THD::LOCK_thd_data | 115 |
| wait/io/file/myisam/kfile | 102 |
| wait/synch/mutex/sql/LOCK_global_system_variables | 89 |
| wait/synch/mutex/mysys/THR_LOCK::mutex | 89 |
| wait/synch/mutex/sql/LOCK_open | 88 |
+---------------------------------------------------+------------+
mysql> SELECT EVENT_NAME, SUM_TIMER_WAIT
FROM performance_schema.events_waits_summary_global_by_event_name
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
+----------------------------------------+----------------+
| EVENT_NAME | SUM_TIMER_WAIT |
+----------------------------------------+----------------+
| wait/io/file/sql/MYSQL_LOG | 1599816582 |
| wait/synch/mutex/mysys/THR_LOCK_malloc | 1530083250 |
| wait/io/file/sql/binlog_index | 1385291934 |
| wait/io/file/sql/FRM | 1292823243 |
| wait/io/file/myisam/kfile | 411193611 |
| wait/io/file/myisam/dfile | 322401645 |
| wait/synch/mutex/mysys/LOCK_alarm | 145126935 |
| wait/io/file/sql/casetest | 104324715 |
| wait/synch/mutex/sql/LOCK_plugin | 86027823 |
| wait/io/file/sql/pid | 72591750 |
+----------------------------------------+----------------+
這些結果顯示 THR_LOCK_malloc
互斥鎖是「熱點」,無論是在其使用頻率和執行緒嘗試取得它所等待的時間長度方面都是如此。
THR_LOCK_malloc
互斥鎖僅在偵錯組建中使用。在生產組建中,它不是熱點,因為它不存在。
實例表格記錄已檢測的物件類型。當伺服器使用已檢測的物件時,它會產生事件。這些表格提供事件名稱和說明註解或狀態資訊。例如,file_instances
表格會列出檔案 I/O 作業的工具實例及其關聯的檔案
mysql> SELECT *
FROM performance_schema.file_instances\G
*************************** 1. row ***************************
FILE_NAME: /opt/mysql-log/60500/binlog.000007
EVENT_NAME: wait/io/file/sql/binlog
OPEN_COUNT: 0
*************************** 2. row ***************************
FILE_NAME: /opt/mysql/60500/data/mysql/tables_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
*************************** 3. row ***************************
FILE_NAME: /opt/mysql/60500/data/mysql/columns_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
...
設定表格用於設定和顯示監控特性。例如,setup_instruments
會列出可以收集事件的工具集,並顯示其中哪些已啟用
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments;
+---------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+---------------------------------------------------+---------+-------+
...
| stage/sql/end | NO | NO |
| stage/sql/executing | NO | NO |
| stage/sql/init | NO | NO |
| stage/sql/insert | NO | NO |
...
| statement/sql/load | YES | YES |
| statement/sql/grant | YES | YES |
| statement/sql/check | YES | YES |
| statement/sql/flush | YES | YES |
...
| wait/synch/mutex/sql/LOCK_global_read_lock | YES | YES |
| wait/synch/mutex/sql/LOCK_global_system_variables | YES | YES |
| wait/synch/mutex/sql/LOCK_lock_db | YES | YES |
| wait/synch/mutex/sql/LOCK_manager | YES | YES |
...
| wait/synch/rwlock/sql/LOCK_grant | YES | YES |
| wait/synch/rwlock/sql/LOGGER::LOCK_logger | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_connect | YES | YES |
| wait/synch/rwlock/sql/LOCK_sys_init_slave | YES | YES |
...
| wait/io/file/sql/binlog | YES | YES |
| wait/io/file/sql/binlog_index | YES | YES |
| wait/io/file/sql/casetest | YES | YES |
| wait/io/file/sql/dbopt | YES | YES |
...
若要了解如何解讀工具名稱,請參閱 第 29.6 節「效能架構工具命名慣例」。
若要控制是否為工具收集事件,請將其 ENABLED
值設定為 YES
或 NO
。例如
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'NO'
WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';
效能架構會使用收集到的事件來更新 performance_schema
資料庫中的表格,這些表格會作為事件資訊的「消費者」。setup_consumers
表格會列出可用的消費者以及哪些已啟用
mysql> SELECT * FROM performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_cpu | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | YES |
| events_transactions_history | YES |
| events_transactions_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+
若要控制效能架構是否維護消費者作為事件資訊的目的地,請設定其 ENABLED
值。
有關設定表格以及如何使用它們來控制事件收集的詳細資訊,請參閱 第 29.4.2 節「效能架構事件篩選」。
有些雜項表格不屬於任何先前的群組。例如,performance_timers
會列出可用的事件計時器及其特性。有關計時器的資訊,請參閱 第 29.4.1 節「效能架構事件計時」。