基于《MySQL学习分享--Thread pool》对Thread pool架构设计的详细了解,本文主要对Thread pool的实现进行分析,并根据Mariadb和Percona提供的开源实现,进行简单的比较和评估。

1、《The Thread Pool Plugin》

MySQL官方文档中,对Thread pool进行了详细的介绍,主要从实现和使用角度进行了说明。MySQL企业版实现通过插件方式实现,对源码逻辑没有侵入,是比较友好的方式。文档描述的实现机制方面,跟架构设计基本无出入。

其中,thread_pool_size控制线程组的大小,thread_pool_stall_limit标志sql执行异常的情况,thread_pool_prio_kickup_timer控制用户线程的优先级转化。

根据文档提供的信息,以及架构设计的思想,抽象出以下几种处理逻辑:

1.1 No executing and empty queue

在当前线程组内,既没有当前执行的sql语句,也没有等待的用户线程在队列中时,线程组内的监听线程立即执行当前用户请求的sql。具体逻辑如下图所示:

图1.1 No executing and empty queue

图中是一个线程组内流程,每个线程组内有两个优先级队列(high/low priority queue),当前没有执行sql并且队列为空时,新的用户连接的请求,监听线程会立即执行sql到DB。

1.2 Low priority queue

当前线程组内的高优先级队列为空,低优先级的队列不为空时,监听线程会从低优先级队列中取用户请求,执行sql到DB。具体处理逻辑如下图所示:

图1.2 Low priority queue

特别的,如果一个事务有多条sql,当从低优先级队列中取第一条sql开始执行时,该事务的其他sql语句,全部进入高优先级队列。

1.3 High priority queue

在当前线程组内,如果高优先级队列中有用户请求,监听线程会优先从高优先级队列中取用户请求,优先执行sql到DB。高优先级队列执行完了,再从低优先级队列中取用户请求。

图1.3 High priority queue

此外,参数thread_pool_high_priority_connection会将当前session中的所有sql迁移到高优先级队列中。

1.4 Priority kickup timer

在低优先级队列中的用户请求超过thread_pool_prio_kickup_timer时间时,会从低优先级队列中迁移到高优先队列中。具体的处理逻辑如下图所示:

图1.4 Priority kickup timer

1.5 Stall limit

当监听线程由于大事务阻塞,超过thread_pool_stall_limit参数限制时,监听线程继续执行,同时启动新的监听线程,从队列中继续往下执行。具体逻辑如下所示:

图1.5 Stall limit

通过以上分析可知,thread_pool_stall_limit和thread_pool_prio_kickup_timer参数是主要的性能优化参数。如果thread_pool_stall_limit设置与业务场景不匹配时,会导致单个线程组内有大量的执行线程,这样就会导致持续创建监听线程,并且大量的线程切换。而thread_pool_prio_kickup_timer参数设置不合理,将会导致频繁的从低优先级队列迁移到高优先级队列,消耗大量的系统资源。因此在性能优化时,需要根据业务模型和场景进行测试和设置。

2、《Thread pool in MariaDB 5.5》

MariaDB 5.5引入了Thread pool,设计思想与MySQL企业版设计几乎一致。MariaDB嵌入到Server层,而没有使用插件的方式,这是实现上的一个重大差别。MariaDB通过thread_handling设置线程类型实现线程池和one-to-one方式方式的转化。从实现角度来看,通过配置文件设置该参数,不能动态调整。

两者设计上都采用了线程组,但是MariaDB将实现进行了进一步的细化,增加了thread_pool_max_threads参数控制线程池的最大线程数。此外,针对不同的系统,采用不同的IO复用方式,提高性能。

两者都通过thread_pool_stall_limit参数避免大事务阻塞的问题。但是没有分Low/High priority queue,也没有thread_pool_prio_kickup_timer参数影响队列之间的转化。MariaDB通过thread_pool_stall_limit来避免大事务的阻塞,并且不限制线程的并发,因此也不需要优先级队列的方式,防止事务持续不被执行的饥饿问题。从这一点上来看,MySQL的设计更加合理一点,在大量大事务阻塞的时候,并发数较多,因抢占资源性能降低,而小事务由于阻塞会长时间得不到响应。

MariaDB引入extra-port和extra-max-connections参数,用于防止在没有连接资源时,super用户可以登陆进行管理操作。

3、《Thread pool》

Percona的Thread pool是基于MariaDB的实现,并参考了MySQL的设计思想,进行了优化和改进。

Percona参考MySQL的优先级队列思想,将队列分为高优先级队列和普通队列。引入thread_pool_high_prio_tickets参数,当满足一定条件时,用户请求会从普通队列中移到高优先级队列中。正是MariaDB中分析的,目标是降低用户连接的并发数。

结论

通过以上内容分析可知,Thread pool的实现来看,设计思想基本上一致。从实现来看,MySQL企业版实现采用Plugin的方式,可以动态操作,不影响正常逻辑。而MariaDB和Percona采用buildin的方式,通过配置文件,不够灵活。从实现细节来看,MariaDB除了优先级队列之外,与MySQL企业版基本实现思想一致,但是在很多方面都进行了优化和精细。Percona基于MariaDB的实现,参考MySQL企业版的优先级队列,进行了优化和改进。

总体来看,Percona的Thread pool作为开源的实现,与MySQL企业版的设计思想中提到的几个问题,也都很好的解决,应该是使用和了解Thread pool实现的最佳选择

MySQL学习分享--Thread pool实现的更多相关文章

  1. MySQL学习分享-->查询-->查询的分类

    MySQL的查询可以分为交叉联接.内联接.外联接.自然联接.straight_join 下面对于查询的学习,会用到以下四张表: create table t_commodity_type( `id` ...

  2. MySQL线程池(THREAD POOL)的原理

    MySQL常用(目前线上使用)的线程调度方式是one-thread-per-connection(每连接一个线程),server为每一个连接创建一个线程来服务,连接断开后,这个线程进入thread_c ...

  3. MySQL学习分享--数值类型

    数值类型 MySQL的数值类型包括整数类型.浮点数类型.定点数类型.位类型. 整数类型 MySQL支持的整数类型有tinyint.smallint.mediumint.int.bigint(范围从小到 ...

  4. MySQL学习分享-->日期时间类型

    日期时间类型 ①如果要用来表示年月日时分秒,一般使用datetime类型: ②如果要用来表示年月日,一般使用date类型: ③如果要表示时分秒,一般使用time类型: ④如果只是表示年份,一般使用ye ...

  5. MySQL学习分享-->查询-->查询的原理

    查询的原理 在一个查询中常包含下述子句: 1.select,2.distinct,3.join,4.on,5.from,6.where,7.having,8.group by,9.order by,1 ...

  6. MySQL thread pool【转】

    本文来自:http://blog.chinaunix.net/uid-26896862-id-3993773.html 刚刚经历了淘宝的双11,真实感受到了紧张的氛围.尽管DB淡定的度过,但是历程中的 ...

  7. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 如何支撑高并发和动态调整

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.上节回顾 在上节< 缓冲池(Buffer Pool) 的设计原理和管理机制>中,介绍了缓冲池整体 ...

  8. MySQL Thread Pool: Problem Definition

    A new thread pool plugin is now a part of the MySQL Enterprise Edition.In this blog we will cover th ...

  9. mysql thread pool

    转自:http://blog.csdn.net/wyzxg/article/details/8258033 mysql 线程处理流程图: Mysql支持单线程和多线程两种连接线程模式,如果单线程,则在 ...

随机推荐

  1. LDAP落地实战(四):Jenkins集成OpenLDAP认证

    前几篇分文章分别介绍了OpenLDAP的部署管理和维护以及svn.git的接入,今天我们再下一城接入jenkins. 前情提要:LDAP系列文章 LDAP落地实战(一):OpenLDAP部署及管理维护 ...

  2. 国内maven仓库地址资源汇总

    国内maven仓库地址:阿里云maven仓库,网易163maven仓库,以及其他maven仓库地址. 国内下载maven一般速度都很慢,下载需要很久时间.这里汇总了一些国内的镜像资源 附带pom文件中 ...

  3. Redis configuration

    官方2.6配置如下: # Redis configuration file example # Note on units: when memory size is needed, it is pos ...

  4. Rails中实现批量删除

    在Rails生成的控制器模版中,包含的destroy只能处理单个对象,而批量删除要求能够同时处理多个对象,这需要自定义一个批量操作action.批量删除的效果图如下:

  5. Beta阶段——Scrum 冲刺博客第一天

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 今日是Beta冲刺第一天,昨日没有完成的工作 今天计划完成的工作 实现对i ...

  6. [WC 2018]州区划分

    Description 题库链接 小 \(S\) 现在拥有 \(n\) 座城市,第 \(i\) 座城市的人口为 \(w_i\) ,城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 \(n ...

  7. [BZOJ 2655]calc

    Description 题库链接 给出 \(A,n,p\) ,让你在模 \(p\) 意义下求所有序列 \(a\) 满足"长度为 \(n\) 且 \(a_i\in[1,A]\) ,并且对于 \ ...

  8. 11.Proxy

    Proxy Proxy 概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. ...

  9. Ionic3 UI组件之 autocomplete

    无论是web开发还是app开发,autocomplete是常用组件之一. 可惜截止到目前,ionic官方并未提供此组件. ionic2-autocomplete是GitHub上的开源的Ionic2组件 ...

  10. Android 蓝牙操作详解

    1.启用蓝牙并使设备处于可发现状态    1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器.       // 使用意图提示 ...