欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL Thread pool 操作过程

程序员文章站 2022-05-16 14:45:33
...

每个 thread group 有一个监听线程,该线程监听那些从connection 发送过滤的statement,当接受到a statement 的时候,thread gro

Thread pool 操作过程:

thread pool 包含一定数量的 thread groups,每个groups 管理一定量的client connections,当mysql建立 connection 时,thread pool会以循环的方式(round-robin fashion)将其分配到其中的一个 thread groups中。

thread_pool_size 规定了thread groups 的数量,这样也就规定了同时可以执行多少个statement 可取值为 1—64,每个thread group 的最大线程数是4096.

thread pool 将 connection 和threads 分隔开,所以connection 和thread 和没有固定的联系。

算法:

每个 thread group 有一个监听线程,该线程监听那些从connection 发送过滤的statement,当接受到a statement 的时候,thread group 会有两个选择;立即执行或者放入队列稍后执行。

当接受到的只是一个语句,而且没有其他语句处于队列,或者当前没有语句正在执行,那么就会立即执行该语句,否则的话该语句就会放入到队列中。

当立即执行该语句时,那监控线程就会来执行次任务,此时意味着在该thread group 中临时没有线程处于监听状态,如果该语句执行的很快,那么该线程还会返回来继续处于监听状态。否则的话,thread pool 就会在需要的时候创建一个新的线程来监听。 thread pool 有一个后台线程来周期的监控thread group的状态,以免因为执行SQL时thread group 被block(比如遇到disk io 产生中断等)

thread_pool_stall_limit 参数取值范围60ms ---- 6s,该值代表了该语句将要结束并且要执行下一个语句的时间间隔(线程在超过thread_pool_size时,会等待thread_pool_stall_limit ms后创建新线程,防止线程池瞬间扩展而还来不必要的线程开销)。较小的值 允许新的线程快速的启动,这样也可以防止死锁的产生。对于那些长时间执行的statement,适合较大的值,这样防止同时执行太多的statement。

thread pool 专注于并发的短时间运行的statement ???

当statement遇到disk io时,或者row lock或者table lock的时候,会造成 thread group 变的不可用,此时 thread pool 有一个回调机制来让该group 内开启一个新的thread 来执行其他的statement,当blocked thread 返回的时候,thread pool立马使用。

对于队列: high-priority queue 和 low-priority queue

一般情况下,事务里的第一个statement会被放到 低级别的队列中,其他的语句会被放到较高级别的。 thread_pool_high_priority_connection 可以将所有statement 都放到 高级别的队列中。

如果语句针对的是非事务型的存储引擎,或者存储引擎 autocommit=1 所有的语句都会被放入到 low 级别的队列中,

当thread group 选择队列中的语句开始执行的时候,先检查高优先级的队列,然后是低优先级的队列,,对于发现的语句,它会从队列中移除并开始执行。

如果某个语句在低优先级的队列中时间太长,thread pool 会将其放入到高优先级的队列中,thread_pool_prio_kickup_timer 参数来控制这个时间。

thread pool 会选择重用最活跃的threads 来充分利用CPU的缓存,这个小小的调整对性能影响很大。

MySQL Thread pool 操作过程