查看线程:

在performation_schema下,有一个threads表。

 

首先是IO线程

控制参数是innodb_write_io_threads。整个16应该没问题。

而innodb_read_io_threads,就不用动了,write是异步的,read是同步的。

 

page_cleaner_thread

用来刷新脏页的线程。和IO线程设成一样大就行了。

然后的话这个子线程还包括

srv_purge_thread

srv_worker_thread

 

master_thead

之前这个线程干的事情很多 ,但是5.6版本之后,很多功能被剥离的。目前基本上是用来刷新重做日志的。

 

还有一些无关紧要的线程,比如srv_lock_timeout_thread,srv_error_monitor_thread等,前面用来监控锁超时,后面用来监控错误。

 

我觉得最重要的线程就是page_cleaner线程,刷新脏页。从5.5版本开始,就由innodb_io_capacity这个参数控制。

每1s会进行一次上面这个参数数量的脏页刷新。

 

然后我想重点讨论的是,当线上出现故障,你cpu打满了。如果从top命令,定位到是具体的哪一条sql出现的问题。这个就涉及thread。

首先 top -H

这里,找到线程占用cpu最高的pid。

然后登录mysql。查询threads表,将字段thread_os_id=你查询出来的pid。然后你就能得到prosesslist_id。将这个值,拿去和processlist进行查询,就能得到具体的sql语句。

 

那么如何查看IO使用了最高的线程?

iotop -u mysql

或者iotop -p mysqlpid

这个查出来,第一列TID,就是treads表中的thread_os_id。

 

未完待续。