我们知道mysql是单进程多线程模型
% lsof -i tcp:3306COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmysqld 1733 xiazemin 31u IPv4 0x362a06740147157f 0t0 TCP localhost:mysql (LISTEN)
可以通过活动监视器或者ps命令看到线程数
% ps -AvM 1733 |grep 1733 |wc -l38
活动监视器看到的也是38个,启动一个客户端连接后变成了39个
% ps -AvM 1733 |grep 1733 |wc -l39
但是当客户端退出后没有减少,猜测是被缓存了。但是我们通过show processlist看到的只有两个。
mysql> show processlist \G*************************** 1. row ***************************Id: 5User: event_schedulerHost: localhostdb: NULLCommand: DaemonTime: 4644State: Waiting on empty queueInfo: NULL*************************** 2. row ***************************Id: 9User: rootHost: localhostdb: NULLCommand: QueryTime: 0State: initInfo: show processlist2 rows in set (0.00 sec)
这是为什么呢?mysql其他的线程为啥没有显示出来?
select thread_id, thread_os_id, name from performance_schema.threads ;+-----------+--------------+---------------------------------------------+| thread_id | thread_os_id | name |+-----------+--------------+---------------------------------------------+| 1 | 14370 | thread/sql/main || 2 | 15698 | thread/mysys/thread_timer_notifier || 4 | 15820 | thread/innodb/io_ibuf_thread || 5 | 15821 | thread/innodb/io_log_thread || 6 | 15822 | thread/innodb/io_read_thread || 7 | 15823 | thread/innodb/io_read_thread || 8 | 15824 | thread/innodb/io_read_thread || 9 | 15825 | thread/innodb/io_read_thread || 10 | 15826 | thread/innodb/io_write_thread || 11 | 15827 | thread/innodb/io_write_thread || 12 | 15828 | thread/innodb/io_write_thread || 13 | 15829 | thread/innodb/io_write_thread || 14 | 15830 | thread/innodb/page_flush_coordinator_thread || 16 | 15832 | thread/innodb/log_checkpointer_thread || 17 | 15833 | thread/innodb/log_flush_notifier_thread || 18 | 15834 | thread/innodb/log_flusher_thread || 19 | 15835 | thread/innodb/log_write_notifier_thread || 20 | 15836 | thread/innodb/log_writer_thread || 25 | 16102 | thread/innodb/srv_lock_timeout_thread || 26 | 16103 | thread/innodb/srv_error_monitor_thread || 27 | 16104 | thread/innodb/srv_monitor_thread || 28 | 16236 | thread/innodb/buf_resize_thread || 29 | 16237 | thread/innodb/srv_master_thread || 30 | 16238 | thread/innodb/dict_stats_thread || 31 | 16239 | thread/innodb/fts_optimize_thread || 32 | 16241 | thread/mysqlx/worker || 33 | 16242 | thread/mysqlx/worker || 34 | 16243 | thread/mysqlx/acceptor_network || 38 | 16247 | thread/innodb/buf_dump_thread || 39 | 16248 | thread/innodb/clone_gtid_thread || 40 | 16249 | thread/innodb/srv_purge_thread || 41 | 16250 | thread/innodb/srv_worker_thread || 42 | 16249 | thread/innodb/srv_purge_thread || 43 | 16250 | thread/innodb/srv_worker_thread || 44 | 16251 | thread/innodb/srv_worker_thread || 45 | 16252 | thread/innodb/srv_worker_thread || 46 | 16251 | thread/innodb/srv_worker_thread || 47 | 16252 | thread/innodb/srv_worker_thread || 48 | 16253 | thread/sql/event_scheduler || 49 | 16254 | thread/sql/signal_handler || 50 | 16255 | thread/mysqlx/acceptor_network || 52 | 16257 | thread/sql/compress_gtid_table || 54 | 48638 | thread/sql/one_connection |+-----------+--------------+---------------------------------------------+43 rows in set (0.03 sec)
在performance_schema.threads表里看到的是43个和上述两个数据都对不上。mysqld到底有多少个线程?为什么越查越诡异呢?
第一个思路就是,上述列表中不是有thread_id么,我们获取ps得到的线程id列表,通过对比diff问题不久解决了么?too young too simple:
在mac 上ps 是看不到线程id的,搜索了下dtruss可以
% sudo dtruss -ap 1733: probe description syscall:::entry does not match any probes. System Integrity Protection is on
M1 Mac引入了SIP(System Integrity Protection),又称Rootless mode机制,要进行设备的升级或者重刷就要将该机制关闭才能操作,因此我们必须要关闭SIP。长按关机键,直到出现设置后松开,进入恢复模式。
csrutil disable
一顿猛如虎的操作后,然并卵。dtruss只能实时打印出系统调用信息,并不能列出mysqld的所有线程。问题似乎变得尴尬起来。
初步怀疑可能统计维度不一样。
select PROCESSLIST_STATE,count(*) from performance_schema.threads group by(PROCESSLIST_STATE) \G*************************** 1. row ***************************PROCESSLIST_STATE: NULLcount(*): 39*************************** 2. row ***************************PROCESSLIST_STATE: waiting for handler commitcount(*): 1*************************** 3. row ***************************PROCESSLIST_STATE: Waiting on empty queuecount(*): 1*************************** 4. row ***************************PROCESSLIST_STATE: Suspendingcount(*): 1*************************** 5. row ***************************PROCESSLIST_STATE: executingcount(*): 15 rows in set (0.00 sec)
可以看到PROCESSLIST_STATE是NULL的线程数目是39个和38个好接近,但是一个也是差别,我们先看看不是NULL的线程都是哪些
select * from performance_schema.threads where PROCESSLIST_STATE in ("executing","Suspending","Waiting on empty queue","waiting for handler commit")\G*************************** 1. row ***************************THREAD_ID: 39NAME: thread/innodb/clone_gtid_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 3358PROCESSLIST_STATE: waiting for handler commitPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16248RESOURCE_GROUP: NULL*************************** 2. row ***************************THREAD_ID: 48NAME: thread/sql/event_schedulerTYPE: FOREGROUNDPROCESSLIST_ID: 5PROCESSLIST_USER: event_schedulerPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: DaemonPROCESSLIST_TIME: 3358PROCESSLIST_STATE: Waiting on empty queuePROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16253RESOURCE_GROUP: NULL*************************** 3. row ***************************THREAD_ID: 52NAME: thread/sql/compress_gtid_tableTYPE: FOREGROUNDPROCESSLIST_ID: 7PROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: DaemonPROCESSLIST_TIME: 3358PROCESSLIST_STATE: SuspendingPROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16257RESOURCE_GROUP: NULL*************************** 4. row ***************************THREAD_ID: 54NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 9PROCESSLIST_USER: rootPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: QueryPROCESSLIST_TIME: 0PROCESSLIST_STATE: executingPROCESSLIST_INFO: select * from performance_schema.threads where PROCESSLIST_STATE in ("executing","Suspending","Waiting on empty queue","waiting for handler commit")PARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: SocketTHREAD_OS_ID: 48638RESOURCE_GROUP: NULL4 rows in set (0.01 sec)
有系统默认启动的也有我们打开客户端引入的,再打开一个mysql客户端
select count(*) from performance_schema.threads group by(PROCESSLIST_STATE) \G*************************** 1. row ***************************count(*): 40*************************** 2. row ***************************count(*): 1*************************** 3. row ***************************count(*): 1*************************** 4. row ***************************count(*): 1*************************** 5. row ***************************count(*): 15 rows in set (0.00 sec)
% ps -AvM 1733 |grep 1733 |wc -l40
PROCESSLIST_STATE是NULL的线程数竟然一样了,更迷了。
select * from performance_schema.threads where name ="thread/sql/one_connection" \G*************************** 1. row ***************************THREAD_ID: 54NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 9PROCESSLIST_USER: rootPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: QueryPROCESSLIST_TIME: 0PROCESSLIST_STATE: executingPROCESSLIST_INFO: select * from performance_schema.threads where name ="thread/sql/one_connection"PARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: SocketTHREAD_OS_ID: 48638RESOURCE_GROUP: NULL*************************** 2. row ***************************THREAD_ID: 55NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 10PROCESSLIST_USER: rootPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: SleepPROCESSLIST_TIME: 141PROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: SocketTHREAD_OS_ID: 53792RESOURCE_GROUP: NULL2 rows in set (0.00 sec)
可以看到,因为另外一个mysql client啥也没有干processing state 确实是 PROCESSLIST_STATE: NULL,当前mysql client是executing,那我们让另外一个mysql client run起来吧
我们让另外一个线程sleepselect sleep(2);+----------+| sleep(2) |+----------+| 0 |+----------+1 row in set (2.06 sec)
select PROCESSLIST_STATE,count(*) from performance_schema.threads group by(PROCESSLIST_STATE) \G*************************** 1. row ***************************PROCESSLIST_STATE: NULLcount(*): 39*************************** 2. row ***************************PROCESSLIST_STATE: waiting for handler commitcount(*): 1*************************** 3. row ***************************PROCESSLIST_STATE: Waiting on empty queuecount(*): 1*************************** 4. row ***************************PROCESSLIST_STATE: Suspendingcount(*): 1*************************** 5. row ***************************PROCESSLIST_STATE: executingcount(*): 1*************************** 6. row ***************************PROCESSLIST_STATE: User sleepcount(*): 16 rows in set (0.00 sec)
发现多了一个PROCESSLIST_STATE: User sleep的状态。问题变得看不懂了,换一个维度来尝试。
mysql> show processlist \G*************************** 1. row ***************************Id: 5User: event_schedulerHost: localhostdb: NULLCommand: DaemonTime: 4644State: Waiting on empty queueInfo: NULL*************************** 2. row ***************************Id: 9User: rootHost: localhostdb: NULLCommand: QueryTime: 0State: initInfo: show processlist2 rows in set (0.00 sec)
可以看到processlist里面还是两个线程,一个是当前mysql client 一个是定时器任务。仔细研究threads的表结构发现THREAD_ID、PROCESSLIST_ID、THREAD_OS_ID三个值并不是一一对应的。
select * from performance_schema.threads where PROCESSLIST_ID in(5,9)\G*************************** 1. row ***************************THREAD_ID: 48NAME: thread/sql/event_schedulerTYPE: FOREGROUNDPROCESSLIST_ID: 5PROCESSLIST_USER: event_schedulerPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: DaemonPROCESSLIST_TIME: 4694PROCESSLIST_STATE: Waiting on empty queuePROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16253RESOURCE_GROUP: NULL*************************** 2. row ***************************THREAD_ID: 54NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 9PROCESSLIST_USER: rootPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: QueryPROCESSLIST_TIME: 0PROCESSLIST_STATE: executingPROCESSLIST_INFO: select * from performance_schema.threads where PROCESSLIST_ID in(5,9)PARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: SocketTHREAD_OS_ID: 48638RESOURCE_GROUP: NULL2 rows in set (0.00 sec)
分别按照这三个维度统计下
select PROCESSLIST_ID,count(*) from performance_schema.threads group by(PROCESSLIST_ID) \G*************************** 1. row ***************************PROCESSLIST_ID: NULLcount(*): 40*************************** 2. row ***************************PROCESSLIST_ID: 5count(*): 1*************************** 3. row ***************************PROCESSLIST_ID: 7count(*): 1*************************** 4. row ***************************PROCESSLIST_ID: 9count(*): 14 rows in set (0.00 sec)
可以看到多数的PROCESSLIST_ID都是NULL,所以通过show processlist;我们只能看到不是NULL的线程。
select PROCESSLIST_STATE,count(*) from performance_schema.threads where PROCESSLIST_ID is NULL group by(PROCESSLIST_STATE)*************************** 1. row ***************************PROCESSLIST_STATE: NULLcount(*): 39*************************** 2. row ***************************PROCESSLIST_STATE: waiting for handler commitcount(*): 12 rows in set (0.00 sec)
其中的一个状态不是NULL,是一个mysql默认启动的线程
select * from performance_schema.threads where PROCESSLIST_STATE = "waiting for handler commit"\G*************************** 1. row ***************************THREAD_ID: 39NAME: thread/innodb/clone_gtid_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 4928PROCESSLIST_STATE: waiting for handler commitPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16248RESOURCE_GROUP: NULL1 row in set (0.00 sec)
type有两种
select type,count(*) from performance_schema.threads group by type\G*************************** 1. row ***************************type: BACKGROUNDcount(*): 40*************************** 2. row ***************************type: FOREGROUNDcount(*): 32 rows in set (0.00 sec)
前台线程就3个
select type,count(*) from performance_schema.threads group by type\G*************************** 1. row ***************************type: BACKGROUNDcount(*): 40*************************** 2. row ***************************type: FOREGROUNDcount(*): 32 rows in set (0.00 sec)select * from performance_schema.threads where type="FOREGROUND"\G*************************** 1. row ***************************THREAD_ID: 48NAME: thread/sql/event_schedulerTYPE: FOREGROUNDPROCESSLIST_ID: 5PROCESSLIST_USER: event_schedulerPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: DaemonPROCESSLIST_TIME: 5320PROCESSLIST_STATE: Waiting on empty queuePROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16253RESOURCE_GROUP: NULL*************************** 2. row ***************************THREAD_ID: 52NAME: thread/sql/compress_gtid_tableTYPE: FOREGROUNDPROCESSLIST_ID: 7PROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: DaemonPROCESSLIST_TIME: 5320PROCESSLIST_STATE: SuspendingPROCESSLIST_INFO: NULLPARENT_THREAD_ID: 1ROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16257RESOURCE_GROUP: NULL*************************** 3. row ***************************THREAD_ID: 71NAME: thread/sql/one_connectionTYPE: FOREGROUNDPROCESSLIST_ID: 26PROCESSLIST_USER: rootPROCESSLIST_HOST: localhostPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: QueryPROCESSLIST_TIME: 0PROCESSLIST_STATE: executingPROCESSLIST_INFO: select * from performance_schema.threads where type="FOREGROUND"PARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: SocketTHREAD_OS_ID: 53792RESOURCE_GROUP: NULL3 rows in set (0.00 sec)
统计下系统线程发现了端倪
select THREAD_OS_ID,count(*) from performance_schema.threads group by THREAD_OS_ID\G*************************** 1. row ***************************THREAD_OS_ID: 14370count(*): 1*************************** 2. row ***************************THREAD_OS_ID: 15698count(*): 1*************************** 3. row ***************************THREAD_OS_ID: 15820count(*): 1*************************** 4. row ***************************THREAD_OS_ID: 15821count(*): 1*************************** 5. row ***************************THREAD_OS_ID: 15822count(*): 1*************************** 6. row ***************************THREAD_OS_ID: 15823count(*): 1*************************** 7. row ***************************THREAD_OS_ID: 15824count(*): 1*************************** 8. row ***************************THREAD_OS_ID: 15825count(*): 1*************************** 9. row ***************************THREAD_OS_ID: 15826count(*): 1*************************** 10. row ***************************THREAD_OS_ID: 15827count(*): 1*************************** 11. row ***************************THREAD_OS_ID: 15828count(*): 1*************************** 12. row ***************************THREAD_OS_ID: 15829count(*): 1*************************** 13. row ***************************THREAD_OS_ID: 15830count(*): 1*************************** 14. row ***************************THREAD_OS_ID: 15832count(*): 1*************************** 15. row ***************************THREAD_OS_ID: 15833count(*): 1*************************** 16. row ***************************THREAD_OS_ID: 15834count(*): 1*************************** 17. row ***************************THREAD_OS_ID: 15835count(*): 1*************************** 18. row ***************************THREAD_OS_ID: 15836count(*): 1*************************** 19. row ***************************THREAD_OS_ID: 16102count(*): 1*************************** 20. row ***************************THREAD_OS_ID: 16103count(*): 1*************************** 21. row ***************************THREAD_OS_ID: 16104count(*): 1*************************** 22. row ***************************THREAD_OS_ID: 16236count(*): 1*************************** 23. row ***************************THREAD_OS_ID: 16237count(*): 1*************************** 24. row ***************************THREAD_OS_ID: 16238count(*): 1*************************** 25. row ***************************THREAD_OS_ID: 16239count(*): 1*************************** 26. row ***************************THREAD_OS_ID: 16241count(*): 1*************************** 27. row ***************************THREAD_OS_ID: 16242count(*): 1*************************** 28. row ***************************THREAD_OS_ID: 16243count(*): 1*************************** 29. row ***************************THREAD_OS_ID: 16247count(*): 1*************************** 30. row ***************************THREAD_OS_ID: 16248count(*): 1*************************** 31. row ***************************THREAD_OS_ID: 16249count(*): 2*************************** 32. row ***************************THREAD_OS_ID: 16250count(*): 2*************************** 33. row ***************************THREAD_OS_ID: 16251count(*): 2*************************** 34. row ***************************THREAD_OS_ID: 16252count(*): 2*************************** 35. row ***************************THREAD_OS_ID: 16253count(*): 1*************************** 36. row ***************************THREAD_OS_ID: 16254count(*): 1*************************** 37. row ***************************THREAD_OS_ID: 16255count(*): 1*************************** 38. row ***************************THREAD_OS_ID: 16257count(*): 1*************************** 39. row ***************************THREAD_OS_ID: 53792count(*): 139 rows in set (0.00 sec)
系统线程刚好39个,其中有部分操作系统线程对应多个mysql线程
select THREAD_OS_ID,count(*) from performance_schema.threads group by THREAD_OS_ID having count(*)>1\G*************************** 1. row ***************************THREAD_OS_ID: 16249count(*): 2*************************** 2. row ***************************THREAD_OS_ID: 16250count(*): 2*************************** 3. row ***************************THREAD_OS_ID: 16251count(*): 2*************************** 4. row ***************************THREAD_OS_ID: 16252count(*): 24 rows in set (0.00 sec)
这些线程具体干嘛的呢?
select * from performance_schema.threads where THREAD_OS_ID in (16249,16250,16251,16252)\G*************************** 1. row ***************************THREAD_ID: 40NAME: thread/innodb/srv_purge_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 5577PROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16249RESOURCE_GROUP: NULL*************************** 2. row ***************************THREAD_ID: 42NAME: thread/innodb/srv_purge_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: NULLPROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16249RESOURCE_GROUP: NULL*************************** 3. row ***************************THREAD_ID: 41NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 5577PROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16250RESOURCE_GROUP: NULL*************************** 4. row ***************************THREAD_ID: 43NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: NULLPROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16250RESOURCE_GROUP: NULL*************************** 5. row ***************************THREAD_ID: 44NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 5577PROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16251RESOURCE_GROUP: NULL*************************** 6. row ***************************THREAD_ID: 46NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: NULLPROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16251RESOURCE_GROUP: NULL*************************** 7. row ***************************THREAD_ID: 45NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: 5577PROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16252RESOURCE_GROUP: NULL*************************** 8. row ***************************THREAD_ID: 47NAME: thread/innodb/srv_worker_threadTYPE: BACKGROUNDPROCESSLIST_ID: NULLPROCESSLIST_USER: NULLPROCESSLIST_HOST: NULLPROCESSLIST_DB: NULLPROCESSLIST_COMMAND: NULLPROCESSLIST_TIME: NULLPROCESSLIST_STATE: NULLPROCESSLIST_INFO: NULLPARENT_THREAD_ID: NULLROLE: NULLINSTRUMENTED: YESHISTORY: YESCONNECTION_TYPE: NULLTHREAD_OS_ID: 16252RESOURCE_GROUP: NULL8 rows in set (0.00 sec)
其中6个srv_worker_thread 用了三个系统THREAD_OS_ID Id,两个srv_purge_thread 用了一个系统THREAD_OS_ID Id
这就对上了,但是不要高兴得太早,我们还有一个缓存线程数的问题:如果一个mysql client退出后,通过ps统计的线程数并没有减少但是,通过thrads表统计的结果确减少了。
select count(distinct(THREAD_OS_ID)) from performance_schema.threads;+-------------------------------+| count(distinct(THREAD_OS_ID)) |+-------------------------------+| 39 |+-------------------------------+1 row in set (0.00 sec)
% ps -AvM 1733 |grep 1733 |wc -l41
show variables like "%thread_cache_size%";+-------------------+-------+| Variable_name | Value |+-------------------+-------+| thread_cache_size | 9 |+-------------------+-------+1 row in set (0.00 sec)
//改成2set global thread_cache_size=2;Query OK, 0 rows affected (0.00 sec)
可以看到,当我们启动的mysql客户端的数量比历史上启动过的客户端数量大的时候,两者的数据是一样的。
% ps -AvM 1733 |grep 1733 |wc -l41
select count(distinct(THREAD_OS_ID)) from performance_schema.threads;+-------------------------------+| count(distinct(THREAD_OS_ID)) |+-------------------------------+| 39 |+-------------------------------+1 row in set (0.00 sec)
可以看到由于我们缓存两个系统线程,所以通过ps看到的线程数始终比threads表里大2,除非,这两个线程被重新使用了。






