Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2803038
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Mysql/postgreSQL

2015-01-08 21:09:59

                MySQL线程池(THREAD POOL)的处理

    在默认的MySQL的连接模型中,一个连接对应一个MySQL服务器的线程来处理连接请求(
很类似于oracle的专用服务器连接),在某些情况这种配置可能会导致一些问题,比如以下情形:

1,服务器同时太多活动连接线程,而cpu个数有限,会导致CONTEXT SWITCH十分严重,
同时太多的进程在可运行队列中等待,主机负载超高.对系统是一个很大压力;

2,当太多的活动线程执行innodb代码时,innodb本身又会为引发扩展性的
问题,比如mutex争用等.虽然用innodb_thread_concurrency虽然也可以
限制innodb活动的线程数,但也是有自己的争用部分,而且不能限制同时
并发的事务数,在测试中发现即使用innodb_thread_concurrency来限制,主机的
CONTEXT SWITCH也会超高.

3,在某些时些我们想通过在服务器上做一定的限制,让MySQL服务器只处理一定的
请求,而让其他的请求在等待而不至于同时在服务器产生大量活动进程,而使服务器
被拖死,实现类似限速的效果.

 目前实现的线程池的主要有MySQL企业版(以plugin方式实现),Maridb和Percona的版本.

    通过定义thread_handling参数来实现连接方式的更改,默认的值为one-thread-per-connection,
表示一个连接一个线程,而值pool-of-threads(以PERCONA的版本为例),表示使用线程池的方式.

    当使用连接池的方式以后,服务器创建由参数thread_pool_size定义的线程组个数,每个线程
组正常情况下对应一个或零个活动的线程.默认该参数等于逻辑CPU数量.当客户端连接请求到达时,
会以简单随机分配的方式分配给一个线程组.

     正常的情况下在一个线程组中存在的线程叫个listener thread.当连接的语句请求到达时,这个时
候如果队列没有其他语句在等待时,这个listener thread会立即执行这个语句,然后返回.在一些情
况下,比如当前活动的线程在等待IO或是锁时,超过一定的阀值这个线程就会被定义成STALLED,而当
另一个连接请求到达线程组时,线程组会启动另一个线程来服务,从而避免单个线程执行太长时间
而使其他的连接请求在持续等待,这个参数是由thread_pool_max_threads来控制,默认是500ms.


    在服务器是4个逻辑cpu的配置中,使用sysbecn测试发起的线程为128时,发现CONTEXT SWITCH十分频繁,
达到了35k-40k左右.而当使用了thread pool后,thread_pool_size设置为4,CONTEXT SWITCH的数量
仅在2k-3k左右,CONTEXT SWITCH下降非常明显.使用了thread pool的综合性能大约提高有5%左右.

 
     默认的thread_pool_size等于逻辑cpu个数尽量不要去更改,对于加大这个参数没有太多的意义,当在
4的服务器上测试,设置为8,16等值时,带来的只有QPS下降和CONTEXT SWITCH增加.

 


 

阅读(4543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~