MySQL如何管理客户端链接?线程池篇

MySQL如何管理客户端链接?线程池篇

在以前的文章里,为你们介绍了MySQL的链接管理线程的工做方式,在这一篇里为你们介绍管理链接的第二种方式,线程池。缓存

MySQL默认的链接控制方式采用的是每一个链接使用一个线程执行客户端的请求。MySQL的线程池是包含在企业版里面的服务器插件。使用线程池的目的是为了改善大量并发链接所带来的性能降低。在大量并发链接的工做负载下,使用线程池能够解决没法利用CPU缓存、上下文切换开销过大以及资源争用等问题。服务器

线程池功能由插件库文件、服务器系统变量及Performance Schema里面的检测点组成。并发

MySQL如何管理客户端链接?线程池篇

线程池是由必定数量的线程组(默认为16个经过thread_pool_size
进行配置)构成,每一个线程组管理一组客户端链接,最大链接数为4096。链接建立以后会以轮询的方式分配给线程组。链接池打破了每一个链接与线程一一对应的关系,这一点与MySQL默认的线程控制方式不一样,默认方式将一个线程与一个链接相关联,以便给定的线程从其链接执行全部的语句。ide

默认状况下,线程池试图确保每一个组中每次最多执行一个线程,但有时为了得到最佳性能,容许临时执行多个线程。每组里面有一个监听线程,负责监听分配给该组的链接。线程会选择当即执行或稍后执行链接里面的语句,若是语句是惟一接收到的,而且当前没有排队或正在执行的语句,该语句就会当即执行。其它状况则会选择稍后执行。当该语句被判断为当即执行时,监听线程负责执行该语句,若是可以快速完成执行,该线程会返回监听状态,若是执行语句时间过长产生停滞,线程组会开启一个新的监听线程。线程池插件使用一个后台线程监控线程组状态,以确保线程组不会由于停滞的语句阻塞线程组。性能

能够经过thread_pool_stall_limit 配置等待值时长,短等待值容许线程更快启动,也有助于避免死锁状况。长时间等待值对于长时间运行的工做负载很是有用,能够避免在当前语句执行时启动太多新语句。插件

经过thread_pool_max_active_query_threads设置运行的最大线程,若是该值不为0,则该数值为容许运行的最大线程数量,设置为0使用默认最大值。线程

线程池侧重于限制短期运行语句的并发数量。在执行语句达到待值时长以前,它会阻止其余语句开始执行。若是语句执行超过了待值时长,容许其继续执行,但再也不阻止其余语句启动。经过这种方式,线程池尝试确保每一个线程组中永远不会有超过一个的短期运行语句,但可能有多个长时间运行的语句。设计

若是遇到磁盘I/O操做或用户级锁(行锁或表锁),语句就会被阻塞,将致使线程组没法使用。线程池的回调功能,能够确保线程池当即启动该组中的新线程来执行另外一条语句。当一个被阻塞的线程返回时,线程池容许它当即从新启动。orm

线程池包含两个队列,高优先级队列和低优先级队列。当前正在执行的语句及该事务后续关联的语句将进入高优先级队列,其它语句进入低优先级队列。blog

此外,线程池重用活跃的线程,以更好地利用CPU缓存。这是一个对性能有很大影响的调整。

理论上,可能出现的最大线程数是 max_connectionsthread_pool_size的总和。当全部链接都处于执行模式,而且每一个组都建立了一个额外的线程来监听,可能会发生这种状况。

总结一下,MySQL的线程池被设计为扩展链接、避免死锁,经过对线程进行分组、区分优先级、轮询调度,高效利用CPU缓存、减小上下文切换开销,提高MySQL服务器性能!

相关文章
相关标签/搜索