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

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

觉得文章有用?立即: 和朋友一起 共学习 共进步!

猜您喜欢

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>