innodb内部的并发线程
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内部的并发线程的更多相关文章
- MySQL InnoDB配置并发线程( innodb_thread_concurrency)
http://www.ywnds.com/?p=9821 一.thread_concurrency 首先,最重要的一点,这个参数已经在最新版本的MySQL中被移除了,官方最新5.7版本的doc上面对t ...
- MySQL系列:innodb源代码分析之线程并发同步机制
innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
- 14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发 InnoDB 使用操作系统threads 来处理用户的事务请求.(事务可以执行 ...
- Java 并发 线程同步
Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...
- Java高并发--线程安全策略
Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...
- MySQL--InnoDB并发线程控制
InnoDB并发线程控制 MySQL InnoDB存储引擎提供innodb_thread_concurrency来控制进入InnoDB 存储引擎的线程数,以限制InnoDB存储引擎层的并发量. 当in ...
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...
- Java并发—线程池框架Executor总结(转载)
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...
随机推荐
- 《JAVA NIO》第一章 简介
1.2 CPU已不再是束缚 相反,是JVM 自身在I/O 方面效率欠佳.操作系统与Java 基于流的I/O模型有些不匹配. 操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA) ...
- oracle 循环语句
1.基本循环(至少会执行一次) DECLARE I ; BEGIN LOOP --循环开始 DBMS_OUTPUT.PUT_LINE('VALUE:'||I); ; --退出循环条件: I:; --循 ...
- 项目重新部署后报The attribute required is undefined for the annotation type XmlElementRef
在另外一台机器上部署项目,项目导进Eclipse中发现有异常 public class BooleanFeatureType extends FeatureBaseType{ @XmlElementR ...
- [BS-01] 根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高
根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高 1. 影响昵称Label的高和宽的因素: 字体和字号大小.文字多少.高度取决于是否固定了宽度(是否限制了最大的宽度和高度) 2. 使用 ...
- Ninject简单的Demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- android点滴之ViewTreeObserver
一类的基本概念 这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知.这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等.最常见的用途时通过监听获知什 ...
- 学习 Log4net
遇到问题: 开发机器:WINDOWS 8, 英文版, 64位 在实际使用中发现,写在文件中的中文全部变成乱码(变成问号). 解决方法: <appender name="FileAppe ...
- Singlton设计模式
单例定义: 确保一个类只有一个实例,并提供全局访问点. 适用场景: 1.) 当系统中某个类必须仅有一个实例对象,同时访问该系统的所有访问者必须访问同一个实例对象时,且该对象实例自身占用资源又不大时. ...
- Leetcode: String to Integer
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- ADO.net 实体类 、数据访问类
程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...