mysql线程池 php_关于MySQL线程池资料整理–Percona Server

岳泉
2023-12-01

关于MySQL线程池资料整理–Percona Server

MySQL执行statement使用一个连接一个thread的方式,当连接数增加到某一个点,那么性能将会开始下降.

这个特性的作用就是无论有多少连接,thread pool都讲保证性能处于最好水平.

thread pool的原理主要是减少线程,减少上下文交换和锁资源争抢,针对OLTP环境特别有效.

为可以开启thread pool功能,请将thread_handling=pool-of-threads.

percona server实现的thread pool是在server级别,和oracle mysql的不一样(插件形式),另外一个不同点在于,percona的thread pool不尝试最小化并发事物数量.

优先连接调度:

在percona server 5.5.30,thread pool的优先连接调度已经实现,虽然线程池会限制并发执行的queries的数量,但是open的transactions依然可能很多.因为新开启的transaction

会跟在queue后面,高并发的transaction意味着很多当前运行的查询.为了增强性能,引入了thread_pool_high_prio_tickets参数.

这个参数控制进入高优先级队列的策略,对每个新连接分配可以进入高优先级队列的ticket,如果当一个query因为没有可用的线程导致执行延时,如果这个连接满足下面的条件可以

直接进入高优先级的队列.

1、这个连接有已经在执行的transaction

2、这个连接持有的ticket是非0的.

如果满足这两个条件,这个连接将被放到高优先级队列,并且ticket会被缩减.

也就是说,如果不满足上面的条件会被放入普通的queue.ticket的初始值就是thread_pool_high_prio_tickets参数指定的.

每次线程池寻找一个新的连接进行处理,首先检查高优先级队列,如果高优先级队列为空,将会把连接从普通队列放到高优先级队列.

这样做的目标就是减少服务器上正在进行的事务量,好处在于减少事务的运行时间,减少系统资源的等待.

基于某些自动提交或者需要使用低优先级队列的情况,我们提供thread_pool_high_prio_mode参数.

variable thread_pool_idle_timeout

Command Line: Yes

Config File: Yes

Scope: Global

Dynamic: Yes

Variable Type: Numeric

Default Value: 60 (seconds)

这个值用来设定线程空闲多久会将退出.

variable thread_pool_high_prio_mode

Command Line: Yes

Config File: Yes

Scope: Global, Session

Dynamic: Yes

Variable Type: String

Default Value: transactions

Allowed Values: transactions, statements, none

控制高优先级队列的模式.

transaction:只有已经开启事务的连接可以进入高优先级队列

statements:所有的statement都可以单独进入高优先级队列,不判断是否开启事务或者ticket的值.

none:禁止进入高优先级队列,主要针对监控之类的线程做设置.如果全局设置none的话,等同于statements.

variable thread_pool_high_prio_tickets

Command Line: Yes

Config File: Yes

Scope: Global, Session

Dynamic: Yes

Variable Type: Numeric

Default Value: 4294967295

对新建立的连接分配ticket值,如果当ticket值为0,那么将被禁止进入高优先级队列.

variable thread_pool_max_threads

Command Line: Yes

Config File: Yes

Scope: Global

Dynamic: Yes

Variable Type: Numeric

Default Value: 100000

限制pool里面最大的线程数量,如果达到这个限制,将不会创建新的线程.

variable thread_pool_oversubscribe

Command Line: Yes

Config File: Yes

Scope: Global

Dynamic: Yes

Variable Type: Numeric

Default Value: 3

该参数的值越高,可以同时运行多个线程,如果低于3的值可能会导致更多的睡觉和唤醒。

variable thread_pool_size

Command Line: Yes

Config File: Yes

Scope: Global

Dynamic: Yes

Variable Type: Numeric

Default Value: Number of processors

设置线程池可以同时使用CPU的线程数.

thread_pool_stall_limit

Command Line: Yes

Config File: Yes

Scope: Global

Dynamic: No

Variable Type: Numeric

Default Value: 500 (ms)

执行单个sql的超时时间,如果sql执行时间超过这个值,那么线程池将唤醒或者创建另外的线程开始工作.主要为long-running query设计.

状态值:

variable Threadpool_idle_threads

Command Line: Yes

Variable Type: Numeric

查看线程池中空闲的线程

variable Threadpool_threads

Command Line: Yes

Variable Type: Numeric

查看线程池中有多少线程

调优:

一般来说默认情况已经很好了.所以只需要对下面两个参数就可以了.

thread_handling = pool-of-threads #开启线程池

thread_pool_oversubscribe = 10 #这个值建议在3~20间

http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html

http://www.percona.com/blog/2014/01/29/percona-server-thread-pool-improvements/

http://imysql.com/2014/07/02/percona-thread-pool-benchmark-testing.shtml

 类似资料: