MySQL 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的缓存,这个小小的调整对性能影响很大。
下面是当thread group 有多个threads 活跃时举出的实例:
1、一个线程执行一个statement,但是时间已经超过了 stalled time,thread group 会 开启一个新的thread 来执行其他的statement,设置当第一个语句还在执行过程中。。
2、一个线程正在执行一个statement,然后被 blocked并被thread pool 检测到,这个时候此时 该 thread group 允许开启一个新的线程来执行另一个statement。
3、一个线程正在执行一个statement,然后被blocked但没有被 thread pool检测到,这个时候只有等到 stalled 时间 才能开启一个新的线程来执行新的statement
在某些线程 被blocked 但不被thread pool 检测到 但也不会阻止其他语句的执行也不会造成thread pool 死锁 这些情况是很重要的。
1、长时间运行的statement,
2、Binary log dump threads
3、Statements blocked on a row lock, table lock, sleep, or any other blocking activity that has not been reported back to the thread pool by MySQL Server or a storage engine.
以上情况,为防止死锁的产生,该statement 都会被放到stalled 类别对待,
最大的线程数是the sum of max_connections and thread_pool_size
MySQL Thread pool 操作过程相关推荐
- mysql5.6 thread pool_mysql5.6 thread pool
从percona 的压测来看,确实很牛笔啊.提升很大. http://www.mysqlperformanceblog.com/2014/01/29/percona-server-thread-poo ...
- Thread pool引起的程序连接数据库响应慢
数据库版本:percona-mysql 5.6.16 在很长一段时间,都会出现程序连接数据库,出现响应慢的情况,正常在几到几十毫秒之间,但是偶尔会出现上百毫秒的情况: 开始由于开发重新设置并调整过程 ...
- mysql thread入门分析
MySQL thread入门分析 今天下午和群里的朋友讨论mysql的thread pool,讨论的非常热闹,收获不少,借此自己也总结下thread,以备忘.下面贴上lidan的图片: Mysql支持 ...
- Dubbo 线上 Thread pool is EXHAUSTED 问题排查
本文来自作者投稿,原创作者:Tom 前景提要 早上9点第一个到公司泡了一包枸杞,准备打开极客时间看两篇文章提提神.突然客服部反馈用户发送短信收取不到验证码还一通在有大领导的群里@所有人(负责这块的同事 ...
- Reporting Service 告警w WARN: Thread pool pressure. Using current thread for a work item
如果Reporting Service偶尔出现不可访问或访问出错情况,这种情况一般没有做监控的话,很难捕捉到.出现这种问题,最好检查Reporting Service的日志文件. 今天早上就遇到这样一 ...
- 【案例】常驻查询引发的thread pool 性能问题之二
一 现象 某业务单机4个实例中的一个实例出现连接数远高于其他三个实例(正常是4K,问题实例是8K+),但是这4个实例的配置完全相同.业务开发反馈为部分连接失败. 执行show proc ...
- 白话Elasticsearch67-不随意调节jvm和thread pool的原因jvm和服务器内存分配的最佳实践
文章目录 概述 不随意调节jvm和thread pool的原因 jvm gc threadpool jvm和服务器内存分配的最佳实践 jvm heap分配 将机器上少于一半的内存分配给es 为什么不要 ...
- 自定义parallelStream的thread pool
文章目录 简介 通常操作 使用自定义ForkJoinPool 总结 自定义parallelStream的thread pool 简介 之前我们讲到parallelStream的底层使用到了ForkJo ...
- worksteal thread pool
worksteal的场景 对于一个线程池,每个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态 ...
最新文章
- 悉尼大学陶大程:遗传对抗生成网络有效解决GAN两大痛点
- Android 多媒体------相机
- MATLAB图像增强程序举例
- jhsdb:JDK 9的新工具
- SAP License:SAP问题二则
- 玩嗨的 2 亿快手“老铁”和幕后的极致视觉算法
- java 拦截jsp页面_JSP 过滤器
- 有同学问我:Fetch 和 Ajax 有什么区别?
- python面向对象遇见问题
- volley浅析(磨砺营马剑威Android)
- 我与Bootstrap
- Linux乱码和数据库乱码的问题简单排查
- javascript的caller,callee,call,apply
- Java中下载jar包
- chrome浏览器的各个历史版本下载
- 百度地图只显示行政区
- python 隐含波动率_python - QuantLib XL隐含波动率 - 堆栈内存溢出
- BackTrack5 (BT5) 无线wpa密码破解教程 gerix
- 文本表示(一)—— word2vec(skip-gram CBOW) glove, transformer, BERT
- 无线路由频繁掉线9大原因分析
热门文章
- python和c有什么区别_c 跟 python的区别有哪些
- 非专业计算机考试基础内容,全国高等教育自学考试指定教材:计算机应用基础·非计算机专业公共基础科·代码00018...
- data transformation python_Python 编码为什么那么蛋疼?
- 事物 @Transactional
- 字典的增删改查/元组的创建
- 38 ubuntu/windows双系统安装
- 《架构之美》阅读笔记01
- 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
- MongoDB在linux下的启动
- javaPNS进阶-高级推送技巧