首页 > 其他分享 >InnoDB的并发线程配置

InnoDB的并发线程配置

时间:2023-06-14 18:11:09浏览次数:55  
标签:线程 thread 并发 InnoDB concurrency innodb


InnoDB使用操作系统线程来处理用户事务的请求。(事务在提交或回滚之前可能会向InnoDB发出许多请求)在具有多核处理器的现代操作系统和服务器上,上下文切换非常高效,大多数工作负载都可以很好地运行,而不会限制并发线程的数量。

在有助于最小化线程之间的上下文切换的情况下,InnoDB可以使用一些技术来限制并发执行的操作系统线程的数量(从而限制任何时候正在处理的请求的数量)。当InnoDB从一个用户会话接收到一个新的请求时,如果并发执行的线程数量超过预先定义的设置数量,这个新的请求在再次尝试之前会休眠一小段时间。在休眠之后无法重新调度的请求,会放入先进先出队列并最终处理。等待锁的线程不计入并发执行线程的数量。

可以通过设置配置参数innodb_thread_concurrency来限制并发线程的数量。一旦执行线程的数量达到了这个限制,额外的线程在进入队列之前会睡眠数微秒,睡眠时间由配置参数innodb_thread_sleep_delay设置。

你可以将配置选项innodb_adaptive_max_sleep_delay设置为允许innodb_thread_sleep_delay的最大值,InnoDB会根据当前的线程调度活动自动调整innodb_thread_sleep_delay的上下浮动。这种动态调整有助于线程调度机制在系统轻载和接近满负荷运行时平稳地工作。

在MySQL和InnoDB的不同版本中,innodb_thread_concurrency的默认值和默认的并发线程数限制都发生了变化。innodb_thread_concurrency的默认值是0,所以默认情况下没有并发执行线程的数量限制。

InnoDB只在并发线程数量受限时才会让线程休眠。当线程数量没有限制时,所有线程都平等地竞争调度。也就是说,如果innodb_thread_concurrency为0,那么innodb_thread_sleep_delay的值将被忽略。

当有线程数限制时(当innodb_thread_concurrency为>0时),InnoDB通过允许在单个SQL语句执行期间产生的多个请求进入InnoDB,而不遵守innodb_thread_concurrency设置的限制来减少上下文切换开销。由于在InnoDB中,一条SQL语句(例如join)可能包含多个行操作,因此InnoDB会分配指定数量的"tickets",允许以最小的开销重复调度一个线程。

当一个新的SQL语句启动时,线程没有ticket,它必须观察innodb_thread_concurrency。一旦线程有权进入InnoDB,它会被分配一些tickets,用于随后进入InnoDB执行行操作。如果tickets用完,线程会被移除,然后再次观察innodb_thread_concurrency,这可能会将线程放回到等待线程的先进/先进队列中。当线程再次有权进入InnoDB时,tickets再次被分配。分配的tickets数量由全局选项innodb_concurrency_tickets指定,默认为5000。一旦锁可用,等待锁的线程就会得到一个ticket。

这些变量的正确值取决于您的环境和工作负载。尝试一系列不同的值,以确定哪些值适合你的应用程序。在限制并发执行的线程数量之前,请检查可能在多核多处理器计算机上提高InnoDB性能的配置选项,例如innodb_adaptive_hash_index。

标签:线程,thread,并发,InnoDB,concurrency,innodb
From: https://www.cnblogs.com/abclife/p/17481028.html

相关文章

  • 《Java并发编程的艺术》pdf电子书免费下载
    《Java并发编程的艺术》正是为了解决这个问题而写的。书中采用循序渐进的讲解方式,从并发编程的底层实现机制入手,逐步介绍了在设计Java并发程序时各种重要的技术、设计模式与应用,同时辅以丰富的示例代码,使得开发人员能够更快地领悟Java并发编程的要领,围绕着Java平台的基础并发功能......
  • go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制2
    上一节我们完成了数据的存储和索引,本节我们看如何写入数据和进行查询。我们将创建一个Segment对象,它一方面接收发送来的请求,也就是Record数据结构,然后将数据写入到store和index,基本架构如下:在前面章节中,我们使用代码定义了Record的数据结构,现在我们需要使用protobuf来重新定义它,一......
  • GO实现高可用高并发分布式系统:gRPC实现客户端与服务端的一对一通讯
    分布式系统的特点是不同的功能模块会以独立服务器程序的方式运行在不同主机上。当服务A想请求位于另一台机器的服务B完成特定请求时,就必须将要处理的数据提交给B。这个过程就涉及到一系列问题,首先A需要把数据进行序列化然后通过网络连接发送给B,B接收到数据后需要进行反序列化得到数......
  • go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制1
    上一节我们实现了日志微服务,它以http服务器的模式运行,客户端通过json方式将日志数据post过来,然后通过httpget的方式读取日志。当时我们的实现是将所有日志信息添加到数组末尾,这意味着所有日志信息都会保存在内存中。但分布式系统的日志数量将非常巨大,例如推特一天的日志数量就达到......
  • 驱动开发:内核ShellCode线程注入
    还记得《驱动开发:内核LoadLibrary实现DLL注入》中所使用的注入技术吗,我们通过RtlCreateUserThread函数调用实现了注入DLL到应用层并执行,本章将继续探索一个简单的问题,如何注入ShellCode代码实现反弹Shell,这里需要注意一般情况下RtlCreateUserThread需要传入两个最重要的参数,一个是......
  • v831-openwrt-c-多线程、队列篇
    前言这几天都在搞多线程和队列,但是最后发现由于v831的单核,用了多线程和队列还不如不用,并且吐槽一下c的线程和队列库,特别队列库很难用。线程库#include<pthread.h>      //系统的多线程文件使用条例:使用的很简单,网上的说明很清楚,不需要详细说明指向感悟很鸡肋......
  • Java多线程与静态方法
    Java多线程与静态方法在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题? publicclassTest{publicstaticvoidoperation(){//...dosomething}} 事实证明只要在静态函数中没有处理多......
  • java并发之CAS(Compare and swap)
    1.简介CAS的底层调用native方法,最终是利用CPU的一个特殊指令,该指令由CPU保证了原子性,而且包含多个操作,比如先比较再更新。原理:(1)需要读写的内存值(V)、原值(A)和新值(B)。如果V的值与原值A相匹配,那么把B设置给V,否则处理器不做任何操作。(2)无论哪种情况,都返回V内存值。(3)原子类里,当......
  • Java并发之 Lock 锁
    一、Lock接口1Lock简介&地位&作用锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,但是使用和功能上又有较大的不同Lock接口最常见的实现类就是ReentrantLock通常情况下Lock只允许一个线程访问共享资源,特殊情况也允......
  • Java并发之原子类
    一、原子类简介1什么是原子类Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法。原子性的意思是对于一组操作,要么全部执行成功,要么全部执行失败,不能只有其中某几个执行成功。在多线程的情况下能够保证操作不会被中断,从而能保证并发安......