10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.9 mb
PDF (A4)- 42.0 mb
手册页(TGZ)- 266.1 kb
手册页(邮政编码)- 376.0 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

15.8.8配置旋转锁轮询

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节“系统变量特权”