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

整个线程池分为若干个线程组和一个timer线程,线程组个数默认为服务器上CPU的核心数,也可通过配置文件或命令行启动参数调整,参见配置参数thread_pool_size。用户连接被轮询分配到对应线程组上,连接上的所有查询请求都将由其绑定的线程组处理。当客户端连接发送来SQL语句时,线程组为该连接分配worker线程进行处理。SQL执行结束后,线程组回收worker线程。通过一定策略控制worker线程的数量,从而使得实际worker线程数保持在一个高性能的数量范围内。
线程池中,每个线程组包含:
- 一个pollfd,epoll_create返回的poll描述符。
- 零个或一个listener线程,epoll_wait等待网络可读事件。
- 一个普通队列,存放有网络可读事件的连接对象(包含TCP连接信息与SQL执行上下文状态信息),待被worker线程处理。
- 一个优先队列,存放有网络可读事件的、正处于事务过程中等情况的连接对象,待优先被worker线程处理。
- 零个、一个或多个worker线程,获取有可读事件的连接对象,处理连接的登录验证、SQL接收执行和结果返回,当线程组中没有listener线程时,新空闲的将进入休眠的第一个worker线程会转化为listener线程。
- 一个waiting队列,当worker线程没有任务需要处理时,就会进入条件等待休眠,放入队列,被外部信号唤醒或等待超时自动唤醒后,线程状态重新标识为active状态处理任务或退出结束多余的worker线程。
- 一个mutex锁,保护线程组中的一些资源在多线程中的操作。
所有线程组共用一个timer线程,timer线程用于检测线程组中是否出现任务停滞,即一段时间内没有新的任务产生或任务队列不为空时却没有任务被消费掉的情况。
线程池特性支持的功能:
- 线程组个数可自适应,也可支持动态修改。
- 优先队列与普通队列区分处理事务中连接、持锁连接与普通查询语句连接,优化性能,详细信息请参见thread_pool_high_prio_mode和thread_pool_high_prio_tickets。
- 动态伸缩worker线程的个数,使运行中的线程数保持在一个高效的数量范围内。
- 防线程池停滞(线程池饥饿)问题。
- 本地unix socket连接使用额外连接器。
- information_schema增加四张状态信息表,可实时监管线程池状态。
功能配置的详细说明请见配置参数。
父主题: 特性描述