线程池的开源实现(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:

表单-登陆框

一、实现登陆框 1、用到【form】【caption】【table】【method】 2、用户名 <input type"text" name"uername"> 3、密码 <input type"password" name"mima"> 4、注册 <td aling"center" colspan"1"…

[译]9条关于高性能ElasticSearch的配置建议

原文链接:https://www.loggly.com/blog/nine-tips-configuring-elasticsearch-for-high-performance/Loggy使用ES作为其很多核心功能的搜索引擎. 如Jon Gifford在最近的文章ElasticSearch vs Solr中所述, 日志管理系统对搜索引擎有特别需求, 具体如下: 对于大规模的数据索引具有…

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

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

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

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

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

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

第27周六

今天去办理了公交卡转移保证金业务&#xff0c;又去送修了4s和n5两个手机&#xff0c;最后又陪她重新办了个移动卡&#xff0c;没有花10元去买什么卡槽&#xff0c;到中移动办业务那里自动给了卡槽试试没问题&#xff0c;后来又直接给补办了一张新卡&#xff0c;全新的设计能兼…

20杨氏矩阵查找

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

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

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

linux 监控命令free,简单了解Linux性能监控命令free

在系统遇到各种IO瓶颈&#xff0c;内存使用率高&#xff0c;cpu使用率高等问题时&#xff0c;我们如何来定位错误&#xff1f;linux提供了很多命令来协助我们快速定位到错误&#xff0c;free命令是Linux最常用的命令之一&#xff1a;它可以查看系统的内存状况&#xff0c;包括服…

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

1 、问题 编译Android项目&#xff0c;出现下面错误 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 开始&#xff0c;微软添加了一个 System.Net.Http.Json 的扩展&#xff0c;可以用来简化 HttpClient 的使用&#xff0c;看到在很多项目里还并未开始使用&#xff0c;所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

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

乐观锁的概念

乐观锁&#xff1a; 大多数是基于数据版本&#xff08;version&#xff09;的记录机制实现的。即为数据增加一个版本标识&#xff0c;在基于数据库表的版本解决方案中&#xff0c;一般是通过为数据库表添加一个“version”字段开实现读取数据时&#xff0c;将此版本号一同读出&…

.NET6之MiniAPI(十八):OpenAPI swagger

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

查看linux内存还剩多少g,Linux 查看存储空间、内存以及清除内存

查看存储空间&#xff1a;zdsubuntu ~ $ df -hl文件系统 容量 已用 可用 已用% 挂载点udev 972M 0 972M 0% /devtmpfs 199M 6.3M 192M 4% /run/dev/sda1 23G 5.3G 17G 25% /tmpfs 992M 212K 991M 1% /dev/shmtmpfs 5.0M 4.0K 5.0M 1% /run/locktmpfs 992M 0 992M 0% /sys/fs/cg…

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…

c/c++与java------之JNI学习(一)

一、java 调用c/c 步骤&#xff1a; 1、在java类中创建一个native关键字声明的函数 2、使用javah生成对应的.h文件 3、在c/c中实现对应的方法 4、使用vs2012创建一个win32空白项目&#xff0c;将jdk中的jni.h和jni_md.h文件拷贝到工程中&#xff0c;修改项目属性为&#xff08;…

BeetleX服务网关授权配置

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

关于Spring的事务Transactional,锁同步,并发线程

Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别&#xff0c;不同隔离级别对事务处理不同 。 未授权读取&#xff08;Read Uncommitted&#xff09;&#xff1a; 也称 未提交读。允许脏读取但不允许更新丢失&#xff0c;如果一个事务已经开始写数据则…