5.5.3.3 线程池操作

线程池由多个线程组组成,每个线程组 Management 一组 Client 端连接。构建连接后,线程池将以循环方式将它们分配给线程组。

线程组的数量可以使用thread_pool_size系统变量进行配置。组的默认数目为 16.有关设置此变量的准则,请参见第 5.5.3.4 节“线程池调整”

每个组的最大线程数为 4096(在内部使用一个线程的某些系统上为 4095)。

线程池将连接和线程分开,因此连接与执行从那些连接接收的语句的线程之间没有固定的关系。这不同于默认的线程处理模型,该模型将一个线程与一个连接相关联,以使给定线程执行其 Connecting 的所有语句。

线程池试图确保在任何时候在每个组中最多执行一个线程,但是有时允许更多线程临时执行以达到最佳性能。该算法以以下方式工作:

通过使用侦听线程执行可以立即开始的语句,如果该语句快速完成,则无需创建其他线程。这样可以确保在并发线程数较少的情况下尽可能最有效的执行。

启动线程池插件时,它将为每个组创建一个线程(侦听器线程),再创建一个后台线程。根据需要创建其他线程来执行语句。

非事务性存储引擎或事务引擎(如果启用了autocommit)的语句被视为低优先级语句,因为在这种情况下,每个语句都是一个事务。因此,给定InnoDBMyISAMtable 的混合语句,除非启用autocommit,否则线程池将InnoDB的语句优先于MyISAM的语句。启用autocommit后,所有语句将具有低优先级。

这是一个线程组可能有多个线程开始执行语句的条件示例:

线程池被设计为可在越来越多的连接上进行扩展。它还旨在避免因限制正在执行的语句数而引起的死锁。重要的是,不向线程池报告的线程不会阻止其他语句的执行,从而导致线程池死锁。此类声明的示例如下:

在每种情况下,为防止死锁,该语句在未快速完成时将其移至停顿类别,以便线程组可以允许另一个语句开始执行。通过这种设计,当线程执行或长时间阻塞时,线程池将线程移至停滞类别,并且在语句执行的其余部分,它不会阻止其他语句执行。

可以出现的最大线程数是max_connectionsthread_pool_size之和。在所有连接都处于执行模式并且为每个组创建一个额外的线程以侦听更多语句的情况下,可能会发生这种情况。这不一定是经常发生的状态,但理论上是可能的。

首页