29.12.22.8 线程表
threads
表包含每个服务器线程的一行。每行包含线程的信息,并指示是否为其启用监控和历史事件记录:
mysql> SELECT * FROM performance_schema.threads\G
*************************** 1. row ***************************
THREAD_ID: 1
NAME: thread/sql/main
TYPE: BACKGROUND
PROCESSLIST_ID: NULL
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: mysql
PROCESSLIST_COMMAND: NULL
PROCESSLIST_TIME: 418094
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 5856
RESOURCE_GROUP: SYS_default
EXECUTION_ENGINE: PRIMARY
CONTROLLED_MEMORY: 1456
MAX_CONTROLLED_MEMORY: 67480
TOTAL_MEMORY: 1270430
MAX_TOTAL_MEMORY: 1307317
TELEMETRY_ACTIVE: NO
...
当性能方案初始化时,它根据存在的线程-populate threads
表。随后,每当服务器创建一个线程时,添加一行。
新线程的 INSTRUMENTED
和 HISTORY
列的值由 setup_actors
表的内容确定。有关如何使用 setup_actors
表来控制这些列的信息,请参阅 第29.4.6节,“Pre-Filtering by Thread”。
从 threads
表中删除行的操作发生在线程结束时。对于与客户端会话相关的线程,删除操作发生在会话结束时。如果客户端启用了自动重新连接,并且会话重新连接后断开,会话将与新的行在 threads
表中关联,该行的 PROCESSLIST_ID
值不同。新线程的初始 INSTRUMENTED
和 HISTORY
值可能与原始线程不同: setup_actors
表可能已经更改了,原始线程的 INSTRUMENTED
或 HISTORY
值已经更改,但这些更改不适用于新线程。
您可以启用或禁用线程监控(即线程执行的事件是否被instrumented)和历史事件记录。要控制新前台线程的初始 INSTRUMENTED
和 HISTORY
值,请使用 setup_actors
表。要控制现有线程的这些方面,请设置 threads
表行的 INSTRUMENTED
和 HISTORY
列。 (有关线程监控和历史事件记录的条件的更多信息,请参阅 INSTRUMENTED
和 HISTORY
列的描述。)
关于threads
表中的列名具有前缀PROCESSLIST_
与其他进程信息来源的比较,请参见进程信息来源。
对于除threads
表之外的线程信息来源,当前用户必须具有PROCESS
特权。对于threads
表,所有行将被显示给任何具有SELECT
特权的用户。用户不应该被授予访问threads
表的SELECT
特权,以免他们可以查看其他用户的线程信息。
以下是threads
表的列:
-
THREAD_ID
唯一线程标识符。
-
NAME
与服务器线程 instrumentation 代码关联的名称。例如,
thread/sql/one_connection
对应于处理用户连接的线程函数,而thread/sql/main
表示服务器的主函数。 -
TYPE
线程类型,either
FOREGROUND
orBACKGROUND
。用户连接线程是前台线程,而与服务器内部活动相关的线程是后台线程。例如,内部InnoDB
线程、发送信息到副本的binlog dump
线程和复制I/O和SQL线程。 -
PROCESSLIST_ID
对于前台线程(与用户连接相关联),这是连接标识符。 这与
INFORMATION_SCHEMA
PROCESSLIST
表的ID
列中显示的值相同,也与SHOW PROCESSLIST
输出的Id
列中显示的值相同,并由线程内的CONNECTION_ID()
函数返回。对于后台线程(与用户连接无关),
PROCESSLIST_ID
为NULL
,因此这些值不是唯一的。 -
PROCESSLIST_USER
与前台线程关联的用户,
NULL
为后台线程。 -
PROCESSLIST_HOST
前台线程关联的客户端主机名,
NULL
为后台线程。与
INFORMATION_SCHEMA
PROCESSLIST
表或SHOW PROCESSLIST
输出的Host
列不同,PROCESSLIST_HOST
列不包括 TCP/IP 连接的端口号。要从性能 Schema 中获取该信息,启用 socket instrumentation(默认不启用)并查看socket_instances
表:mysql> SELECT NAME, ENABLED, TIMED FROM performance_schema.setup_instruments WHERE NAME LIKE 'wait/io/socket%'; +----------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +----------------------------------------+---------+-------+ | wait/io/socket/sql/server_tcpip_socket | NO | NO | | wait/io/socket/sql/server_unix_socket | NO | NO | | wait/io/socket/sql/client_connection | NO | NO | +----------------------------------------+---------+-------+ 3 rows in set (0.01 sec) mysql> UPDATE performance_schema.setup_instruments SET ENABLED='YES' WHERE NAME LIKE 'wait/io/socket%'; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * FROM performance_schema.socket_instances\G *************************** 1. row *************************** EVENT_NAME: wait/io/socket/sql/client_connection OBJECT_INSTANCE_BEGIN: 140612577298432 THREAD_ID: 31 SOCKET_ID: 53 IP: ::ffff:127.0.0.1 PORT: 55642 STATE: ACTIVE ...
-
PROCESSLIST_DB
线程的默认数据库,或者
NULL
如果没有选择。 -
PROCESSLIST_COMMAND
对于前台线程,线程正在为客户端执行的命令类型,或者
Sleep
如果会话处于空闲状态。对于线程命令的描述,请见第10.14节,“Examining Server Thread (Process) Information”。该列的值对应于客户端/服务器协议中的COM_
命令和xxx
Com_
状态变量。请见第7.1.10节,“Server Status Variables”xxx
后台线程不在客户端执行命令,因此该列可能为
NULL
。 -
PROCESSLIST_TIME
线程当前状态的时间(以秒为单位)。对于复制 SQL 线程,值是从最后一个复制事件的时间戳到复制主机的实际时间之间的秒数。请见第19.2.3节,“Replication Threads”。
-
PROCESSLIST_STATE
线程正在做的事情的动作、事件或状态。对于
PROCESSLIST_STATE
值的描述,请见第10.14节,“Examining Server Thread (Process) Information”。如果值为NULL
,线程可能对应于空闲客户端会话或它正在做的事情没有被instrumented。大多数状态对应于快速操作。如果线程在给定的状态中停留了许多秒,可能存在需要调查的问题。
-
PROCESSLIST_INFO
当前执行的语句或
NULL
,如果当前没有执行语句。语句可能是发送到服务器的语句,也可能是执行其他语句的最内层语句。例如,如果一个CALL
语句执行一个存储过程,该存储过程执行一个SELECT
语句,那么PROCESSLIST_INFO
值将显示SELECT
语句。 -
PARENT_THREAD_ID
如果当前线程是子线程(由另一个线程spawn),那么这是spawn线程的
THREAD_ID
值。 -
ROLE
未使用。
-
INSTRUMENTED
是否对线程执行的事件进行了instrumentation。值是
YES
或NO
。-
对于前台线程,初始
INSTRUMENTED
值是根据用户账户是否与setup_actors
表中的某一行匹配而确定的。匹配是基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程spawn了子线程,匹配将在
threads
表中的子线程行中再次发生。 -
对于后台线程,
INSTRUMENTED
默认为YES
。因为后台线程没有关联的用户,所以setup_actors
不被 consulted。 -
对于任何线程,它的
INSTRUMENTED
值可以在线程生命周期中被改变。
为了监控线程执行的事件,以下条件必须满足:
-
在
setup_consumers
表中的thread_instrumentation
消费者必须为YES
。 -
threads.INSTRUMENTED
列必须为YES
。 -
监控只对来自instrumentation的线程事件进行,条件是
setup_instruments
表中的instrumentation instrument的ENABLED
列设置为YES
。
-
-
HISTORY
是否记录线程的历史事件。值是
YES
或NO
。-
对于前台线程,初始
HISTORY
值是根据用户账户是否与setup_actors
表中的某一行匹配来确定。匹配是基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程.spawn一个子线程,匹配将再次发生在
threads
表中创建的子线程的行。 -
对于后台线程,
HISTORY
默认为YES
。setup_actors
不被 consulted,因为后台线程没有关联的用户。 -
对于任何线程,它的
HISTORY
值可以在线程的生命周期中被改变。
为了使历史事件日志记录线程生效,以下条件必须成立:
-
在
setup_consumers
表中的适当历史相关消费者必须启用。例如,等待事件日志记录在events_waits_history
和events_waits_history_long
表中需要相应的events_waits_history
和events_waits_history_long
消费者被设置为YES
。 -
threads.HISTORY
列必须为YES
。 -
只有当来自于启用的仪器的线程事件被记录时,才会记录线程事件。这些仪器在
setup_instruments
表中ENABLED
列设置为YES
时才被启用。
-
-
CONNECTION_TYPE
用于建立连接的协议,或者对于后台线程为
NULL
。允许的值是TCP/IP
(未加密的TCP/IP连接)、SSL/TLS
(加密的TCP/IP连接)、Socket
(Unix socket文件连接)、Named Pipe
(Windows命名管道连接)和Shared Memory
(Windows共享内存连接)。 -
THREAD_OS_ID
线程或任务标识符,根据操作系统定义:
-
当MySQL线程与操作系统线程关联其整个生命周期时,
THREAD_OS_ID
包含操作系统线程ID。 -
当 MySQL 线程不与操作系统线程关联其整个生命周期时,
THREAD_OS_ID
包含NULL
。这在使用线程池插件(见第7.6.3节,“MySQL Enterprise Thread Pool”)时是典型的用户会话。
在 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)
手册页。 -
-
RESOURCE_GROUP
资源组标签。如果资源组不支持当前平台或服务器配置(见资源组限制),则该值为
NULL
。 -
EXECUTION_ENGINE
查询执行引擎。该值是
PRIMARY
或SECONDARY
。对于 MySQL HeatWave 服务和 HeatWave,PRIMARY
引擎是InnoDB
,SECONDARY
引擎是 HeatWave(RAPID
)。对于 MySQL Community Edition 服务器、MySQL Enterprise Edition 服务器(在站点)、MySQL HeatWave 服务(无 HeatWave),该值总是PRIMARY
。 -
CONTROLLED_MEMORY
线程使用的控制内存量。
-
MAX_CONTROLLED_MEMORY
线程执行期间
CONTROLLED_MEMORY
的最大值。 -
TOTAL_MEMORY
线程使用的总内存量,包括控制和非控制内存。
-
MAX_TOTAL_MEMORY
线程执行期间
TOTAL_MEMORY
的最大值。 -
TELEMETRY_ACTIVE
线程是否具有活动的遥测会话。该值是
YES
或NO
。
表threads
具有以下索引:
-
主键(
THREAD_ID
) -
索引(
NAME
) -
索引(
PROCESSLIST_ID
) -
索引(
PROCESSLIST_USER
,PROCESSLIST_HOST
) -
索引(
PROCESSLIST_HOST
) -
索引(
THREAD_OS_ID
) -
索引(
RESOURCE_GROUP
)
TRUNCATE TABLE
不允许对threads 表。