查看线程:
在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。
未完待续。