mysql 的thread pool

来源:互联网 发布:软件测试佩腾 编辑:程序博客网 时间:2024/06/15 07:52

什么是thread pool

Mysql为一个客户端连接分配一个线程,然而频繁的连接请求会消耗大量的CPU资源,而线程池通过缓存并重用线程可有效解决这一问题;

Thread pool plugin提供此功能,但其为商业版5.5.16所提供;

 

功能

重用thread stack,保证其一直位于cpu cache而不被踢出,可以更加高效的利用CPU cache

mysql服务器端限制并发执行的线程数,减轻context switch的消耗,同时为OS调度器降压;

并行事务过多会导致mutex竞争,而thread pool可通过限制并行的线程数避免这一点

 

原理

客户端连接 à thread pool à 服务器线程

对两者进行映射,且对应关系不固定 ,服务器线程负责执行从客户端传来的sql

 

基本单位为线程组,每组包含一个监听线程和执行线程(有可能多个),前者负责接受客户端传来的sql,后者负责执行;

当接受到新sql时,如果此时没有其他sql则由监听线程立即执行,此期间该组暂时无监听,如果sql执行时间过长,则线程池为其分配一个新的监听线程;否则排队等待;

 

每组包含两个执行对列,low-prioritylow-priority,优先执行high-priority队列;

事务的第一个sql进入low-priority,而其后续sql则被放入high-priority

非事务引擎或启动auto_commit时,所有sql都被当作low-priority,如果innodbMyisam混合使用,则优先执行innodb相关语句;

sqllow-priority等待超过thread_pool_prio_kickup_timer,则被移到high-priority

 

 

线程池包含若干线程组,每组包含一系列客户端连接,采用round-robin分配机制;

理论上讲,一个线程组一次只能由1个执行线程,但会根据实际情况自动调整:

每个组各有一个监听thread,用于接收客户端传来的sql,;如果是立即执行则由监听thread负责,此期间该组暂时无监听thread,如果该sql执行时间过长,则线程池为其分配一个新的监听thread;线程池有个后台进程专门健康各组工作状态;

线程池启动时为每个组会创建一个监听thread

每个组包含两个队列,high

 

参数

Thread_pool_size:线程组数量,决定同时可执行的语句数;默认16,候选值1-645.5.16后才引入此值;对于Innodb,候选值范围16-36;而MyISAM可降低为4-8

Thread_pool_algorithm:管理线程池的算法;0默认值,采用保守的低并发算法;1采用相对激进算法,增加并发性;5.5.16后才引入此值;

Thread_pool_high_priority_connection0默认值,等待执行的语句使用低优先级和高优先级两个队列;1只使用高优先级队列;5.5.16后才引入此值;

Thread_pool_max_unused_threads:最大非活动线程数;0(默认值)无限制,最大4096;非活动线程可含有1个消费者线程和其他保留线程,其中消费者线程优先被唤醒;5.5.16后才引入此值;

Thread_pool_stall_limit:以10ms为单位,默认60ms范围值4-600,每个语句的时间片大小,一旦耗完则挂起将CPU交于其他线程;5.5.16后才引入此值;

Thread_pool_prio_kickup_timerlow-priority移到high-priority所需等待时间,单位毫秒,默认为10001秒;

 

理论上讲,服务器支持的最大线程数=max_connections + thread_pool_size,即所有连接都处于执行模式,且每个线程组又有1个监听thread

 

thread_cache_size定义重用线程的最大个数,当客户端退出时其对应的thread保留以待后续的连接使用,但其无法控制并非执行的线程数

http://dev.mysql.com/doc/refman/5.5/en/thread-pool-plugin.html

 

为客户端连接池,省去了创建线程的资源消耗,但无法控制线程争用CPU和数据库mutex;而thread pool用来控制服务器不会过载;

Thread_cache_size:线程缓存大小,当有客户端退出时将其线程放入缓存以供新的连接使用;对于连接繁忙的数据库可提升性能;

0 0