线程池的开源实现(mariadb和percona版本)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、"Thread pool in MariaDB 5.5"
线程池解决的问题:
传统mysql使用一个线程处理一个客户端连接,如果许多的并发用户,将使性能下降。因为大量的线程将引起上下文交换,cpu缓存失效,增加锁争用。一个理想的解决方案是减少上下文交换,维持低数量的线程数。同时为了充分利用CPU,理想的应该维持每个CPU处理一个活动线程。

mariadb 5.1线程池是一个静态的线程数。
mariadb 5.5实现以下情况:
1、动态池,随需求增加和减少;
2、 维护线程池本身只需 最小的开销;
3、充分利用底层操作系统的能力,如果系统支持,使用原生的OS线程池,使用更好的I/O复用方法;
4、限制线程资源利用(thread_pool_max_threads);

什么时候使用线程池:
查询相对短,CPU负载型(如OLTP)。

以下情况使用线程池效益不太好:
1、非常突发的工作负载(长期不活跃混合许多 短期 高活动的 用户 ),同时不能忍受延时;
2、许多并发,长,不屈服的查询,如数据仓库;
3、总是依赖简单查询很快;

启用线程池:
添加thread_handling=pool-of-threads到my.cnf文件,windows默认开启

线程池变量:
thread_pool_size:多少个线程组,默认为处理器个数。意味着能同时运行的线程数。划分所有客户端连接到组,每个组一个运行线程。
thread_pool_stall_limit:一个运行线程被认为是失速的毫秒数。默认是500,如果到达时间,线程池将唤醒或建立一个另外的线程。如果线程数到达thread_pool_max_threads,将不再创建进程。
thread_pool_max_threads:线程池中最大线程数,如果到达该值,将不创建新线程,默认为500;
thread_pool_idle_timeout:一个空闲工作线程退出之前等待秒数,默认为60,
thread_pool_oversubscribe:内部参数,默认3。高的值,更多线程能同时运行。低的值将导致更多的睡眠和唤醒。

监控线程池活动:
threadpool_threads:池中的线程数;
threadpool_idle_threads:池中不活跃线程数量,空闲可能是等待新的工作,或者因磁盘io、行或表锁等。

Mariadb线程池与Mysql企业版线程池:
相似之处:
1、划分客户端连接到组,thread_pool_size控制线程池组的大小;
2、使用相同的方式检测线程是否变速,使用同样的参数thread_pool_stall_limit进行控制,mariadb单位为毫秒,mysql企业版为10ms单位。

不同之处:
1、windows实现完全不同,mariadb使用原生windows线程池;
2、mariadb使用每个操作系统更有效的I/O复用功能,如linux使用epoll;
3、mariadb没有限制并发事务;
4、mariadb线程池是内建功能,而不是插件;

为了避免所有工作线程都在忙,因行/表锁,新的连接不能创建,不能登录到mysql服务,找出问题所在,并kill掉查询,mysqld提供两个新的选项:
--extra-port:默认为0,不为0时,能连接max_connections数量的正常线程和1个额外的SUPER用户通过extra-port TCP/IP端口,使用传统的一个连接对应一个线程方式。
--extra-max-connections:默认1,支持一个额外的连接。

连接方式:mysql --port='number-of-extra-port' --protocol=tcp

当使用线程池时,thread_cache_size变量不使用,Threads_cached状态变量将为0。

二、"Thread Pool"
从5.5.29-30.0开始支持线程池,percona线程池也是内建版本,非插件,参考mariadb线程池实现方式,以及进行了优化,添加了优先级队列,与mysql官方不同的是没有限制并发事务。

优先连接调度:
虽然线程池限制了并发查询数量,而打开的事务可能很高,大量的打开事务将影响当前运行的查询, 使用thread_pool_high_prio_tickets控制高优先级队列,给每个连接分配多少票,以进入到高优先级队列。每次从高优先级队列取新连接处理,如果高优先级队列为空时,才从普通队列取。

可以减少打开的事务,有益于短事务快速提交,默认线程池总是将已经开始的事务放到高优先级队列。如果值为0,所有连接将总是放到普通队列。

低优先级队列限制:
通过thread_pool_max_threads限制线程池中活动和等待线程的数量,不启动新事务和创建新线程,直到已经开始处理事务,以免过多的活动线程达到超额,影响服务器性能。

特殊变量:
thread_pool_high_prio_mode:提供细粒度的控制高优先级队列,支持全局和每个连接。默认值 transactions,仅当语句从已经开始的事务可能进入到高优先级队列,并依赖于当前连接拥有的高优先级票。statements,所有独立的语句进入到高优先级队列,不管连接事务状态和 拥有的高优先级票;none,关闭高优先级队列,如监控连接,以免影响其他连接的性能。
thread_pool_high_prio_tickets:控制高优先级队列行为,每个新连接分配这么多的高优先级票,设置为0关闭高优先级队列。

参考:
1、"Thread pool in MariaDB 5.5": https://mariadb.com/kb/en/mariadb/mariadb-documentation/optimization-and-tuning/buffers-caches-and-threads/thread-pool/threadpool-in-55/
2、"Thread Pool": http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html



来自为知笔记(Wiz)


转载于:https://my.oschina.net/anthonyyau/blog/287342

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之goto

1 goto code: result:

ABP vNext微服务架构详细教程——结束语

ABP vNext微服务架构详细教程——简介ABP vNext微服务架构详细教程——架构介绍ABP vNext微服务架构详细教程——身份管理服务ABP vNext微服务架构详细教程——基础服务层ABP vNext微服务架构详细教程——聚合服务ABP vNext微服务架构详细教程——身份认证服务ABP vNext微服务架…

创建 linux分区命令,Linux中创建分区

在很多情况下我们可能需要在使用Linux的时候创建新的分区来帮助我们更好的学习和工作,接下来我就详细的介绍一下如何利用fdisk这条命令进行硬盘分区。Linux磁盘分区和windows存在区别,Linux分区分为三类 主分区 扩展分区 和逻辑分区。然而它们三个关系有…

Android studio之Error:(23, 17) Failed to resolve: junit:junit:4.12

1 probleam 2 resolve method // testCompile junit:junit:4.12

20杨氏矩阵查找

问题描述:在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就…

玩一玩微信公众号开发(一) 接入系统

一开始我准备学一学微信开发。后来看了一下文档,需要自己搭服务器进行接口对调。有点麻烦所以就没继续学下去。现在学习过了Kotlin、Spring Boot很多东西,感觉可以比较方便的进行开发了。今天就来回过头学习一下。 准备工作 申请公众号 首先说明一下&…

Android studio之NDK integration is deprecated in the current plugin解决办法

1 、问题 编译Android项目,出现下面错误 NDK integration is deprecated in the current plugin 2、解决办法 在我们 gradle.properties(Project Properties) file add android.useDeprecatedNdktrue

使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用Intro从 .NET Core 3.1 开始,微软添加了一个 System.Net.Http.Json 的扩展,可以用来简化 HttpClient 的使用,看到在很多项目里还并未开始使用,所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

1.前置条件:本次是基于小数据量,且数据块在一个页中的最理想情况进行分析,可能无具体的实际意义,但是可以借鉴到各种复杂条件下,因为原理是相同的,知小见大,见微知著!打开语句分析并确认是否已经…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用。在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持,调用API的开发人员&#xf…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

BeetleX服务网关授权配置

很多应用服务都需要授权访问,为了更好地统一处理这种授权验证,服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的,只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令:压缩和解压缩tar格式的文件格式:tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事,是必须要有的,辅选项是辅助使用的,和通常的选项一样,可选】主…

Android之JNI动态注册native方法和JNI数据简单使用

1、爆结果照片 2、介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1)、按照 JNI 规范的命名规则(静态注册) 2) 、调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中(动态注册) 静态注册的实现可以参考我的这篇博客 http://blog.csdn.net/u01…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下,我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可,我们知道,默认情况下docker容器是不允许访问系统时钟,但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后,会逐步创建特定文件、文件夹和其它目标的索引,例如开…

如何编译 dotnet/aspnetcore 源代码

前言最近,准备为 dotnet/aspnetcore 修改 issue,但是在 clone 代码后,发现要编译成功,远没有想象中那么容易。因此,将整个过程进行记录,以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件,交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …

Convolutional Neural Networks for Visual Recognition 1

Introduction 这是斯坦福计算机视觉大牛李菲菲最新开设的一门关于deep learning在计算机视觉领域的相关应用的课程。这个课程重点介绍了deep learning里的一种比较流行的模型:Convolutional Neural Networks,简称CNN,主要利用CNN来做visual r…

记一次 .NET 某供应链WEB网站 CPU 爆高事故分析

一:背景 1. 讲故事年前有位朋友加微信求助,说他的程序出现了偶发性CPU爆高,寻求如何解决,截图如下:我建议朋友用 procdump 在 cpu 高的时候连抓两个dump,这样分析起来比较稳健,朋友也如期的成功…