最近更新时间: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%。
纯净模式
