Spec-Zone.ru › MySQL 8.4

17.8.8 Настройка опроса спин-блокировки

Эти параметры обычно зарезервированы для коротких интервалов. В многоядерной системе для потока может быть эффективнее непрерывно проверять, может ли он получить мьютекс или rw-замок в течение некоторого времени, прежде чем перейти в состояние ожидания. Если мьютекс или rw-замок станет доступным в течение этого периода, поток может продолжить немедленно, в том же временном интервале. Однако слишком частый опрос общих объектов, таких как мьютекс или rw-замок, несколькими потоками может привести к «эффекту перекачивания кэша», что приводит к аннулированию процессорами частей кэша друг друга. 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. В системе с несколькими процессорными чипами влияние аннулирования кэша может быть более значительным, и вы можете увеличить максимальную задержку.

В эпоху Pentium 100 МГц единица innodb_spin_wait_delay была откалибрована как эквивалентная одной микросекунде. Эта эквивалентность времени не сохранялась, но продолжительность инструкции PAUSE оставалась довольно постоянной с точки зрения процессорных циклов по отношению к другим инструкциям процессора до появления процессоров поколения Skylake, у которых инструкция 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_delay и innodb_spin_wait_pause_multiplier являются динамическими. Их можно указать в файле параметров MySQL или изменить во время выполнения с помощью оператора SET GLOBAL. Изменение переменных во время выполнения требует привилегий, достаточных для задания глобальных системных переменных. См. Раздел 7.1.9.1, «Привилегии системных переменных».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-performance-spin_lock_polling.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API