本文以视频 文字放送,为你带来腾讯云企业级MySQL-动态线程池功能
【背景】
- MySQL两种常用工作模式
MySQL比较常用的工作模式有两种,one-thread-per-connection 和 threadpool 模式。
one-thread-per-connection 是MySQL自带的工作模式,采用每个用户连接对应一个 handle_connection 线程的方式处理用户请求。Threadpool 最早由 percona 支持,CDB对其进行了改进。Thread_pool 采用相对固定数量的工作线程来处理用户连接请求,更适合处理大量用户的短查询请求,可以避免频繁创建和销毁线程,避免并发数较高的情况下的临界资源争抢。Thread_pool 的不足在于当用户请求偏向于慢查询时,工作线程阻塞在高时延操作上,难以快速响应新的用户请求,导致请求响应时间变长。
one-thread-per-connection 和 threadpool 模式各有优缺点,系统需要根据用户的业务类型灵活地进行切换。过去,模式的切换必须重启服务器才能完成。而有切换通常都出现在业务高峰时段,此时强制重启服务器将对用户业务造成严重影响。为了解决此问题,CDB支持了线程池动态切换功能,支持在不重启的情况下,快速完成工作模式的切换。
【动态线程池功能】
- 引入参数
动态线程池功能引入参数 thread_handling_switch_mode,可取的值包括:
- disabled:禁止模式动态迁移;
- stable:只有新连接迁移;
- fast:新请求都迁移,旧连接接到新请求后迁移;
- sharp:kill当前活跃连接,迫使用户重连,达到快速切换的效果,较为激进。
该参数的默认值为fast。
- 状态监控
为了监控线程池各工作组的状态,我们新增了 show threadpool status 命令,来显示每个线程组的状态。
- 其中 connections_moved_from_per_thread 表示从 Per_thread 迁移至 Thread_pool 的 connection 数量;
- connections_moved_to_per_thread 表示从 Thread_pool 迁移至 Per_thread 的 connections 数量;
- events_consumed 表示每个线程池工作线程组消费的 events 总数,当 Thread_pool 迁移至 Per_thread 后,events 总数不再增加;
- average_wait_usecs_in_queue 表示每个 event 平均在 queue 中等待的时间,该值也可用于判断当前线程组的繁忙程度,当该值非常高时,需要考虑进行工作模式切换。
这里新增的show threadpool status 命令与动态线程池直接相关的是以上四项,其他状态的说明如下:
对应状态说明
此外,我们对 show full processlist 也新增了两个列
- Moved_to_per_thread 表示该连接迁移到 Per_thread 的次数;
- Moved_to_thread_pool 表示该连接迁移到 Thread_pool 的次数。
有了动态线程池功能,业务可以灵活地根据自己的需求灵活配置MySQL工作模式,再也不用为线程池卡顿等问题烦恼了。
腾讯数据库技术团队对内支持QQ空间、微信红包、腾讯广告、腾讯音乐、腾讯新闻等公司自研业务,对外在腾讯云上依托于CBS CFS的底座,支持TencentDB相关产品,如CynosDB、CDB、CTSDB、MongoDB、CES等。腾讯数据库技术团队专注于持续优化数据库内核和架构能力,提升数据库性能和稳定性,为腾讯自研业务和腾讯云客户提供“省心、放心”的数据库服务。此公众号旨在和广大数据库技术爱好者一起推广和分享数据库领域专业知识,希望对大家有所帮助。