若接触过Oracle的学者,想必应该都知道Oracle的体系结构,Oracle体系结构中涉及的进程诸如:PMON、SMON、LGWR、CKPT、DBWR_N等等
那MySQL里面的线程是怎么样的呢?(因为MySQL是单进程多线程结构),带着这个疑问,进行了查阅资料及调试,总结为:MySQL启动时,默认是23个线程。
实验环境
Linux: CentOS 6.8 X64
Kernel:2.6.32-642.el6
MySQL分支:percona-server-5.6.35-81.0
MySQL默认启动时,在MySQL内部总共启动了23个线程。
验证最简单的办法是:
ps -ef|grep mysql #找到MySQL的PID
然后执行
top -H -p mysql_pid
上面只能宏观上查看MySQL的线程数量,但各个线程的作用又是什么呢?带着这个疑问,翻看了MySQL的源码,在srv0start.cc中也即是InnoDB引擎启动的主文件中,大约在1875行左右
有如下定义:
srv_max_n_threads = 1 /* io_ibuf_thread */
+ 1 /* io_log_thread */
+ 1 /* lock_wait_timeout_thread */
+ 1 /* srv_error_monitor_thread */
+ 1 /* srv_monitor_thread */
+ 1 /* srv_master_thread InnoDB的主线程* /
+ 1 /* srv_redo_log_follow_thread */
+ 1 /* srv_purge_coordinator_thread */
+ 1 /* buf_dump_thread */
+ 1 /* dict_stats_thread */
+ 1 /* fts_optimize_thread */
+ 1 /* recv_writer_thread */
+ 1 /* buf_flush_page_cleaner_thread */
+ 1 /* trx_rollback_or_clean_all_recovered */
+ 128 /* added as margin, for use of
InnoDB Memcached etc. */
+ max_connections
+ srv_n_read_io_threads /*默认是4个*/
+ srv_n_write_io_threads /*默认是4个*/
+ srv_n_purge_threads /*默认是1个,可以通过show global variables like '%threads%' 查看*/
/* FTS Parallel Sort */
+ fts_sort_pll_degree * FTS_NUM_AUX_INDEX
* max_connections;
上面除去InnoDB Memcached和FTS,正好是23个线程。
同时,从上面的注释很清楚的知道各个线程的作用,同时这个文件中有个很重要很重要的函数:innobase_start_or_create_for_mysql 为InnoDB引擎启动时的初始函数。