关于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