作家
登录

关于MySQL线程池,这也许是目前最全面的实用帖!

作者: 来源: 2018-03-27 10:34:33 阅读 我要评论

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践!


关于MySQL线程池,这也许是今朝最周全的实用帖!

比来出现多次因为上层组件异常导致DB雪崩的情况,笔者将部分监控DB启用了线程池功能,在应用线程池的过程中赓续深刻进修的同时,也碰到了不少问题。

本文就来具体讲述一下MySQL线程池相干的常识,以赞助广大年夜DBA快速懂得MySQL的线程池机制,快速设备MySQL的线程池以及琅绫擎存在的一些坑。 其实我想说,懂得和应用MySQL线程池,看这篇文┞仿就够了。

一、为何要应用MySQL线程池

在介绍为什么要应用线程池之前,我们都知道跟着DB拜访量越来越大年夜,DB的响应时光也会随之越来越大年夜,如下图:

而DB的拜访大年夜到必定水日常平凡,DB的吞吐量也会出现降低,并且会越来越差,如下图所示:

那么是否有什么方法,能实现跟着DB的拜访量越来越大年夜,DB始终表示出最佳的机能呢?类似下图的表示:

答檀卷是今天要重点介绍的线程池功能。总结一下,应用线程池的来由有两个:

1、削减线程反复创建与烧毁部分的开销,进步机能

线程池技巧经由过程预先创建必定命量的线程,在监听到有新的请求时,线程池直接大年夜现有的线程平分派一个线程来供给办事,办事停止后这个线程不会直接烧毁,而是又去处理其他的请求。如许就避免了线程和内存对象频繁创建和烧毁,削减了高低文切换,进步了资本应用率,大年夜而在必定程度上进步了体系的机能和稳定性。

2、对体系起到保护感化

线程池技巧限制了并发线程数,相当于限制了MySQL的runing线程数,无论体系今朝有若干连接或者请求,跨越最大年夜设置的线程数的都须要列队,让体系保持高机能程度,大年夜而防止DB出现雪崩,对调层DB起到保护感化。

可能有人会问,应用连接池可否也达到类似的效不雅?

也许有的DBA会把线程池和连接池混淆,但其实两者是有很大年夜区其余:连接池一般在客户端设置,而线程池是在DB办事器上设备;别的连接池可以起到避免了连接频繁创建和烧毁,然则无法控制MySQL晃荡线程数的目标,在高并发场景下,无法起到保护DB的感化。比较好的方法是将连接池和线程池结合起来应用。

二、MySQL线程池介绍

MySQL线程池简介

为懂得决one-thread-per-connection(每个连接一个线程)存在的频繁创建和烧毁大年夜量线程以及高并发情况下DB雪崩的问题,实现DB在高并发情况依然能保持较高的机能。

Oracle和MariaDB都推出了ThreadPool筹划,今朝Oracle的Thread pool实现为Plugin方法,并且只添加到在Enterprise版本中,Percona移植了MariaDB的Thread pool功能,并做了进一步的优化。本文的情况就基于Percona MySQL 5.7版本。

MySQL线程池架构

MySQL的Thread pool(线程池)被划分为多个group(组),每个组又有对应的工作线程,整体的工作逻辑照样比较复杂,下面我试图经由过程简单的方法来介绍MySQL线程池的工作道理。

1、架构图

起首来看看Thread Pool的架构图。

大年夜架构图中可以看到Thread Pool由一个Timer线程和多个Thread Group构成,而每个Thread Group又由两个队列、一个listener线程和多个worker线程构成。下面分别来介绍各个部分的感化:

  • 队列(高优先级队列和低优先级队列)

用来存放待履行的IO义务,分为高优先级队列和低优先级队列,高优先级队列的义务会优先被处理。

什么义务会放在高优先级队列呢?

事务中的语句会放到高优先级队列中,比如一个事务中有两个update的SQL,有1个已经履行,那么别的一个update的义务就会放在高优先级中。这里须要留意,如不雅长短事务引擎,或者开启了Autocommit的事务引擎,都邑放到低优先级队列中。

还有一种情况会将义务放到高优先级队列中,如不雅语句在低优先级队列逗留太久,该语句也会移到高优先级队列中,防止饿逝世。

  • listener线程

listener线程监听该线程group的语句,并肯定当本身改变成worker线程,是急速履行对应的语灸┞氛样放到队列中,断定的标准是看队列中是否有待履行的语句。

如不雅队列中待履行的语句数量为0,而listener线程转换成worker线程,并急速履行对应的语句。如不雅队列中待履行的语句数量不为0,则认为义务比较多,将语句放入队列中,让其他的线程来处理。这里的机制是为了削减线程的创建,因为一般SQL履行都异常快。

  • worker线程

worker线程是真正干活的线程。

  • Timer线程

Timer线程是用来周期性检查group是否处于处于壅塞状况,当出现壅塞的时刻,会经由过程唤醒线程或者新建线程来解决。

每次worker线程检查队列中义务的时刻,queue_event_count会+1,每次Timer检查完group是否壅塞的时刻会将queue_event_count清0,如不雅检查的时刻义务队列不为空,而queue_event_count为0,则解释义务队列没有被正常处理,此时该group出现了壅塞,Timer线程会唤醒worker线程或者新建一个wokrer线程来处理队列中的义务,防止group长时光被壅塞。

3、Thread Pool的是若何运作的?

 1/4    1 2 3 4 下一页 尾页

  推荐阅读

  第一季度将过,AI巨头们交出了怎样一份成绩单?

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践! 亚马逊:明星产品Alexa下的难堪时刻根据大年夜邀请函显示的信息猜测,此次重要针对师生和教导方面,没有惊艳的新>>>详细阅读


本文标题:关于MySQL线程池,这也许是目前最全面的实用帖!

地址:http://www.17bianji.com/lsqh/40924.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)