全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

线程池

最近更新时间:2025-12-31 16:25:33

KingSQL通过线程池,使工作线程和连接不再一一绑定,通过工作线程在连接间的复用,避免创建过多线程,始终将工作线程数控制在最佳线程数附近,从而在不影响中低并发处理效率的同时,大幅提高了高并发场景下的处理能力,同时给予DDL、监控信息查询等操作更高的优先级,确保在业务高负载时能够对数据库进行稳定的监控和管理维护工作。

限制条件

数据库实例内核版本为MySQL 8.0.34。

MySQL8.0版本的实例可以通过控制台的小版本升级功能,将实例的小版本升级到8.0.34,其他版本MySQL实例如需升级,请联系客服。

背景

MySQL默认为每一个连接/会话创建一个线程进行处理,当存在大量连接/会话时,存在以下弊端:

  • 维护大量的线程,本身即增加了mysql server的负载,线程频繁创建和销毁,占用资源。

  • 当大量线程并发时,此时已经远超过了系统的处理能力,各线程互相竞争,CPU时间片在大量线程间频繁调度,不同线程上下文频繁切换,创建过多的线程不仅不能提高Mysql的处理能力,反而徒增系统开销,降低整体性能。

适用场景

  • 当连接数多、且并发数低时,通过连接复用,避免创建大量空闲线程,减少系统资源开销。

  • 当连接数多、且并发数高时,限制创建远超过mysql server处理能力的线程,减少线程间上下文切换,从而提高CPU资源利用效率,增加整体吞吐。

架构设计

  • 连接不再和工作线程一一绑定,通过epoll监听所有连接,当有请求到达后(对应epoll事件就绪),将连接(抽象为connection_t对象)存入队列,由线程池中的工作线程消费,工作线程处理完请求后,继续从队列中获取其他待处理请求进行处理。

  • thread group: 整个线程池被划分成N个group,每个group创建一个epoll句柄,对应一组工作线程,以及高低两个队列,各group间独立,group内epoll上获取的请求由该group内工作线程处理。

  • listener:各个工作线程动态担当listener,负责获取请求/epoll事件(epoll_wait),将获取到的请求存入高低队列中,而后唤醒工作进程进行处理,唤醒失败则会尝试创建新的工作进程。

    • 当group活跃线程过多时(oversubscribe),listener会担当专职角色,不处理请求,只负责收取请求并存入高低队列,并尝试唤醒/创建其他工作线程进行处理

    • 当group活跃线程数未超过阈值,listener不会专职担任角色,从epoll收取请求后即退化为普通工作线程,在高低队列消费完毕前,group内无listener

    • 当高低队列消费完毕后,工作线程会抢占成为listener,收取一次请求后,再次退化为普通工作线程。

  • 。工作线程:从高低队列中获取请求进行处理,空闲超过一定时间后即自动销毁。

  • Timer线程:用于定时检测各个group是否阻塞(stall),如果发现group阻塞,会唤醒/创建工作线程(wake_or_create_thread)。

参数配置

参数

含义及配置值

是否重启生效

thread_pool

控制是否开启线程池

1:开启

0:关闭 (默认值)

thread_pool_size

-> thread_pool_group_size(06.05 需要修改)

整个线程划分成多少个组

合法值:1-128

默认值:CPU核数

thread_pool_max_threads

整个线程池最大线程数,总线程数超过此值时,不会再创建线程(极端场景除外)

合法值:1-10000

默认值:10000

thread_pool_stall_limit

timer线程的检测间隔

合法值:1-UINT_MAX

默认值:10

thread_pool_oversubscribe

单个线程组内活跃线程数的阈值,据此限制活跃工作线程的数量

活跃线程未达阈值,各工作线程自行消费高低队列中现有请求

活跃线程超过此阈值,限制工作线程消费请求

合法值:2-128

默认值:4

thread_pool_idle_timeout

工作线程空闲的超时时间,超过此时间会自动销毁

合法值:1-UINT_MAX

默认值:60

thread_pool_high_prio_tickets

一个事务最多可以在高队列执行的query数

合法值:0-UINT_MAX

默认值:UINT_MAX

thread_pool_high_prio_mode

高优先级队列模式

合法值:'transactions', 'statements' or 'none'

默认值: transactions

性能测试结果

测试环境

配置项

配置信息

服务器

金山云云主机

服务器配置

4C16G

MySQL实例类型

高可用版

MySQL实例版本

8.0.34

MySQL实例规格

16 GB内存;500G

测试工具

sysbench

测试用例
read_write

测试数据

30 tables、1000000 rows

测试结果

测试结论

线程池功能在中低并发下,性能和不开启该功能基本持平。在高并发下,性能维持在较高水平,相对关闭线程池性能提升20-35%。

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈