thread pool 介绍二

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

原来写过一个MariaDB thread pool介绍: http://www.mysqlsupport.cn/mariadb-thread-pool/

最近发现线上的数据库连接又有所增长,数据库的性能有点下降,所以又进一步的关注了一下thread pool.  大概总结如下:

Thread Pool根据系统的CPU创建出thread_pool_size(该参数不建议调整),也可以把这个参数理解为Thread Pool共分了多少Group, 每个Group里同时可以运行多少个任务由:thread_pool_oversubscribe控制,默认是3. 如果把thread_pool_oversubscribe设置为1,则thread_pool_size是同时允许的活跃任务数.每个Group都是一个epoll的对象.

 

Thread_pool_size  X  Thread_pool_oversubscribe = MySQL内部同时支持运行的最大任务数. 如MySQL-5.5128个任务时运行比较好时,CPU16个核,可以把Thread_pool_oversubscribe更改为: 8或是10都可以.

(实际生产中可以通过调Thread_pool_oversubscribe来防止memcache/Redis倒后的数据库雪崩问题)

Thread_pool现在在Percona中引入了优先级队列,新的连接会根据 thread_pool_high_prio_tickets排出优先级,可可以分为两个队列(这个有点类似于Innodb的tickets)目的是把连接接分一下优先级.

thread_pool_max_threads 用于控制thread pool最大允许有多少连接默认是100000.为了防止socket创建占用太多内存,可以把这个降低一点.

thread_pool_stall_limit 用于防止thread pool里的线程死掉.Thread pool里线程如果超过thread_pool_stall_limit声明的时间没响应降会重新创建.默认是500ms

特殊场景:

Thread pool里被占用满了.管理者操作太慢怎么办?

Thread pool提供一个特殊的参数: extra_port 去监听一个和服务端口不一样的端口,用于Thread pool被占满或是被锁着的情况下用于管理使用.

extra_max_connections 用于声明extra_port最大允许的连接.

这个功能也能用于防止MySQL连接数占满不能进入MySQL进行管理的问题.

 

我大概测了 1000, 2000这样规模的连接,如果不使用thread pool 都跑不起来. 使用thread pool后,性能测试表现都非常不错.

 

测试版本: Percona-Server-5.5.35  1G innodb buffer pool , Tpcc-mysql (20 warehouse)  1.9G数据大小.

普通PC机测试(4个core)

Threadpool配置:

thread_handling=pool-of-threads

thread_pool_oversubscribe=25

 

三次并发200, 1000,2000测试平均tpmC分别为: 3500tpmC, 3414tpmC, 3318tpmC

连接数多后也是有一定的性能下降,但这个下降还能接受. 对于应用连接比较多的场景thread-pool看来还是一个不错的功能.

2 Comments

Add a Comment

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

Time limit is exhausted. Please reload CAPTCHA.

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。