25.1 性能架构快速入门
本节简要介绍性能模式,并提供示例说明如何使用它。有关其他示例,请参见第 25.19 节“使用性能模式诊断问题”。
默认情况下,性能模式处于启用状态。要显式启用或禁用它,请在performance_schema变量设置为适当值的情况下启动服务器。例如,在服务器my.cnf
文件中使用以下行:
[mysqld]
performance_schema=ON
服务器启动时,它会看到performance_schema并尝试初始化性能架构。要验证初始化是否成功,请使用以下语句:
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
值ON
table 示性能模式已成功初始化并且可以使用。值OFF
table 示发生了一些错误。检查服务器错误日志,以获取有关发生问题的信息。
性能架构被实现为存储引擎。如果此引擎可用(您应该早先已经检查过),则应该在INFORMATION_SCHEMA.ENGINEStable 或SHOW ENGINES语句的输出中看到它的SUPPORT
值为YES
列出:
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
数据库中的 table 上运行。您可以将performance_schema
设置为默认数据库,从而不必使用数据库名称来限定对其 table 的引用:
mysql> USE performance_schema;
性能架构 table 存储在performance_schema
数据库中。与任何其他数据库一样,可以通过从INFORMATION_SCHEMA
数据库中选择或使用SHOW语句来获取有关此数据库及其 table 的结构的信息。例如,使用以下任一语句来查看存在哪些性能模式 table:
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 |
| setup_timers |
| 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 |
...
随着实施其他工具的进行,性能架构 table 的数量会随着时间增加。
performance_schema
数据库的名称是小写字母,其中的 table 名称也是小写字母。查询应以小写形式指定名称。
要查看各个 table 的结构,请使用显示创建 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
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
通过从诸如INFORMATION_SCHEMA.COLUMNS之类的 table 中进行选择或使用诸如SHOW COLUMNS之类的语句,也可以使用 table 结构。
可以根据performance_schema
数据库中的信息类型对 table 进行分组:当前事件,事件历史记录和摘要,对象实例以及设置(配置)信息。以下示例说明了这些 table 的一些用法。有关每个组中 table 格的详细信息,请参见第 25.12 节“性能模式 table 说明”。
最初,并非所有工具和使用者都已启用,因此性能架构不会收集所有事件。要打开所有这些功能并启用事件计时,请执行两个语句(行数可能因 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_currenttable。每个线程包含一行,显示每个线程的最新监视事件:
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
...
此事件 table 明线程 0 正在 await86,526 皮秒来获取THR_LOCK::mutex
(mysys
子系统中的互斥锁)上的锁。前几列提供以下信息:
-
ID 列指示事件来自哪个线程以及事件编号。
-
EVENT_NAME
指示要检测的内容,而SOURCE
指示哪个源文件包含检测的代码。 -
计时器列显示事件何时开始和停止以及花费了多长时间。如果事件仍在进行中,则
TIMER_END
和TIMER_WAIT
的值为NULL
。计时器值是近似值,以皮秒 table 示。有关计时器和事件时间收集的信息,请参见第 25.4.1 节“性能架构事件计时”。
历史记录 table 包含与当前事件 table 相同的行,但是具有更多行,并显示服务器“最近”而不是“当前”正在做什么。 events_waits_history和events_waits_history_longtable 分别包含每个线程最近的 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 |
+----------+-----------------------------------------+------------+
当新事件添加到历史 table 中时,如果 table 已满,则旧事件将被丢弃。
摘要 table 提供了一段时间内所有事件的汇总信息。该组中的 table 以不同的方式总结了事件数据。若要查看执行次数最多或 await 时间最多的工具,请对COUNT_STAR
或SUM_TIMER_WAIT
列上的events_waits_summary_global_by_event_nametable 进行排序,这两个 table 分别对应于针对所有事件计算的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 |
+----------------------------------------+----------------+
这些结果 table 明,THR_LOCK_malloc
互斥锁在使用频率和线程 await 尝试获取它的时间上都是“热”的。
Note
THR_LOCK_malloc
互斥锁仅在调试版本中使用。在生产环境中,它不存在,因为它不存在。
实例 table 记录了要检测的对象的类型。服务器使用检测对象时,将产生一个事件。这些 table 提供事件名称和说明性 Comments 或状态信息。例如,file_instancestable 列出了用于文件 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
...
设置 table 用于配置和显示监视特性。例如,setup_instruments列出了可以为其收集事件的一组工具,并显示了启用了哪些工具:
mysql> SELECT * 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 |
...
要了解如何解释乐器名称,请参阅第 25.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
数据库中的 table,该 table 充当事件信息的“Consumer”。 setup_consumerstable 列出了可用的使用者和已启用的使用者:
mysql> SELECT * FROM performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | NO |
| events_transactions_history | NO |
| 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
值。
有关设置 table 以及如何使用它们控制事件收集的更多信息,请参见第 25.4.2 节“性能模式事件过滤”。
有些杂项 table 不属于前面的任何组。例如,performance_timers列出了可用的事件计时器及其 Feature。有关计时器的信息,请参见第 25.4.1 节“性能架构事件计时”。