InnoDB
互斥锁而且rw-locks通常只在短时间内使用。在多核系统上,对于线程来说,在休眠之前连续检查它是否可以获得一段时间内的互斥锁或rw-lock会更有效。如果互斥锁或rw-lock在此期间可用,线程可以在同一时间片中立即继续。但是,多线程过于频繁地轮询共享对象(如互斥锁或rw-lock)会导致”缓存乒乓球”,这会导致处理器使彼此缓存的部分失效。InnoDB
通过强制轮询之间的随机延迟来取消轮询活动的同步,可以将此问题降到最低。随机延迟被实现为一个自旋等待循环。
自旋等待循环的持续时间由循环中出现的PAUSE指令的数量决定。该数字是通过随机选择一个从0到但不包括的整数生成的innodb_spin_wait_delay
值,并将该值乘以50。(乘数值50在MySQL 8.0.16之前是硬编码的,之后可以进行配置。)例如,从以下范围中随机选择一个整数innodb_spin_wait_delay
设置6:
{0, 1, 2, 3, 4, 5}
选择的整数乘以50,得到六个可能的PAUSE指令值之一:
{0, 50100150200250}
对于这组值,250是在自旋等待循环中可以出现的PAUSE指令的最大数量。一个innodb_spin_wait_delay
设置5会得到一个由5个可能值组成的集合{0, 50100150200}
,其中200是PAUSE指令的最大数量,以此类推。通过这种方式,innodb_spin_wait_delay
设置控制自旋锁轮询之间的最大延迟。
在所有处理器核心共享一个快速缓存内存的系统上,您可以通过设置来减少最大延迟或完全禁用忙循环innodb_spin_wait_delay = 0
.在具有多个处理器芯片的系统上,缓存失效的影响可能更显著,您可能会增加最大延迟。
在100MHz的奔腾时代,一个innodb_spin_wait_delay
单位被校准为相当于一微秒。这种时间等价并不成立,但是在处理器周期方面,PAUSE指令的持续时间相对于其他CPU指令保持相当恒定,直到Skylake一代处理器的引入,这一代处理器具有相对较长的PAUSE指令。的innodb_spin_wait_pause_multiplier
变量在MySQL 8.0.16中被引入,提供了一种解释PAUSE指令持续时间差异的方法。
的innodb_spin_wait_pause_multiplier
变量控制PAUSE指令值的大小。例如,假设innodb_spin_wait_delay
设置为6,减小innodb_spin_wait_pause_multiplier
从50(默认值和之前硬编码的值)到5生成一组更小的PAUSE指令值:
{0、5、10、15、20、25}
增加或减少PAUSE指令值的能力允许进行微调InnoDB
对于不同的处理器架构。例如,较小的PAUSE指令值适用于具有相对较长的PAUSE指令的处理器架构。
的innodb_spin_wait_delay
而且innodb_spin_wait_pause_multiplier
变量是动态的。可以在MySQL选项文件中指定它们,也可以在运行时使用集全球
声明。在运行时修改变量需要足够的权限来设置全局系统变量。看到第5.1.9.1节“系统变量特权”.