线程池¶
MySQL每个客户端连接使用一个线程执行语句。一旦连接数增加到超过某一点,性能就会下降。
该特性通过引入动态线程池,使服务器即使在有大量客户端连接的情况下也能保持最佳性能。通过使用线程池服务器可以减少线程的数量,从而减少上下文切换和热锁争用。使用线程池将具有最大的效果OLTP工作负载(相对较短的cpu限制查询)。
以便启用线程池变量thread_handling应该设置为的线程池价值。这可以通过添加:
thread_handling =的线程池
尽管线程池的默认值应该能够提供良好的性能,但是可以使用动态系统变量执行额外的调优。
请注意
当前线程池的实现是在服务器中构建的,不像上游版本是通过插件实现的。实现的另一个重要区别是,该实现没有尝试最小化并发事务的数量MySQL企业线程池.由于这些差异,此实现与上游版本不兼容。
优先级连接调度¶
尽管线程池限制了并发运行的查询的数量,但打开的事务的数量可能仍然很高,因为已经启动事务的连接被放到队列的末尾。较高的打开事务数对当前运行的查询有许多影响。提高新性能thread_pool_high_prio_tickets变量已经被引入。
该变量控制高优先级队列策略。为每个新连接分配这么多票以进入高优先级队列。当一个查询因为没有可用线程而不得不排队等待稍后执行时,如果满足以下条件,线程池就会将该连接放入高优先级队列:
连接在服务器中有一个打开的事务。
此连接的高优先级票据的数量非零。
如果上述两个条件都成立,则将该连接放入高优先级队列,并且其tickets值递减。否则,连接将使用此选项指定的初始票据值放入公共队列。
每次线程池寻找要处理的新连接时,它首先检查高优先级队列,只有当高优先级队列为空时才从公共队列中选择连接。
目标是最小化服务器中打开的事务的数量。在许多情况下,让短时间运行的事务有机会更快地提交,从而释放服务器资源和锁,而不必与即将启动新事务的其他连接或已耗尽高优先级票据的其他连接在同一个队列中等待,这是有益的。
默认的线程池行为是始终将已经启动的事务中的事件放入高优先级队列,因为我们相信在绝大多数情况下这样做会带来更好的性能。
价值是0,所有的连接总是放入公共队列,即没有优先级调度使用的原始实现MariaDB.该值越高,每个事务进入高优先级队列并在放入公共队列之前提交的机会就越多。
在某些情况下,需要对特定连接的所有语句进行优先级排序,而不管它们是作为多语句事务的一部分执行还是以自动提交模式执行。反之亦然,有些连接可能要求对所有语句无条件地使用低优先级队列。要实现这个新的thread_pool_high_prio_mode中引入了变量雷竞技下载官网用于MySQL的Percona服务器.
低优先级队列节流¶
有一种情况可能会限制线程池性能,甚至在高并发性下导致死锁,即由于活动线程达到了超额订阅限制而导致线程组超额订阅,但所有/大多数工作线程实际上都在等待当前由来自另一个当前不在线程池中的连接的事务持有的锁。
在这种情况下,池中那些已将自己标记为非活动的线程没有计入超额订阅限制。结果,池中的线程数量(包括活动线程和等待线程)会不断增加,直到到达thread_pool_max_threads价值。如果执行持有锁的事务的连接设法在此之前进入线程池,我们将得到一个大的(取决于线程池的大小)线程池thread_pool_max_threads值)并发运行的线程数,因此性能不佳。否则,就会出现死锁,因为不能创建更多的线程来处理这些事务并释放锁。
当工作线程总数(包括活动线程和等待线程)达到超额订阅限制时,可以通过限制低优先级队列来防止这种情况。也就是说,如果工作线程太多,则不要启动新事务并创建新线程,直到已经启动的事务中的排队事件被处理。
处理长时间网络等待¶
某些类型的工作负载(大结果集、blob、慢客户机)在网络I/O(套接字读写)上有较长的等待时间。当服务器等待时,这应该与线程池通信,因此它可以通过唤醒等待线程或有时创建一个新线程来启动新的查询。此实现已从MariaDB补丁mdev - 156。
版本相关信息¶
- 8.0.12-1:
线程池特性是从雷竞技下载官网用于MySQL的Percona服务器5.7.
系统变量¶
thread_pool_idle_timeout¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 是的 |
| 数据类型: | 数字 |
| 默认值: | (60秒) |
此变量可用于限制空闲线程退出前应该等待的时间。
thread_pool_high_prio_mode¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球、会话 |
| 动态: | 是的 |
| 数据类型: | 字符串 |
| 默认值: | 交易 |
| 允许的值: | 交易,语句,没有一个 |
此变量用于对全局或每个连接的高优先级调度提供更细粒度的控制。
允许设置如下值:
交易(默认)。在这种模式下,只有来自已经启动的事务的语句可以进入高优先级队列,这取决于连接中当前可用的高优先级票据的数量(请参阅thread_pool_high_prio_tickets)。语句.在这种模式下,所有单独的语句都进入高优先级队列,而不管连接的事务状态和可用的高优先级票据的数量。此值可用于确定优先级自动提交事务或其他类型的语句,例如针对特定连接的管理语句。注意,全局设置这个值实际上禁用了高优先级调度,因为在这种情况下,来自所有连接的所有语句将使用单个队列(高优先级队列)。没有一个.此模式禁用连接的高优先级队列。一些连接(例如监控)可能对执行延迟不敏感,并且raybet雷竞技竞猜在线官网/或从未分配任何服务器资源,否则将影响其他连接的性能,因此,实际上不需要高优先级调度。注意,将thread_pool_high_prio_mode设置为没有一个全局与设置为基本上具有相同的效果语句全局:所有连接将始终使用单个队列(在本例中是低优先级队列)。
thread_pool_high_prio_tickets¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球、会话 |
| 动态: | 是的 |
| 数据类型: | 数字 |
| 默认值: | 4294967295 |
该变量控制高优先级队列策略。为每个新连接分配这么多票以进入高优先级队列。将此变量设置为0将禁用高优先级队列。
thread_pool_max_threads¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 是的 |
| 数据类型: | 数字 |
| 默认值: | 100000 |
此变量可用于限制池中的最大线程数。一旦达到这个数字,就不会创建新的线程。
thread_pool_oversubscribe¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 是的 |
| 数据类型: | 数字 |
| 默认值: | 3. |
该参数的值越高,可以同时运行的线程就越多,如果该值低于3.这可能会导致更多的睡眠和醒来。
thread_pool_size¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 是的 |
| 数据类型: | 数字 |
| 默认值: | 处理器数量 |
此变量可用于定义同时可以使用CPU的线程数。
thread_pool_stall_limit¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 没有 |
| 数据类型: | 数字 |
| 默认值: | 500(女士) |
正在运行的线程被认为停止前的毫秒数。当达到此限制时,线程池将被唤醒或创建另一个线程。这用于防止长时间运行的查询独占池。
从8.0.14之前的版本升级到8.0.14或更高版本¶
从8.0.14开始,雷竞技下载官网用于MySQL的Percona服务器使用admin_port的上游实现。的变量extra_port而且extra_max_connections已删除且不支持。这是必要的去除extra_port而且extra_max_connections在尝试从8.0.14之前的版本升级到雷竞技下载官网用于MySQL的Percona服务器8.0.14或更高版本。否则,服务器将报错,拒绝启动。
extra_port¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 没有 |
| 数据类型: | 数字 |
| 默认值: | 0 |
中删除了变量雷竞技下载官网Percona Server for MySQL 8.0.14.此变量可用于指定一个附加端口雷竞技下载官网用于MySQL的Percona服务器我会听的。当所有工作线程都处于繁忙或锁定状态时,可以使用这种方法来防止无法建立新的连接的线程池启用特性。要连接到额外的端口,可以使用以下命令:
mysql——港口=“extra-port-number”——协议=tcp
extra_max_connections¶
| 选项 | 描述 |
|---|---|
| 命令行: | 是的 |
| 配置文件: | 是的 |
| 范围: | 全球 |
| 动态: | 没有 |
| 数据类型: | 数字 |
| 默认值: | 1 |
中删除了变量雷竞技下载官网Percona Server for MySQL 8.0.14.此变量可用于指定允许的最大连接数加上一个额外的连接数超级extra_port上的用户连接。这可以与extra_port变量一起使用来访问服务器,以防由于所有工作线程繁忙或被锁定而无法建立新的连接的线程池启用特性。
状态变量¶
Threadpool_idle_threads¶
| 选项 | 描述 |
|---|---|
| 范围: | 全球 |
| 数据类型: | 数字 |
这个状态变量显示池中空闲线程的数量。
Threadpool_threads¶
| 选项 | 描述 |
|---|---|
| 范围: | 全球 |
| 数据类型: | 数字 |
这个状态变量显示池中的线程数。