1. innodb_thread_concurrency

innodb有一系列的计数器来统计和控制内部的工作线程。其中最重要的一个是innodb_thread_concurrency,和它相关的innodb_thread_sleep_delay 和innodb_concurrency_tickets。

由于MySQL是插件式db,读取行的时候可以有很多方式,比如说顺序读or随机读,而DML(insert,delete,update)语句是要判断是否已经进入到了innodb线程里,如果超过了 innodb_thread_concurrency的值,首先要等innodb_thread_sleep_delay ms后尝试再次进入工作线程,如果失败,则会进入到FIFO队列等待唤醒。这里要提下为什么需要两次尝试?因为需要减少等待线程的个数和上下文切换的次数。

如果一个线程能够进到innodb层,则会发放一个innodb_concurrency_tickets 票,下次的时候如果在有效期内,则不会检查tickets,代码很简单,在 srv_conc_enter_innodb function in innobase/srv/srv0srv.c里:

if (thread->n_tickets_to_enter_innodb  > )
{
thread->n_tickets_to_enter_innodb--;
ENTER;
} retry:
if (entered_thread < innodb_thread_concurrency)
{
entered_threads++;
thread->n_tickets_to_enter_innodb = innodb_concurrency_tickets;
ENTER;
} if (innodb_thread_sleep_delay > )
{
thread_sleep(innodb_thread_sleep_delay);
} goto retry; // (only once) WAIT_IN_FIFO_QUEUE;
thread->n_tickets_to_enter_innodb = innodb_concurrency_tickets;
ENTER;

那么innodb_thread_concurrency最佳值是多少呢?在MySQL5.6之前建议要比cpu的核数小

理论上可以设置2*(NumCPUs+NumDisks),这样就有每个cpu和磁盘分配2倍的active threads,但是这仅仅是理想情况。根据实践,一般在8核cpu推荐设置1,2,4;如果这个值远远比cpu个数少的话就会不能充分利用cpu,这样线程就会在进入innodb的队列之前sleep一段时间。

2. innodb_commit_concurrency

innodb_thread_concurrency限制行的并发度,但是在提交阶段(innodb的结构和锁争用很严重的),缺没有得到很好的保护。MySQL从5.0就开始引进的innodb_commit_concurrency,

Command-Line Format --innodb_commit_concurrency=#
Option-File Format innodb_commit_concurrency
System Variable Name innodb_commit_concurrency
Variable Scope Global
Dynamic Variable Yes
  Permitted Values
Type numeric
Default 0
Range 0 .. 1000

这个参数设置了同一时刻允许同时commit的线程数。默认是0,也即是不限制。这个值可以在0到1000随意设置,如果刚开始是0,要想设置>0,必须在配置文件里添加:

innodb_commit_concurrency=n(n>0),在n>0的情况下可以设置(0~1000]的范围变化,但是不能动态的设置成0,也不能动态的设置为n,必须重启MySQL;

这个值一般场景下,不限制(为0)就能满足需求,但是0并不是适用于所有的场景,对于大量写场景,对性能提升还是很明显的。

参考:http://www.mysqlperformanceblog.com/2006/06/05/innodb-thread-concurrency/

innodb内部的并发线程的更多相关文章

  1. MySQL InnoDB配置并发线程( innodb_thread_concurrency)

    http://www.ywnds.com/?p=9821 一.thread_concurrency 首先,最重要的一点,这个参数已经在最新版本的MySQL中被移除了,官方最新5.7版本的doc上面对t ...

  2. MySQL系列:innodb源代码分析之线程并发同步机制

    innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...

  3. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

  4. 14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发

    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发 InnoDB 使用操作系统threads 来处理用户的事务请求.(事务可以执行 ...

  5. Java 并发 线程同步

    Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...

  6. Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...

  7. MySQL--InnoDB并发线程控制

    InnoDB并发线程控制 MySQL InnoDB存储引擎提供innodb_thread_concurrency来控制进入InnoDB 存储引擎的线程数,以限制InnoDB存储引擎层的并发量. 当in ...

  8. 线程并发线程安全介绍及java.util.concurrent包下类介绍

    线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...

  9. Java并发—线程池框架Executor总结(转载)

    为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...

随机推荐

  1. 文明3地图之二-大n型地图

    存档文件:http://files.cnblogs.com/files/xiandedanteng/civ3bigN20160214.rar 地图: 简介: 这份地图几乎没有岛屿,整块大陆都连在一起像 ...

  2. Download InstallShield Limited Edition for Visual Studio 地址

    http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?lang=10 ...

  3. 使用for打印小九九

    使用shell的for语法打印小九九 #!/bin/bash `;do `;do if [ $a -ge $b ];then echo -en "$a x $b = $(expr $a \* ...

  4. SqlServer基础:游标

    记录下今天用到的游标: DECLARE @TempID INTDECLARE @Number INTSET @Number=1DECLARE myCursor CURSOR FOR     SELEC ...

  5. 30天,APP创业从0到1【7.25上海站】

    活动概况 时间:2015年7月25日13:30-16:30 地点:太库•上海孵化器(张江金科路2889号长泰广场c座12楼) 主办:APICloud.诸葛.圣诺资讯 联合主办:微链.太库•上海孵化器 ...

  6. .net平台下深拷贝和浅拷贝

    在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的. ...

  7. php sql分离

    sql.php <?php $con = mysql_connect("localhost","root","root"); mysq ...

  8. eclipse中运行Selenium遇到的问题

    1.   java.lang.NoClassDefFoundError: 解决方法:eclipse的java工程中导入selenium-java-2.44.0\selenium-2.44.0\libs ...

  9. 用仿ActionScript的语法来编写html5——第八篇,图片处理+粒子效果

    用仿ActionScript的语法来编写html5系列开发到现在,应该可以做出一些东西了,下面先来研究下图片的各种效果预览各种效果看下图效果和代码看这里,看不到效果的请下载支持html5的浏览器 ht ...

  10. iOS NSUserDefaults的基本使用

    /** * NSUserDefaults可以进行轻量级的数据存储 * NSUserDefaults支持的数据类型: NSString, NSNumber, NSDate, NSArray, * NSD ...