mysql thread pool_MySQL线程池(THREAD POOL)的处理

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增加.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值