1. 引言
对于 MySQL DBA 来说,show processlist 命令非常有名并且经常使用,这个命令能够帮助了解正在执行的线程及其当前状态信息。默认条件下,show processlist 命令的输出结果是从线程管理器(thread manager)那里获取的,在获取的时候,需要先拿到一把全局互斥锁,在系统繁忙时,这会对性能产生较大的影响。从 MySQL 8.0.22 版本开始,提供了另外一种方案,从 performance_schema 里面获取正在执行的线程信息,并且这种方案不需要全局互斥锁。
2. show processlist 从线程管理器获取信息(默认)
- 默认情况下,show processlist 从线程管理器(thread manager)获取线程信息,这是默认的配置
- 在实现上,需要获取一个全局互斥锁
- 对性能有负面影响,尤其是对繁忙系统的影响非常严重
- information_schema.processlist 表也是通过线程管理器来获取信息
- mysqladmin processlist 同样也是通过线程管理器来获取信息
3. show processlist 从 performance_schema 获取信息
- MySQL 8.0.22 版本支持 show processlist 从 performance_schema 获取信息
- 从 performance_schema.processlist 表获取线程信息
- 不需要全局互斥锁
- 在繁忙的系统中执行 show processlist,不会产生性能影响
- mysqladmin processlist 同样也是通过 performance_schema.processlist 表获取信息
下面 3 个语句效果一样:
- show full processlist;
- select * from performance_schema.processlist;
- mysqladmin processlist --verbose
4. information_schema 和 performance_schema 表结构变化
mysql> desc performance_schema.processlist;
+---------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------+------+-----+---------+-------+
| ID | bigint unsigned | NO | PRI | NULL | |
| USER | varchar(32) | YES | | NULL | |
| HOST | varchar(255) | YES | | NULL | |
| DB | varchar(64) | YES | | NULL | |
| COMMAND | varchar(16) | YES | | NULL | |
| TIME | bigint | YES | | NULL | |
| STATE | varchar(64) | YES | | NULL | |
| INFO | longtext | YES | | NULL | |
+---------+-----------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> desc information_schema.processlist;
+---------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------+------+-----+---------+-------+
| ID | bigint unsigned | NO | | | |
| USER | varchar(32) | NO | | | |
| HOST | varchar(261) | NO | | | |
| DB | varchar(64) | YES | | | |
| COMMAND | varchar(16) | NO | | | |
| TIME | int | NO | | | |
| STATE | varchar(64) | YES | | | |
| INFO | varchar(65535) | YES | | | |
+---------+-----------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
5. 开启 performance_schema.processlist
- 确保 MySQL 启动时,应设置参数 PERFORMANCE_SCHEMA=ON
- 确保 MySQL 编译配置时,线程监控相关的组件功能是打开的
另外,MySQL 还提供一个参数 performance_schema_show_processlist 来动态打开或关闭该特性。如果该参数设置为 ON,则 show processlist 从 performance_schema.processlist 获取信息,否则从线程管理器获取。
为了避免某些线程信息或状态被忽略,应当同时设置以下参数为默认值 -1 。
- performance_schema_max_thread_instances=-1
- performance_schema_max_thread_classes=-1
- performance_schema_max_stage_classes=-1
本文译自:
https://www.percona.com/blog/2021/01/15/mysql-8-0-22-show-processlist-version-2-now-available-from-performance_schema/