Innodb内核线程并发

Innodb内部并发工作机制。

Innodb_thread_concurrency变量是内部最大线程数,还有另外两个重要的参数

Innodb_thread_sleep_delay

Innodb_concurrency_tickets

解释一下他们是如何工作的

Mysql工作模式和其他数据库系统不一样,它是插件式存储引擎结构的,通常包含解析,优化和存储引擎。我们以存储引擎为出发点看看mysql是如何工作的,相比研究整个MYSQL要更容易一些。

Mysql调用存储引擎的方法:

read_row

这样的方法有好几个,例如:readby index(有序读)sequentialread(连续读)randomread(随机读)

write_row;
update_row;
delete_row; 具体函数参见源码。

要执行这些方法(函数),innodb需要检查innodb内部的线程计数,如果内部线程计数超过innodb_thread_concurrency,就等待innodb_thread_sleep_delay变量设置的微妙后再尝试进入。如果第二次仍然不成功-进入线程队列sleep(FIFO)。

为什么innodb使用两次尝试?

减少线程等待计数和降低上下文切换。

一但线程ENTERED(进入),就会得到innodb_concurrency_tickets票数,以便以后的innodb_concurrency_tickets变量次数线程都不会再次检测,可以免check进入。

该参数保持默认的500即可,没有太多意义,除非是在特定场合,比如你的数据库只有极少几个SQL,并且他们都以极高的并发线程在运行,那么出现重复的可能性才会超过500,而实际上,这几乎是不太可能的。

就像下面的代码描述一样:

这是国外的mysql牛人简化过的代码

if(thread->n_tickets_to_enter_innodb > 0)
{
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 > 0)
{
thread_sleep(innodb_thread_sleep_delay);
}

goto retry; // (only once)

WAIT_IN_FIFO_QUEUE;
thread->n_tickets_to_enter_innodb =innodb_concurrency_tickets;
ENTER;

完整的代码路径:srv_conc_enter_innodb function in innobase/srv/srv0srv.c

Same sql源码如此描述,一旦线程在获得ticket(srv_conc_enter_innodb)后,允许进入innodb内核执行同样SQL的次数。在这个次数内不会再次进行check验证。通过这种方式节约大量的信号操作。

说到这里不得不提一下INNODB的关闭:

如果下面的参数被设置为1,在关闭前我们不运行净化和插入缓冲合并。如果设置为2,关闭时不会把缓冲池刷新到数据文件:我们采用有效的手段使INNODB“崩溃”(但不丢失任何未提交的事务)。

ulint srv_fast_shutdown = 0; (源代码里面默认值是0,数据库默认值是1)

细细品味过这段代码,你会发现,对控制文件合理调整使用,再请一位善于控制SQL的DBA来审核代码,数据库是不会发生崩溃这么变态的事情的,负载过高的,顶多是慢一些。(加服务器呗,还想啥呢–)

那么什么是innodb_thread_concurrency最佳值?

这个值依赖许多因素,包括你的负载量,跑在什么样的硬件的软件上。如果你有1-2个CPU,你经常能做的很好,可以禁用它(innodb_thread_concurrency=0,从5.0.19开始还有更多的默认值)。多个CPU(4+CPU)的情况又有所不同。

MYSQL5.1以后对多核CPU支持改进了很多,将该值设置为0,或者2*CPU是一个比较好的注意。

waiting in InnoDB queue状态频繁出现,说明数据库并发太大,需要分析引起并发太大的原因或者增加数据库服务器(假设你根据硬件精确计算了该值)。

理论上你可以使用2*(NUMCPU+NUMDISKS)计算值以便能够激活2倍于CPU加磁盘的资源。然后在实际环境中,实践被证明,这个值并不是最优的。

如果正在使用innodb,这个值设置的小于CPU数量,mysql将不会利用到所有的CPU资源。

关于innodb_commit_concurrency

如你所见innodb_commit_concurrency仅用来保护行访问,使用内部结构和锁定分阶段提交,他仍是为保护变量。他限制innodb内核激活线程的commit。一个最佳的值也依赖很多其他因素。但是从5.1.36开始mysql不允许将该值设置为非0,该值只能为默认值0,mysql不限制并发提交。

如果没有电池保护,设置为innodb_flush_logs_at_trx_commit=1,但你可能想使用2或0。如果二进制日志被开启,他通常不重要,innodb会进行同步操作。

unix平台测试的结果:

日志刷新方法设置为O_DIRECT

innodb_flush_logs_at_trx_commit改参数的调整对性能和崩溃恢复数据丢失至关重要

1 2 0

提升130% 提升10

一般设置为2是一种平衡的方法,崩溃丢失1-2秒的数据,1只丢一条,但是十分影响性能,如果是在要求十分安全的应用中,建议为1,并且设置日志同步sync_log。

转载于:https://blog.51cto.com/shanks/1307640

Innodb内核线程并发机制相关推荐

  1. linux内核线程创建销毁机制

    这个话题乍一听貌似比较大,其实线程创建本身就是一件很平常的事情. 下面将要介绍的是,新版linux中创建内核线程的机制做了一些变化(其实本质没变,最终还是调用do_fork()来实现),和控制线程的时 ...

  2. 【Java 并发编程】线程池机制 ( 测试线程开销 | 启动线程分析 | 用户态 | 内核态 | 用户线程 | 内核线程 | 轻量级进程 )

    文章目录 一.测试线程开销 1.正常测试 2.不创建线程 3.只创建不启动线程 4.只启动不等待执行完成 二.分析测试结果 1.启动线程分析 2.用户线程与内核线程 3.轻量级进程 4.验证 Java ...

  3. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  4. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  5. JVM:高效并发机制——内存模型、线程、锁

    为什么要进行并发(多任务处理) 处理器能力很强,尽可能压榨其劳动力 处理器处理速度与存储和通信速度相差甚大(IO.网络通信.数据库访问非常耗时),使得处理器总处在等待的状态,浪费计算资源 物理机提高处 ...

  6. 判断线程是否执行完毕_Java并发编程 | 线程核心机制,基础概念扩展

    源码地址:GitHub || GitEE 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个 ...

  7. 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )

    文章目录 一.Linux 内核特性 1.Linux 内核组织形式 2.Linux 进程调度 3.Linux 内核线程 4.Linux 内核多平台虚拟内存管理 5.Linux 虚拟文件系统 6.Linu ...

  8. Java基础——线程及并发机制

    前言 在Java中,线程是一个很关键的名词,也是很高频使用的一种资源.那么它的概念是什么呢,是如何定义的,用法又有哪些呢?为何说Android里只有一个主线程呢,什么是工作线程呢.线程又存在并发,并发 ...

  9. Java并发编程(02):线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

最新文章

  1. C++查找算法(更新中)
  2. ICCV 2021 Best Paper | Swin Transformer何以屠榜各大CV任务!
  3. java url 生成图片_JAVA 通过URL生成水印图
  4. 关于 【通过代理访问】 的研究,【突破 IP ,“无限制”投票】
  5. maven-antrun-plugin - Target
  6. 五. 面向对象高级特性4. 接口的概念和使用
  7. 云漫圈 | 计数排序,你真的了解么?
  8. LeetCode 315. 计算右侧小于当前元素的个数(Count of Smaller Numbers After Self)
  9. 还是有点香!苹果官翻2018款iPad Pro及MacBook Air上架
  10. opencv 人脸识别_python基于openCV人脸识别18行代码实现
  11. day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
  12. 共享文件夹只能连接20人_英语正能量 | 快乐可以与人共享,苦难却只能自己坚强...
  13. 《OpenCV3编程入门》学习笔记九:直方图与匹配
  14. 人体时钟android,人体时钟屏保-不一样的阿拉伯数字时钟
  15. ArcMap(ArcGIS)批量裁剪图片【超详细】
  16. Kaggle--房价预测
  17. (附源码)springboot猪场管理系统 毕业设计 160901
  18. python实现运动模糊图像_OpenCV+Python实现图像运动模糊和高斯模糊!它是编程界的PS!...
  19. ZXing.Net条形码二维码标签编辑打印软件
  20. 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码

热门文章

  1. mysql5.7非源码版msi安装教程
  2. VMware workstation和ESXi的区别
  3. CSS 布局 - Overflow
  4. centos7安装mysql5.7视频_Centos7安装MySQL5.7版本详细步骤
  5. mysql多实例和主从区别_mysql多实例的安装以及主从复制配置
  6. R语言实现混频数据分析
  7. 谁说 JavaScript 简单的?
  8. 教育资源数字化 计算机和通讯,《计算机网络技术课程数字化资源开发研究》.doc...
  9. python mysql api_python mysql api
  10. ajax实现环境,基于jQuery实现的Ajax(Django环境)