文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  配置自旋锁轮询

17.8.8 配置自旋锁轮询

InnoDB 互斥量读写锁 通常保留用于短暂间隔。在多核系统中,线程在睡眠之前连续检查一段时间的互斥量或读写锁是否可用,可能会更高效。如果互斥量或读写锁在此期间可用,则线程可以立即继续,在同一时间片内。但是,多个线程过于频繁地轮询共享对象(如互斥量或读写锁),会导致 缓存乒乓,这会导致处理器使彼此的缓存部分失效。 InnoDB 通过强制在轮询之间随机延迟以使轮询活动不同步,最大限度地减少了此问题。随机延迟是通过自旋等待循环实现的。

自旋等待循环的持续时间由循环中发生的 PAUSE 指令数量决定。该数量是通过随机选择一个介于 0 到不包括 innodb_spin_wait_delay 值之间的整数,并将其乘以 50 生成的。例如,对于 innodb_spin_wait_delay 设置为 6,将从以下范围随机选择一个整数

{0,1,2,3,4,5}

所选整数乘以 50,产生六个可能的 PAUSE 指令值之一

{0,50,100,150,200,250}

对于这组值,250 是自旋等待循环中可能发生的 PAUSE 指令的最大数量。 innodb_spin_wait_delay 设置为 5 产生一组五个可能的 {0,50,100,150,200} 值,其中 200 是 PAUSE 指令的最大数量,依此类推。通过这种方式,innodb_spin_wait_delay 设置控制自旋锁轮询之间的最大延迟。

在所有处理器核心共享快速缓存内存的系统中,您可以通过设置 innodb_spin_wait_delay=0 来减少最大延迟或完全禁用繁忙循环。在具有多个处理器芯片的系统中,缓存失效的影响可能更大,您可能需要增加最大延迟。

在 100MHz Pentium 时代,innodb_spin_wait_delay 单位被校准为相当于一微秒。该时间等效性不成立,但在引入 Skylake 处理器系列之前,PAUSE 指令的持续时间在处理器周期方面相对于其他 CPU 指令而言保持相当恒定,该处理器系列的 PAUSE 指令相对较长。 innodb_spin_wait_pause_multiplier 变量提供了一种方法来解释 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_delayinnodb_spin_wait_pause_multiplier 变量是动态的。它们可以在 MySQL 选项文件中指定,或使用 SET GLOBAL 语句在运行时修改。在运行时修改变量需要设置全局系统变量的足够权限。请参阅 第 7.1.9.1 节,“系统变量权限”