-
Notifications
You must be signed in to change notification settings - Fork 111
threads
xiaoboluo768 edited this page Jun 8, 2020
·
2 revisions
- threads表对于每个server线程生成一行包含线程相关的信息,例如:显示是否启用监视,是否启用历史事件记录功能,如下:
admin@localhost : performance_schema 04:25:55> select * from threads where TYPE='FOREGROUND' limit 2\G;
*************************** 1. row ***************************
THREAD_ID: 43
NAME: thread/sql/compress_gtid_table
TYPE: FOREGROUND
PROCESSLIST_ID: 1
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Daemon
PROCESSLIST_TIME: 27439
PROCESSLIST_STATE: Suspending
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 3652
*************************** 2. row ***************************
THREAD_ID: 45
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 3
PROCESSLIST_USER: qfsys
PROCESSLIST_HOST: 10.10.20.15
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Binlog Dump GTID
PROCESSLIST_TIME: 27382
PROCESSLIST_STATE: Master has sent all binlog to slave; waiting for more updates
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: TCP/IP
THREAD_OS_ID: 3674
2 rows in set (0.00 sec)
-
当performance_schema初始化时,它根据当时存在的线程每个线程生成一行信息记录在threads表中。此后,每新建一个线程在该表中就会新增一行对应线程的记录
-
新线程信息的INSTRUMENTED和HISTORY列值由setup_actors表中的配置决定。有关setup_actors表的详细信息参见3.1.1. setup_actors小节
-
当某个线程结束时,会从threads表中删除对应行。对于与客户端会话关联的线程,当会话结束时会删除threads表中与客户端会话关联的线程配置信息行。如果客户端自动重新连接,则也相当于断开一次(会删除断开连接的配置行)再重新创建新的连接,两次连接创建的PROCESSLIST_ID值不同。新线程初始INSTRUMENTED和HISTORY值可能与断开之前的线程初始INSTRUMENTED和HISTORY值不同:setup_actors表在此期间可能已更改,并且如果一个线程在创建之后,后续再修改了setup_actors表中的INSTRUMENTED或HISTORY列值,那么后续修改的值不会影响到threads表中已经创建好的线程的INSTRUMENTED或HISTORY列值
-
PROCESSLIST_*开头的列提供与INFORMATION_SCHEMA.PROCESSLIST表或SHOW PROCESSLIST语句类似的信息。但threads表中与其他两个信息来源有所不同:
- 对threads表的访问不需要互斥体,对server性能影响最小。 而使用INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST查询线程信息的方式会损耗一定性能,因为他们需要互斥体
- threads表为每个线程提供附加信息,例如:它是前台还是后台线程,以及与线程相关联的server内部信息
- threads表提供有关后台线程的信息,而INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST不能提供
- 可以通过threads表中的INSTRUMENTED字段灵活地动态开关某个线程的监视功能、HISTORY字段灵活地动态开关某个线程的历史事件日志记录功能。要控制新的前台线程的初始INSTRUMENTED和HISTORY列值,通过setup_actors表的HOST、 USER对某个主机、用户进行配置。要控制已创建线程的采集和历史事件记录功能,通过threads表的INSTRUMENTED和HISTORY列进行设置
- 对于INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST,需要有PROCESS权限,对于threads表只要有SELECT权限就可以查看所有用户的线程信息
-
threads表字段含义如下:
- THREAD_ID:线程的唯一标识符(ID)
- NAME:与server中的线程检测代码相关联的名称(注意,这里不是instruments名称)。例如,thread/sql/one_connection对应于负责处理用户连接的代码中的线程函数名,thread/sql/main表示server的main()函数名称
- TYPE:线程类型,有效值为:FOREGROUND、BACKGROUND。分别表示前台线程和后台线程,如果是用户创建的连接或者是复制线程创建的连接,则标记为前台线程(如:复制IO和SQL线程,worker线程,dump线程等),如果是server内部创建的线程(不能用户干预的线程),则标记为后台线程,如:innodb的后台IO线程等
- PROCESSLIST_ID:对应INFORMATION_SCHEMA.PROCESSLIST表中的ID列。该列值与show processlist语句、INFORMATION_SCHEMA.PROCESSLIST表、connection_id()函数返回的线程ID值相等。另外,threads表中记录了内部线程,而processlist表中没有记录内部线程,所以,对于内部线程,在threads表中的该字段显示为NULL,因此在threads表中NULL值不唯一(可能有多个后台线程)
- PROCESSLIST_USER:与前台线程相关联的用户名,对于后台线程为NULL。
- PROCESSLIST_HOST:与前台线程关联的客户端的主机名,对于后台线程为NULL。与INFORMATION_SCHEMA PROCESSLIST表的HOST列或SHOW PROCESSLIST输出的主机列不同,PROCESSLIST_HOST列不包括TCP/IP连接的端口号。要从performance_schema中获取端口信息,需要查询socket_instances表(关于socket的instruments wait/io/socket/sql/*默认关闭):
- PROCESSLIST_DB:线程的默认数据库,如果没有,则为NULL。
- PROCESSLIST_COMMAND:对于前台线程,该值代表着当前客户端正在执行的command类型,如果是sleep则表示当前会话处于空闲状态。有关线程command的详细说明,参见链接:https://dev.mysql.com/doc/refman/5.7/en/thread-information.html。对于后台线程不会执行这些command,因此此列值可能为NULL
- PROCESSLIST_TIME:当前线程已处于当前线程状态的持续时间(秒)
- PROCESSLIST_STATE:表示线程正在做什么事情。有关PROCESSLIST_STATE值的说明,详见链接:https://dev.mysql.com/doc/refman/5.7/en/thread-information.html。如果列值为NULL,则该线程可能处于空闲状态或者是一个后台线程。大多数状态值停留的时间非常短暂。如果一个线程在某个状态下停留了非常长的时间,则表示可能有性能问题需要排查
- PROCESSLIST_INFO:线程正在执行的语句,如果没有执行任何语句,则为NULL。该语句可能是发送到server的语句,也可能是某个其他语句执行时内部调用的语句。例如:如果CALL语句执行存储程序,则在存储程序中正在执行SELECT语句,那么PROCESSLIST_INFO值将显示SELECT语句
- PARENT_THREAD_ID:如果这个线程是一个子线程(由另一个线程生成),那么该字段显示其父线程ID
- ROLE:暂未使用
- INSTRUMENTED:
- 线程执行的事件是否被检测。有效值:YES、NO
- 1)、对于前台线程,初始INSTRUMENTED值还需要看控制前台线程的setup_actors表中的INSTRUMENTED字段值。如果在setup_actors表中找到了对应的用户名和主机行,则会用该表中的INSTRUMENTED字段生成theads表中的INSTRUMENTED字段值,setup_actors表中的USER和HOST字段值也会一并写入到threads表的PROCESSLIST_USER和PROCESSLIST_HOST列。如果某个线程产生一个子线程,则子线程会再次与setup_actors表进行匹配
- 2)、对于后台线程,INSTRUMENTED默认为YES。 初始值无需查看setup_actors表,因为该表不控制后台线程,因为后台线程没有关联的用户
- 3)、对于任何线程,其INSTRUMENTED值可以在线程的生命周期内更改
- 要监视线程产生的事件,如下条件需满足:
- 1)、setup_consumers表中的thread_instrumentation consumers必须为YES
- 2)、threads.INSTRUMENTED列必须为YES
- 3)、setup_instruments表中线程相关的instruments配置行的ENABLED列必须为YES
- 4)、如果是前台线程,那么setup_actors中对应主机和用户的配置行中的INSTRUMENTED列必须为YES
- 线程执行的事件是否被检测。有效值:YES、NO
- HISTORY:
- 是否记录线程的历史事件。有效值:YES、NO
- 1)、对于前台线程,初始HISTORY值还需要看控制前台线程的setup_actors表中的HISTORY字段值。如果在setup_actors表中找到了对应的用户名和主机行,则会用该表中的HISTORY字段生成theads表中的HISTORY字段值,setup_actors表中的USER和HOST字段值也会一并写入到threads表的PROCESSLIST_USER和PROCESSLIST_HOST列。如果某个线程产生一个子线程,则子线程会再次与setup_actors表进行匹配
- 2)、对于后台线程,HISTORY默认为YES。初始值无需查看setup_actors表,因为该表不控制后台线程,因为后台线程没有关联的用户
- 3)、对于任何线程,其HISTORY值可以在线程的生命周期内更改
- 要记录线程产生的历史事件,如下条件需满足:
- 1)、setup_consumers表中相关联的consumers配置必须启用,如:要记录线程的等待事件历史记录,需要启用events_waits_history和events_waits_history_long consumers
- 2)、threads.HISTORY列必须为YES
- 3)、setup_instruments表中相关联的instruments配置必须启用
- 4)、如果是前台线程,那么setup_actors中对应主机和用户的配置行中的HISTORY列必须为YES
- 是否记录线程的历史事件。有效值:YES、NO
- CONNECTION_TYPE:用于建立连接的协议,如果是后台线程则为NULL。有效值为:TCP/IP(不使用SSL建立的TCP/IP连接)、SSL/TLS(与SSL建立的TCP/IP连接)、Socket(Unix套接字文件连接)、Named Pipe(Windows命名管道连接)、Shared Memory(Windows共享内存连接)
- THREAD_OS_ID:
- 由操作系统层定义的线程或任务标识符(ID):
- 1)、当一个MySQL线程与操作系统中与某个线程关联时,那么THREAD_OS_ID字段可以查看到与这个mysql线程相关联的操作系统线程ID
- 2)、当一个MySQL线程与操作系统线程不关联时,THREAD_OS_ID列值为NULL。例如:用户使用线程池插件时
- 对于Windows,THREAD_OS_ID对应于Process Explorer中可见的线程ID(https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)
- 对于Linux,THREAD_OS_ID对应于gettid()函数获取的值。例如:使用perf或ps -L命令或proc文件系统(/proc/[pid]/task/[tid])可以查看此值。有关更多信息,请参阅perf-stat(1),ps(1)和proc(5)手册页
- 由操作系统层定义的线程或任务标识符(ID):
-
threads表不允许使用TRUNCATE TABLE语句
-
表结构定义
CREATE TABLE `threads` (
`THREAD_ID` bigint(20) unsigned NOT NULL,
`NAME` varchar(128) NOT NULL,
`TYPE` varchar(10) NOT NULL,
`PROCESSLIST_ID` bigint(20) unsigned DEFAULT NULL,
`PROCESSLIST_USER` varchar(32) DEFAULT NULL,
`PROCESSLIST_HOST` varchar(60) DEFAULT NULL,
`PROCESSLIST_DB` varchar(64) DEFAULT NULL,
`PROCESSLIST_COMMAND` varchar(16) DEFAULT NULL,
`PROCESSLIST_TIME` bigint(20) DEFAULT NULL,
`PROCESSLIST_STATE` varchar(64) DEFAULT NULL,
`PROCESSLIST_INFO` longtext,
`PARENT_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
`ROLE` varchar(64) DEFAULT NULL,
`INSTRUMENTED` enum('YES','NO') NOT NULL,
`HISTORY` enum('YES','NO') NOT NULL,
`CONNECTION_TYPE` varchar(16) DEFAULT NULL,
`THREAD_OS_ID` bigint(20) unsigned DEFAULT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
上一篇: performance_timers表 | 下一篇: performance_schema中信息摘要表
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!