原文地址:关于Mysql thread_concurrency和innodb_thread_concurrency参数的一点整理html
首先,最重要的一点,这个参数已经在最新版本的mysql中被移除了,官方最新5.7版本的doc上面对thread_concurrency有这样的说明:
mysql
thread_concurrency变量是针对于Solaris 8及低版本的系统,设置了这个变量mysqld会调用thr_setconcurrency()函数。这个函数容许应用程序给同一时间运行的线程系统提示所需数量的线程。当前的Solaris 版本中这个参数已经没有做用了。这个参数在mysql 5.6.1中已经被标记为过期,在5.7.2版本的mysql中被移除。
sql
对于thread_concurrency参数,这里有两篇文章能够参考:
服务器
thread_concurrency doesn’t do what you expect
多线程
mysql中优化thread_concurrency的误区
并发
在 Mysql中事务隔离级别与binlog_format的一点理解中,咱们简单的介绍过mysql的两种存储引擎:MyISAM和InnoDB,InnoDB支持事务,也是平常开发中经常使用的存储引擎,在InnoDB中,咱们能够经过设置参数innodb_thread_concurrency限制线程的数量。
函数
先来看一下官方doc 14.13.5 Configuring Thread Concurrency for InnoDB对innodb_thread_concurrency参数的配置说明,翻译以下:
性能
InnoDB使用操做系统线程来处理用户的事务请求。(在事务提交或回滚以前可能给InnoDB引擎带来不少的请求)。在现代化操做系统和多核处理器的服务器,上下文切换是有效的,大多数工做负载运行没有任何并发线程数量的限制。在MySQL 5.5及以上版本中,MySQL作了可伸缩性的改进,它减小了这种在InnoDB内部限制并发执行线程数量的须要。
测试
它有助于在最小化的状况下进行线程之间的上下文切换,InnoDB可使用各类技术来限制操做系统并发执行线程的数量(所以大批量的请求能够在任何一个时间获得处理)。当InnoDB从用户会话收到一个新的请求,若是线程并发执行的数量达到预约义的限制,那么新的请求会先睡眠一段时间后再次尝试。在睡眠后不能按计划执行的请求会被放入先入/先出队列,并最终处理。那些等待获取锁的线程则不会被计入到并发执行线程的数量中。 咱们能够经过设置配置参数innodb_thread_concurrency来限制并发线程的数量,一旦执行线程的数量达到这个限制,额外的线程在被放置到对队列中以前,会睡眠数微秒,能够经过设定参数innodb_thread_sleep_delay来配置睡眠时间。
优化
在5.6.3以前的版本中,Mysql要求经过测试和实验找到innodb_thread_sleep_delay的最优值,这个最优值可能会因工做负载状况不一样而发生改变。在MySQL 5.6.3及更高版本中,你能够经过设置参数innodb_adaptive_max_sleep_delay为innodb_thread_sleep_delay设置最大容许的值,InnoDB会根据当前线程调度活动自动调整innodb_thread_sleep_delay的值,这种动态调整机制有助于工做的线程,在系统负载低时或系统接近满负荷运转时,都可以顺利的调度。
在MySQL 和 InnoDB以前的版本系列中,innodb_thread_concurrency的默认值,以及其隐含的限制并发线程执行的数量都进行过调整。在当前最新版本的mysql中,innodb_thread_concurrency的默认值为0,它表示默认状况下不限制线程并发执行的数量。
须要注意的是,InnoDB致使线程睡眠当且仅当并发线程的数量是有限的时候。若是对线程并发执行的数量没有限制,全部的请求都会被认为是可调度的,也就是说,若是innodb_thread_concurrency的值设置为0,innodb_thread_sleep_delay的值将会被忽略。
当有对线程数量进行限制(即innodb_thread_concurrency参数> 0),InnoDB经过容许多个请求在一个SQL语句执行过程当中进入InnoDB,而没必要遵照innodb_thread_concurrency设置的参数限额,来减小上下文的切换开销,当一个SQL语句(如join语句)包含在InnoDB的多行操做时,InnoDB会分配 指定数量的“入场券”,容许一个线程反复使用最小的开销。
当一个新的SQL语句开始,当前线程没有“入场券”,它就必须遵照innodb_thread_concurrency参数设置,一旦这个线程有权进入InnoDB,它会被分配一个“入场券”,它能够经过这个“入场券”用于随后进入InnoDB执行行操做,若是“入场券”使用完毕,该线程将会被驱逐,innodb_thread_concurrency参数会被放回到先入/先出队列中等待的线程等待再次观察。一旦这个线程再次有权进入InnoDB,“入场券”又会被从新分配,咱们能够经过设置全局参数innodb_concurrency_tickets来指定“入场券”的数量,默认状况下是5000。正在等待获取锁的线程,一旦锁可用,会被当即分配一个“入场券”。
这些参数的正确值取决于当前系统环境和负载状况。尝试各类不一样的值,以肯定哪些值适用于当前应用程序。在限制并发执行的线程数以前,在多核及多处理器的计算机上,检查一下InnoDB的配置参数是否能够改善性能,好比innodb_adaptive_hash_index。
对于innodb_thread_concurrency参数的做用及配置,这里有两篇文章能够参考:
innodb_thread_concurrency的做用与改良
在官方doc上,对于innodb_thread_concurrency的使用,也给出了一些建议,以下:
若是一个工做负载中,并发用户线程的数量小于64,建议设置innodb_thread_concurrency=0;
若是工做负载一直较为严重甚至偶尔达到顶峰,建议先设置innodb_thread_concurrency=128,并经过不断的下降这个参数,96, 80, 64等等,直到发现可以提供最佳性能的线程数,例如,假设系统一般有40到50个用户,但按期的数量增长至60,70,甚至200。你会发现,性能在80个并发用户设置时表现稳定,若是高于这个数,性能反而降低。在这种状况下,建议设置innodb_thread_concurrency参数为80,以免影响性能。
若是你不但愿InnoDB使用的虚拟CPU数量比用户线程使用的虚拟CPU更多(好比20个虚拟CPU),建议经过设置innodb_thread_concurrency 参数为这个值(也可能更低,这取决于性能体现),若是你的目标是将MySQL与其余应用隔离,你能够考虑绑定mysqld进程到专有的虚拟CPU。可是需 要注意的是,这种绑定,在myslqd进程一直不是很忙的状况下,可能会致使非最优的硬件使用率。在这种状况下,你可能会设置mysqld进程绑定的虚拟 CPU,容许其余应用程序使用虚拟CPU的一部分或所有。
在某些状况下,最佳的innodb_thread_concurrency参数设置能够比虚拟CPU的数量小。
按期检测和分析系统,负载量、用户数或者工做环境的改变可能都须要对innodb_thread_concurrency参数的设置进行调整。