Skip to content

Pre Filtering by threads

xiaoboluo768 edited this page Jun 8, 2020 · 4 revisions
  • 本小节主要讲解按照线程过滤进行配置
  • theads表包含了mysql server的所有线程相关的一些信息(包括后台线程和前台线程),每行数据中包含了是否启用对这个线程的监视配置值(threads.INSTRUMENTED)、是否启用这个线程历史事件的记录配置值(threads.HISTORY)等信息。因此,对于线程类对象的监控,除了setup_instruments表中需要开启线程类对象对应的instruments、setup_consumers表中需要开启线程类对象对应的consumers、setup_actors表中允许某个用户、主机的连接(只针对前台线程)之外,还需要看该表中这个线程的配置项(threads.INSTRUMENTED与threads.HISTORY)是否设置为YES,默认值都为YES,因此:
    • 如果要启用线程类对象的instruments和consumers,需要满足如下配置:
      • setup_consumers表中的thread_instrumentation配置项必须为YES
      • threads表中的INSTRUMENTED配置项必须为YES
      • 在setup_instruments表中线程类的配置项需要设置为YES,如,语句select * from setup_instruments where name like '%thread%';能匹配到的配置项
    • 如果要启用线程类对象的历史事件记录,需要满足如下配置:
      • 在threads表中,对应线程配置行的HISTORY配置项必须为YES
      • 在setup_instruments表中线程类的配置项需要设置为YES,如,语句select * from setup_instruments where name like '%thread%';能匹配到的配置项
      • 在setup_consumers表中,需要开启对应的consumers(这包括wait events,stage events,statement events和transaction events,为什么会包含这么多consumers?因为在线程中做的事情会涉及到这些):
admin@localhost : performance_schema 10:11:43> select * from setup_consumers where name like '%history%';
+----------------------------------+---------+
| NAME                             | ENABLED |
+----------------------------------+---------+
| events_stages_history            | NO      |
| events_stages_history_long       | NO      |
| events_statements_history        | YES     |
| events_statements_history_long   | NO      |
| events_transactions_history      | NO      |
| events_transactions_history_long | NO      |
| events_waits_history             | NO      |
| events_waits_history_long        | NO      |
+----------------------------------+---------+
8 rows in set (0.00 sec)
  • 线程类对象,前台线程与后台线程还有少许差别
    • 对于前台线程(由客户端连接产生的连接,可以是用户发起的连接,也可以是不同server之间发起的连接),当用户或者其他server与某个server创建了一个连接之后(连接方式可能是socket或者TCP/IP),在threads表中就会记录一条这个线程的配置信息行,此时,threads表中该线程的配置行中的INSTRUMENTED和HISTORY列值的默认值是YES还是NO,还需要看与线程相关联的用户帐户是否匹配setup_actors表中的配置行(查看某用户在setup_actors表中配置行的ENABLED和HISTORY列配置为YES还是NO,threads表中与setup_actors表关联用户帐号的线程配置行中的ENABLED和HISTORY列值以setup_actors表中的值为准)
    • 对于后台线程,不可能存在关联的用户,所以threads表中的 INSTRUMENTED和HISTORY在线程创建时的初始配置列值默认值为YES,不需要查看setup_actors表
    • 关于前台线程在setup_actors表中的默认配置示例如下:
# setup_actors表默认预设配置项

admin@localhost : performance_schema 10:43:38> SELECT * FROM setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| %    | %    | %    | YES     | YES     |
+------+------+------+---------+---------+
1 row in set (0.00 sec)


# threads表中前台与后台线程默认的配置如下(注:复制架构中,复制相关的线程在mysql中被归类为前台线程,因为show processlist能够看到且能够使用kill命令进行干预,后台线程被定义为show processlist不可见的线程)
## 前台线程
admin@localhost : performance_schema 11:13:14> select * from threads where PROCESSLIST_USER is not null;
+-----------+---------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+---------------------------------------------------------------+----------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
| THREAD_ID | NAME                      | TYPE       | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB     | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE                                             | PROCESSLIST_INFO                                         | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID |
+-----------+---------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+---------------------------------------------------------------+----------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
|        45 | thread/sql/one_connection | FOREGROUND |              3 | qfsys            | 10.10.20.16      | NULL               | Binlog Dump         |             6384 | Master has sent all binlog to slave; waiting for more updates | NULL                                                     |                1 | NULL | YES          | YES     | TCP/IP          |         3658 |
|        46 | thread/sql/one_connection | FOREGROUND |              4 | qfsys            | 10.10.20.15      | NULL               | Binlog Dump GTID    |             6336 | Master has sent all binlog to slave; waiting for more updates | NULL                                                     |                1 | NULL | YES          | YES     | TCP/IP          |         3660 |
|        47 | thread/sql/one_connection | FOREGROUND |              5 | admin            | localhost        | performance_schema | Query               |                0 | Sending data                                                  | select * from threads where PROCESSLIST_USER is not null |                1 | NULL | YES          | YES     | Socket          |         3722 |
|        48 | thread/sql/one_connection | FOREGROUND |              6 | admin            | 10.10.20.15      | NULL               | Sleep               |             3228 | NULL                                                          | NULL                                                     |                1 | NULL | YES          | YES     | TCP/IP          |         3775 |
+-----------+---------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+---------------------------------------------------------------+----------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
4 rows in set (0.00 sec)

## 后台线程
admin@localhost : performance_schema 11:13:10> select * from threads where PROCESSLIST_USER is null group by name;
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+
| THREAD_ID | NAME                                   | TYPE       | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+
|        41 | thread/innodb/buf_dump_thread          | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3631 |
|        40 | thread/innodb/dict_stats_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3632 |
|         3 | thread/innodb/io_ibuf_thread           | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3591 |
|         4 | thread/innodb/io_log_thread            | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3592 |
|         5 | thread/innodb/io_read_thread           | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3594 |
|        11 | thread/innodb/io_write_thread          | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3601 |
|        29 | thread/innodb/page_cleaner_thread      | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3617 |
|        33 | thread/innodb/srv_error_monitor_thread | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3624 |
|        32 | thread/innodb/srv_lock_timeout_thread  | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3623 |
|        35 | thread/innodb/srv_master_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3626 |
|        34 | thread/innodb/srv_monitor_thread       | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3625 |
|        38 | thread/innodb/srv_purge_thread         | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3627 |
|        36 | thread/innodb/srv_worker_thread        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3628 |
|        43 | thread/sql/compress_gtid_table         | FOREGROUND |              1 | NULL             | NULL             | NULL           | Daemon              |             6301 | Suspending        | NULL             |                1 | NULL | YES          | YES     | NULL            |         3636 |
|         1 | thread/sql/main                        | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             6301 | NULL              | NULL             |             NULL | NULL | YES          | YES     | NULL            |         3515 |
|        42 | thread/sql/signal_handler              | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |                1 | NULL | YES          | YES     | NULL            |         3635 |
|         2 | thread/sql/thread_timer_notifier       | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL              | NULL             |                1 | NULL | YES          | YES     | NULL            |         3590 |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+
17 rows in set (0.00 sec)
  • setup_actors表字段含义

    • HOST和USER列表示配置项生效的主机或用户名名,可以使用具体的名称字符串或“%”
    • ENABLED和HISTORY列表示是否启用该线程类对象的instruments和历史事件日志记录,具体是否生效还需要看其他相关配置表,前面已经提到过了
    • ROLE列暂未使用
  • 当一个前台线程初始化连接mysql server时,performance_schema对表setup_actors执行查询,在表中查找每个配置行,首先尝试使用USER和HOST列(ROLE未使用)依次找出匹配的配置行,然后再找出最佳匹配行并读取匹配行的ENABLED和HISTORY列值,用于填充threads表中的ENABLED和HISTORY列值。

    • 示例,假如setup_actors表中有如下HOST和USER值:
      • USER ='literal' and HOST ='literal'
      • USER ='literal' and HOST ='%'
      • USER ='%' and HOST ='literal'
      • USER ='%' and HOST ='%'
    • 匹配顺序很重要,因为不同的匹配行可能具有不同的USER和HOST值(mysql中对于用户帐号是使用user@host进行区分的),根据匹配行的ENABLED和HISTORY列值来决定对每个HOST,USER或ACCOUNT(USER和HOST组合,如:user@host)对应的线程在threads表中生成对应的匹配行的ENABLED和HISTORY列值 ,以便决定是否启用相应的instruments和历史事件记录,类似如下:
      • 当在setup_actors表中的最佳匹配行的ENABLED = YES时,threads表中对应线程的配置行中INSTRUMENTED列值将变为YES,HISTORY 列同理
      • 当在setup_actors表中的最佳匹配行的ENABLED = NO时,threads表中对应线程的配置行中INSTRUMENTED列值将变为NO,HISTORY 列同理
      • 当在setup_actors表中找不到匹配时,threads表中对应线程的配置行中INSTRUMENTED和HISTORY值值将变为NO
      • setup_actors表配置行中的ENABLED和HISTORY列值可以相互独立设置为YES或NO,互不影响,一个是是否启用线程对应的instruments,一个是是否启用线程相关的历史事件记录的consumers
    • 默认情况下,所有新的前台线程启用instruments和历史事件收集,因为setup_actors表中的预设值是host='%',user='%',ENABLED='YES',HISTORY='YES'的。如果要执行更精细的匹配(例如仅对某些前台线程进行监视),那就必须要对该表中的默认值进行修改,如下:
# 首先使用UPDATE语句把默认配置行禁用
UPDATE setup_actors SET ENABLED = 'NO', HISTORY = 'NO' WHERE HOST = '%' AND USER = '%';

# 插入用户joe@'localhost'对应ENABLED和HISTORY都为YES的配置行
INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('localhost','joe','%','YES','YES');

# 插入用户joe@'hosta.example.com'对应ENABLED=YES、HISTORY=NO的配置行
INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('hosta.example.com','joe','%','YES','NO');

# 插入用户sam@'%'对应ENABLED=NO、HISTORY=YES的配置行
INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('%','sam','%','NO','YES');

# 此时,threads表中对应用户的前台线程配置行中INSTRUMENTED和HISTORY列生效值如下
## 当joe从localhost连接到mysql server时,则连接符合第一个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED和HISTORY列值变为YES
## 当joe从hosta.example.com连接到mysql server时,则连接符合第二个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED列值为YES,HISTORY列值为NO
## 当joe从其他任意主机(%匹配除了localhost和hosta.example.com之外的主机)连接到mysql server时,则连接符合第三个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED和HISTORY列值变为NO
## 当sam从任意主机(%匹配)连接到mysql server时,则连接符合第三个INSERT语句插入的配置行,threads表中对应配置行的INSTRUMENTED列值变为NO,HISTORY列值为YES
## 除了joe和sam用户之外,其他任何用户从任意主机连接到mysql server时,匹配到第一个UPDATE语句更新之后的默认配置行,threads表中对应配置行的INSTRUMENTED和HISTORY列值变为NO
## 如果把UPDATE语句改成DELETE,让未明确指定的用户在setup_actors表中找不到任何匹配行,则threads表中对应配置行的INSTRUMENTED和HISTORY列值变为NO

上一篇: Pre Filtering by objects | 下一篇: Pre Filtering by consumers

Clone this wiki locally