配置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
向上或向下调整。这种动态调整有助于线程调度机制在系统轻负载和接近满负荷运行时平稳运行。
innodb_thread_concurrency
MySQL和.NET的各种版本中,并发线程数的默认值和隐含的默认限制已更改InnoDB
。默认值innodb_thread_concurrency
是0
,那么在默认情况下有上并行执行的线程的数量没有限制。
InnoDB
仅当并发线程数受到限制时,线程才会进入睡眠状态。当线程数没有限制时,所有线程均平等地争用调度。也就是说,如果innodb_thread_concurrency
为0
,innodb_thread_sleep_delay
则忽略的值。
当存在于线程的(当数量的限制innodb_thread_concurrency
是> 0),InnoDB
减少上下文通过允许的执行过程中进行多个请求切换开销单个SQL语句输入InnoDB
不遵守由限制集合innodb_thread_concurrency
。由于SQL语句(例如连接)可能在内包含多个行操作InnoDB
,因此InnoDB
分配了指定数量的“票证”,这些票证允许以最小的开销重复调度线程。
当新的SQL语句启动时,线程没有票证,并且必须遵守innodb_thread_concurrency
。线程有权进入后InnoDB
,将为其分配许多票证,可将其用于后续进入InnoDB
以执行行操作。如果票证用完,线程将被逐出,并innodb_thread_concurrency
再次被观察到,这可能会将线程放回到等待线程的先进先出队列中。当线程再次有权进入时InnoDB
,将再次分配票证。分配的票证数量由全局选项指定innodb_concurrency_tickets
,默认情况下为5000。一旦锁可用,等待锁的线程将获得一张票。
这些变量的正确值取决于您的环境和工作量。尝试各种不同的值,以确定哪种值适用于您的应用程序。在限制并发执行的线程数之前,请参见可提高InnoDB
多核和多处理器计算机上的性能的配置选项,例如innodb_adaptive_hash_index
。
有关MySQL线程处理的一般性能信息,请参见“ MySQL如何处理客户端连接”。