MySQL 8.0.22 版本,show processlist 从 performance_schema 获取信息

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/

文章评论

0条评论