InnoDB
互斥锁而且rw-locks通常只在短时间内使用。在多核系统上,对于线程来说,在休眠之前连续检查它是否可以获得一段时间内的互斥锁或rw-lock会更有效。如果互斥锁或rw-lock在此期间可用,线程可以在同一时间片中立即继续。但是,多线程过于频繁地轮询共享对象(如互斥锁或rw-lock)会导致”缓存乒乓球”,这会导致处理器使彼此缓存的部分失效。InnoDB
通过强制轮询之间的随机延迟来取消轮询活动的同步,可以将此问题降到最低。随机延迟被实现为一个自旋等待循环。
自旋等待循环的持续时间由循环中出现的PAUSE指令的数量决定。该数字是通过随机选择一个从0到但不包括的整数生成的innodb_spin_wait_delay
值,并将该值乘以50。例如,从以下范围中随机选择一个整数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
设置控制自旋锁轮询之间的最大延迟。
延迟循环的持续时间取决于C编译器和目标处理器。在100MHz的奔腾时代,一个innodb_spin_wait_delay
单位被校准为相当于一微秒。这种时间等价性并不成立,但就处理器周期而言,PAUSE指令的持续时间相对于大多数处理器架构上的其他CPU指令保持相当恒定。
在所有处理器核心共享一个快速缓存内存的系统上,您可以通过设置来减少最大延迟或完全禁用忙循环innodb_spin_wait_delay = 0
.在具有多个处理器芯片的系统上,缓存失效的影响可能更显著,您可能会增加最大延迟。
的innodb_spin_wait_delay
变量是动态的。可以在MySQL选项文件中指定它,也可以在运行时使用集全球
声明。运行时修改需要足够的权限来设置全局系统变量。看到第5.1.8.1节“系统变量特权”.