mysql 的thread pool
来源:互联网 发布:软件测试佩腾 编辑:程序博客网 时间:2024/06/15 07:52
什么是thread pool
Mysql为一个客户端连接分配一个线程,然而频繁的连接请求会消耗大量的CPU资源,而线程池通过缓存并重用线程可有效解决这一问题;
Thread pool plugin提供此功能,但其为商业版5.5.16所提供;
功能
1 重用thread stack,保证其一直位于cpu cache而不被踢出,可以更加高效的利用CPU cache;
2 在mysql服务器端限制并发执行的线程数,减轻context switch的消耗,同时为OS调度器降压;
3 并行事务过多会导致mutex竞争,而thread pool可通过限制并行的线程数避免这一点
原理
客户端连接 à thread pool à 服务器线程
对两者进行映射,且对应关系不固定 ,服务器线程负责执行从客户端传来的sql
基本单位为线程组,每组包含一个监听线程和执行线程(有可能多个),前者负责接受客户端传来的sql,后者负责执行;
当接受到新sql时,如果此时没有其他sql则由监听线程立即执行,此期间该组暂时无监听,如果sql执行时间过长,则线程池为其分配一个新的监听线程;否则排队等待;
每组包含两个执行对列,low-priority和low-priority,优先执行high-priority队列;
事务的第一个sql进入low-priority,而其后续sql则被放入high-priority;
非事务引擎或启动auto_commit时,所有sql都被当作low-priority,如果innodb和Myisam混合使用,则优先执行innodb相关语句;
若sql在low-priority等待超过thread_pool_prio_kickup_timer,则被移到high-priority;
线程池包含若干线程组,每组包含一系列客户端连接,采用round-robin分配机制;
理论上讲,一个线程组一次只能由1个执行线程,但会根据实际情况自动调整:
每个组各有一个监听thread,用于接收客户端传来的sql,;如果是立即执行则由监听thread负责,此期间该组暂时无监听thread,如果该sql执行时间过长,则线程池为其分配一个新的监听thread;线程池有个后台进程专门健康各组工作状态;
线程池启动时为每个组会创建一个监听thread;
每个组包含两个队列,high
参数
Thread_pool_size:线程组数量,决定同时可执行的语句数;默认16,候选值1-64;5.5.16后才引入此值;对于Innodb,候选值范围16-36;而MyISAM可降低为4-8;
Thread_pool_algorithm:管理线程池的算法;0默认值,采用保守的低并发算法;1采用相对激进算法,增加并发性;5.5.16后才引入此值;
Thread_pool_high_priority_connection:0默认值,等待执行的语句使用低优先级和高优先级两个队列;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_timer:low-priority移到high-priority所需等待时间,单位毫秒,默认为1000即1秒;
理论上讲,服务器支持的最大线程数=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:线程缓存大小,当有客户端退出时将其线程放入缓存以供新的连接使用;对于连接繁忙的数据库可提升性能;
- mysql 的thread pool
- MySQL线程池(THREAD POOL)的处理
- MySQL线程池(THREAD POOL)的原理
- MySQL线程池(THREAD POOL)的原理
- MySQL thread pool
- MySQL Thread pool 操作过程
- MySQL学习分享--Thread pool
- mysql thread pool 问题排查
- MySQL为什么要引入Thread Pool的线程处理模式
- C 的 Thread Pool 筆記
- MySQL学习分享--Thread pool实现
- Thread Pool
- Thread Pool
- Thread Pool
- thread pool
- thread pool
- thread pool
- thread pool
- 内存泄漏-Delete不调用析构函数的两种情况
- solr的schema配置优化
- Web前端持续集成方案(三)
- iOS 9适配技巧(更新版)
- python打开自已配置的firefox
- mysql 的thread pool
- Android基础入门教程——2.5.2 Notification(状态栏通知)详解
- jQuery之滑动
- Android绘图机制(四)自定义控件
- HTTP返回码总结
- jQuery中click和onclick的区别
- Leetcode#8 String to Integer (atoi) $corner case
- 虚拟存储子系统调整
- js的事件代理和事件冒泡