作家
登录

MySQL线程池内幕

作者: 来源: 2017-08-08 09:26:29 阅读 我要评论

摘要

MySQL线程池在初始化的时刻根据宿主机的CPU核心数设置thread_pool_size,这也就是线程池的线程组的个数。每个线程组在初始化之后会经由过程底层的IO库分派一个收集特别的句柄与之接洽关系,IO库可以经由过程这个句柄监听与之绑定的socket句柄就绪的IO义务,线程组的构造体定义如下:

在MySQL中,线程池指的是用来治理处理MySQL客户端连接义务的线程的一种机制,我厂用的percona版本已经是集成了线程池,只须要经由过程如下参数开启即可。

  1. thread_handling=pool-of-threads 

本文在介绍MySQL线程池核心参数的基本之上对线程池内部实现机制进行进一步介绍。

线程池概论

在持续懂得MySQL线程池之前,我们起重要懂得为什么线程池的惹人可以赞助MySQL晋升机能,除了机能之外线程池还有哪些感化?如不雅把线不雅察做体系资本那么线程池本质上是对体系资本的治理,对于操作体系来说线程的创建和烧毁是比较消费体系资本的,频繁的创建与烧毁线程必定给体系带来不须要的资本浪费,特别是在负载高的情况下这部分开销严重影响体系的资本应用效力大年夜而影响体系的机能与吞吐量,另一方面过多的线程创建又会造成体系资本的过载消费,同时带来相对频繁的线程之间高低文切换问题。体系资本是宝贵的,我认为机能与资本的应用率是慎密相干的:

当thread_pool_high_prio_mode=transactions的时刻每个连接的义务最多被放入优先队列thread_pool_high_prio_tickets次,并且每放一次递减,直到小于等于0的时刻放入通俗队列,这个值默认是4294967295。

他们往往向着一个偏向成长,好的资本应用与平日可以带来较优的机能,线程池技巧一方面可以削减线程反复创建与烧毁这部分开销,大年夜而更好地应用已经创建的线程资本,另一方面也可以控制线程的创建与体系的负载,某些场景对体系起到了保护感化。

若何懂得MySQL线程池

经由过程进修控制MySQL有哪些参数,并深刻懂得每个参数的含义以及这些参数是若何影响MySQL的等问题是一种很好的进修MySQL线程池的一种方法,别的在懂得MySQL根本实现道理的基本之上再对MySQL线程池不足以及可以改进的处所进行更深层次的思虑有利于更好地舆解MySQL线程池技巧。

线程池核心参数

MySQL线程池向用户开放了一些参数,用户可以修改┞封些参数大年夜而影响线程池的行动,下面分别介绍一下这些核心参数。

thread_pool_size

这个参数指的是线程组大年夜小,默认是CPU核心数,线程池初始化的时刻会根据这个数字来生成线程组,每个线程组初始化一个poolfd句柄。

thread_pool_stall_limit

Timer Thread迭代的时光距离,默认是500ms。

thread_pool_oversubscribe

用于计算线程组是否太度日跃或者太过劳碌,也即体系的负载程度,用于在必定场景决定计划新的工作线程是否被创建于和义务是否被处理,这个值默认是3。

thread_pool_max_threads

许可线程池中最大年夜的线程数,默认是10000。

thread_pool_idle_timeout

工作线程最大年夜余暇时光,工作线程跨越这个数还余暇的话就退出,这个值默认是60秒。

thread_pool_high_prio_mode

这个参数可用于控制义务队列的应用,可取三个值:

  • transactions
  • statements
  • none

thread_pool_high_prio_tickets

MySQL线程池实现内幕

线程池总体架构

与JAVA的线程池不合,JAVA线程池中是工作线程而MySQL线程池有一个线程组的概念,线程组内部层级才是工作线程,先看看MySQL线程池的大年夜致架构:

线程池架构

上图大年夜致可以看出线程池内部的构造,线程组为我们存眷的一个较大年夜的组件,线程组内部每个组件的互相调和构成了线程组,每个线程组优胜地工作构成了线程池。对于线程池内部,我认为值得懂得的内容重要包含下面几个方面:

  • 线程组
  • Worker线程
  • Check Stall机制
  • 义务队列
  • Listener线程

对于膳绫擎列出的几个方面,后文将会展开介绍。

线程组

  1. struct thread_group_t 
  2.  
  3.  
  4.   mysql_mutex_t mutex; 
  5.  
  6.   connection_queue_t queue;//低优先级义务队列 
  7.  
  8.   connection_queue_t high_prio_queue;//高优先级义务队列 
  9.  
  10.   worker_list_t waiting_threads; //代表当前哨程没有义务的时刻进入等待队里 
  11.  
  12.   worker_thread_t *listener;//攫取收集义务线程 
  13.  
  14.   pthread_attr_t *pthread_attr; 
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      李红:数字化转型将重塑企业信息化使命

    2017年7月22日,由中国新一代IT家当推动联盟指导,CIO时代学院、IT趣学社结合主办,CIO时代APP承办的“西部家当互联网岑岭论坛暨2017CIO时代中国行西安站”晃荡在“古城&r>>>详细阅读


    本文标题:MySQL线程池内幕

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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