mysql thread pool

转自:http://blog.csdn.net/wyzxg/article/details/8258033mysql

mysql 线程处理流程图:sql

Mysql支持单线程和多线程两种链接线程模式,若是单线程,则在同一时刻,只能有一个connection链接到Mysql,其余的链接会被挂起。若是是多线程,则同一时刻能够支持多个connection同时链接到服务器。mysql使用哪一种线程模式经过下面变量控制。缓存

mysql> show variables like '%thread_handling%';
+-----------------+---------------------------+
| Variable_name   | Value                     |
+-----------------+---------------------------+
| thread_handling | one-thread-per-connection |
+-----------------+---------------------------+
1 row in set (0.02 sec)服务器

客户端发起链接到mysql server,mysql server监听进程,监听到新的请求,而后mysql为其分配一个新的 thread,去处理此请求。从创建链接之开始,CPU要给它划分必定的thread stack,而后进行用户身份认证,创建上下文信息,最后请求完成,关闭链接,同时释放资源,在高并发的状况下,将给系统带来巨大的压力,不能保证性能。因此,mysql经过线程缓存来是实现线程重用,减少这部分的消耗;一个connection断开,并不销毁承载其的线程,而是将此线程放入线程缓冲区,并处于挂起状态,当下一个新的Connection到来时,首先去线程缓冲区去查找是否有空闲的线程,若是有,则使用之,若是没有则新建线程。多线程

mysql经过 thread_cache_size这参数来设置能够重用线程的个数,他的大小能够经过状态变量Threads_cached和Threads_created来设置并发


mysql> show status like 'thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 2     |
| Threads_created   | 1065  |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.13 sec)高并发

Threads_cached:已经被线程缓存池缓存的线程个数
Threads_created:已经建立的线程个数,经过这个变化的趋势,能够判断thread_cache_size参数值性能

在5.5.16之前,线程处理的模式是,每一个请求就对应一个线程的模式,这就意味着当有成千上万的请求时,对应的也就须要成千上万的线程来相应这些请求,那么此刻问题就很明显了,系统的资源是有限的,必需要保证thread_number*thread_stack不能超过可使用的内存资源,还要考虑CPU的调度能力,I/O的处理能力,这是一种很粗放的资源使用方式,同时,这种不加控制的处理方式,也会带来资源使用的冲突,大量互斥锁的出现,性能的急剧降低。在5.5.16之后经过Thread Pool来控制确保不会超过服务器的最大负载能力,避免出现服务无响应,致使宕机的惨状。.net

相关文章
相关标签/搜索