概述
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增加.
线程池配置
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_thread_handling
http://get.jobdeer.com/907.get
show variables like '%handling%';
+-----------------+---------------------------+
| Variable_name | Value |
+-----------------+---------------------------+
| thread_handling | one-thread-per-connection |
mariadb线程池配置方法:
[mysqld]
thread_handling=pool-of-threads
oracle企业版线程池配置方法:
thread pool的组件和安装:
查看mysql己安装的插件
select * from INFORMATION_SCHEMA.PLUGINS;
SHOW PLUGINS
插件安装目录:
/usr/local/mysql/lib/plugin
安装插件
[mysqld]
plugin-load=thread_pool=thread_pool.so
或
[mysqld]
plugin-load=thread_pool.so
plugin-load=thread_pool=thread_pool.so;tp_thread_state=thread_pool.so;tp_thread_group_state=thread_pool.so;tp_thread_group_stats=thread_pool.so
查看确认:
SHOW PLUGINS;
show variables like '%handling%';
show variables like '%thread%';
最后
以上就是精明冰棍为你收集整理的mysql 线程池测试_MySQL线程池测试的全部内容,希望文章能够帮你解决mysql 线程池测试_MySQL线程池测试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复