线程池总体框架

使用线程池连接器模块后,如图1所示,连接的建立与调度由线程池连接器接管,通过引入可动态伸缩的、多分组的线程池,使服务器即使在有大量客户端连接的情况下,也能保持最佳性能。线程池方案通过每个分组上的listener线程进行网络任务的侦听,将触发的任务放入高优先级队列或低优先级队列,由空闲的worker线程按优先级从队列中取出任务从而进行处理。每个CPU同时处理任务个数是有限的,一般2~5个最优,从而保持稳定的业务处理能力。

图1 MySQL线程池特性实现原理
图2 总体原理框架

图2所示,整个线程池分为若干个线程组和一个timer线程,线程组个数默认为服务器上CPU的逻辑核数,也可通过配置文件或命令行启动参数调整,参见配置参数thread_pool_size。用户连接被轮询分配到对应线程组上,连接上的所有查询请求都将由其绑定的线程组处理。当客户端创建了一个连接,并通过此连接发来SQL语句时,线程组将为此连接分配worker进程来执行SQL语句。执行SQL语句结束后,线程组将回收worker线程。线程池通过一定策略控制worker线程的数量,从而使得实际worker线程数保持在一个高性能的数量范围内。

线程池中每个线程组包含:

所有线程组共有一个timer线程,timer线程用于检测线程组中是否出现任务停滞,即一段时间内没有新的任务产生或任务队列不为空时却没有任务被消费掉的情况。

线程池特性支持的功能:

功能配置的详细说明请见配置参数