有较严重的锁冲突,如果处于锁等待的工作线程数超过总线程数,也会堆积起来,阻止无锁待的处理请求。比如某个会话执行 FLUSH TABLES WITH READ LOCK语句获得全局锁后暂停,那么其他执行写操作的客户端连接就会阻塞,当阻塞的数量超过线程池的上限时,整个 server 都会阻塞。当然这样的场景下,不管是否使用线程池,数据库的表现都是不够理想的,需要应用侧进行优化。
第一层请求队列的请求经过快速的处理和分析进入第二层队列。如果是管理操作,则直接执行(假定所有管理操作都是小操作)。
对第二层队列,可以分别设置一个允许的并发度(可以接近 CPU 的个数),以实现总线程数的控制。只要线程数大于四类操作的设计并发度之和,则不同类型的操作不会互相干涉(在这里是假定同一操作超过各自并发度而进行排队是合理的)。任何一个队列超过一定的时间,如果没有完成任何语句,处于阻塞模式,则可以考虑放行,在 MySQL 线程池中有thread_pool_stall_limit变量来控制这个间隔,以防止任何一个队列挂起。
可以从配置参数的变化来了解优化后的线程池工作机制: