Skip to content

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
    • 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
    • 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)手册页
  • 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中信息摘要表

Clone this wiki locally