-
Notifications
You must be signed in to change notification settings - Fork 111
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?因为在线程中做的事情会涉及到这些):
- 如果要启用线程类对象的instruments和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'的。如果要执行更精细的匹配(例如仅对某些前台线程进行监视),那就必须要对该表中的默认值进行修改,如下:
- 示例,假如setup_actors表中有如下HOST和USER值:
# 首先使用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
- 对于后台线程,对setup_actors表的修改不生效,如果要干预后台线程默认的设置,需要查询threads表找到相应的线程,然后使用UPDATE语句直接修改threads表中的INSTRUMENTED和HISTORY列值
- setup_actors表字段详解见3.1.1. 小节
- 参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-thread-filtering.html
上一篇: Pre Filtering by objects | 下一篇: Pre Filtering by consumers
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!