该 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
...
当性能模式初始化时,它会根据当前存在的线程填充 threads
表。然后,每当服务器创建一个新线程时,就会添加一行。
新线程的 INSTRUMENTED
和 HISTORY
列值是根据 setup_actors
表的内容确定的。有关如何使用 setup_actors
表控制这些列的信息,请参阅 第 29.4.6 节,“按线程预过滤”。
从 threads
表中删除行时,线程结束时发生。对于与客户会话关联的线程,删除发生在会话结束时。如果客户启用了自动重新连接并在断开连接后重新连接,会话将关联到 threads
表中的一个新行,该行具有不同的 PROCESSLIST_ID
值。新线程的初始 INSTRUMENTED
和 HISTORY
值可能与原始线程的不同:setup_actors
表可能在此期间发生了变化,如果原始线程的 INSTRUMENTED
或 HISTORY
值在初始化后发生了变化,那么更改不会传递到新线程。
您可以启用或禁用线程监控(即,是否instrument执行该线程的事件)和历史事件日志记录。要控制新前台线程的初始 INSTRUMENTED
和 HISTORY
值,请使用 setup_actors
表。要控制现有线程的这些方面,请设置 threads
表行的 INSTRUMENTED
和 HISTORY
列。(有关线程监控和历史事件日志记录何时发生的更多信息,请参阅 INSTRUMENTED
和 HISTORY
列的描述。)
有关 threads
表列名前缀为 PROCESSLIST_
的比较与其他进程信息源,请参阅 进程信息源。
对于线程信息源以外的 threads
表,其他用户的线程信息仅在当前用户拥有 PROCESS
权限时显示。这不是 threads
表的情况;任何拥有该表 SELECT
权限的用户都可以看到所有行。不应将 SELECT
权限授予不应查看其他用户线程的用户。
该 threads
表具有以下列:
-
THREAD_ID
唯一的线程标识符。
-
NAME
与服务器中的线程instrumentation代码关联的名称。例如,
thread/sql/one_connection
对应于处理用户连接的线程函数,而thread/sql/main
代表服务器的main()
函数。 -
TYPE
线程类型,either
FOREGROUND
或BACKGROUND
。用户连接线程是前台线程。与内部服务器活动相关的线程是后台线程。例如,内部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
。与
HOST
列INFORMATION_SCHEMA
PROCESSLIST
表或SHOW PROCESSLIST
输出的Host
列不同,PROCESSLIST_HOST
列不包括 TCP/IP 连接的端口号。要从性能模式获取此信息,启用套接字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
对于前台线程,客户端执行的命令类型,或者如果会话处于 idle 状态则为
Sleep
。对于线程命令的描述,请参阅 Section 10.14, “Examining Server Thread (Process) Information”。该列的值对应于客户端/服务器协议的COM_
命令和xxx
Com_
状态变量。请参阅 Section 7.1.10, “Server Status Variables”xxx
后台线程不执行客户端命令,因此该列可能为
NULL
。 -
PROCESSLIST_TIME
线程处于当前状态的时间(以秒为单位)。对于副本 SQL 线程,该值是最后一个复制事件的时间戳和副本主机的实际时间之间的差异。请参阅 Section 19.2.3, “Replication Threads”。
-
PROCESSLIST_STATE
表示线程当前正在执行的操作、事件或状态。对于
PROCESSLIST_STATE
值的描述,请参阅 Section 10.14, “Examining Server Thread (Process) Information”。如果该值为NULL
,则线程可能对应于闲置的客户端会话,或者它正在执行的工作没有被instrumentation阶段。大多数状态对应于非常快速的操作。如果线程停留在给定状态很长时间,可能存在需要调查的问题。
-
PROCESSLIST_INFO
该线程正在执行的语句,或者如果它不执行语句则为
NULL
。该语句可能是发送到服务器的语句,或者如果语句执行其他语句,则为最内层语句。例如,如果CALL
语句执行存储过程,该过程执行SELECT
语句,则PROCESSLIST_INFO
值将显示SELECT
语句。 -
PARENT_THREAD_ID
如果该线程是子线程(由另一个线程spawn),则这是spawn线程的
THREAD_ID
值。 -
ROLE
未使用。
-
INSTRUMENTED
该线程执行的事件是否被instrumented。该值是
YES
或NO
。-
对于前台线程,初始
INSTRUMENTED
值是根据用户账户是否与setup_actors
表中的某一行匹配而确定的。匹配基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程spawn子线程,匹配将再次发生在
threads
表中的子线程行中。 -
对于后台线程,
INSTRUMENTED
默认为YES
。setup_actors
不会被咨询,因为后台线程没有关联用户。 -
对于任何线程,其
INSTRUMENTED
值可以在线程生命周期中更改。
为了监控线程执行的事件,以下条件必须为真:
-
thread_instrumentation
消费者在setup_consumers
表中必须为YES
。 -
threads.INSTRUMENTED
列必须为YES
。 -
监控仅适用于来自启用了
ENABLED
列的仪器的线程事件,位于setup_instruments
表中。
-
-
HISTORY
是否记录线程的历史事件。该值是
YES
或NO
。-
对于前台线程,初始
HISTORY
值是根据用户账户是否与setup_actors
表中的某一行匹配而确定的。匹配基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程spawn子线程,匹配将再次发生在
threads
表中的子线程行中。 -
对于后台线程,
HISTORY
默认为YES
。setup_actors
不会被咨询,因为后台线程没有关联用户。 -
对于任何线程,其
HISTORY
值可以在线程生命周期中更改。
为了记录线程的历史事件,以下条件必须为真:
-
适当的历史相关消费者在
setup_consumers
表中必须启用。例如,等待事件日志记录在events_waits_history
和events_waits_history_long
表中需要相应的events_waits_history
和events_waits_history_long
消费者启用。 -
The
threads.HISTORY
列必须为YES
。 -
日志记录仅适用于来自启用了
ENABLED
列设置为YES
的仪器的线程事件,在setup_instruments
表中。
-
-
连接类型
用于建立连接的协议,或者
NULL
用于背景线程。允许的值是TCP/IP
(未加密的TCP/IP连接),SSL/TLS
(加密的TCP/IP连接),Socket
(Unix套接字文件连接),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(https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)中的线程ID。对于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 Service和HeatWave,where thePRIMARY
引擎是InnoDB
,SECONDARY
引擎是HeatWave(RAPID
)。对于MySQL Community Edition Server、MySQL Enterprise Edition Server(on-premise)和MySQL HeatWave Service without 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
)
不允许对threads
表使用TRUNCATE TABLE
语句。