Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел обеспечивает направляющие линии при установке системных переменных пула потоков для лучшей производительности, измеренное использование метрики, таких как транзакции в секунду.
thread_pool_size
самый важный параметр, управляющий производительностью пула
потоков. Это может быть установлено только при запуске сервера. Наш опыт в тестировании пула потоков указывает
на следующее:
Если механизм основной памяти InnoDB
, оптимальное thread_pool_size
установка, вероятно, будет между 16 и 36 с наиболее распространенными оптимальными значениями, имеющими
тенденцию быть от 24 до 36. Мы не видели ситуации, где установка была оптимальна вне 36. Могут быть
особые случаи, где значение, меньшее чем 16, оптимально.
Для рабочих нагрузок, таких как DBT2 и Sysbench, оптимум для InnoDB
кажется, обычно приблизительно 36. Для очень интенсивных
записью рабочих нагрузок оптимальная установка может иногда быть ниже.
Если механизм основной памяти MyISAM
, thread_pool_size
установка должна быть довольно низкой. Мы склонны
получать оптимальную производительность для значений от 4 до 8. Более высокие значения имеют тенденцию
иметь немного отрицательное, но не драматическое воздействие на производительность.
Другая системная переменная, thread_pool_stall_limit
, важно для обработки блокированных и продолжительных
операторов. Если обо всех вызовах, которые блокируют MySQL Server, сообщают пулу потоков, он всегда знал бы,
когда потоки выполнения блокируются. Однако, это, возможно, всегда не истина. Например, блоки могли произойти в
коде, который не был инструментован с обратными вызовами пула потоков. Для таких случаев пул потоков должен быть
в состоянии идентифицировать потоки, которые, кажется, блокируются. Это делается посредством тайм-аута, длина
которого может быть настроена, используя thread_pool_stall_limit
системная переменная. Этот параметр гарантирует, что
сервер не становится полностью блокированным. Значение thread_pool_stall_limit
имеет верхний предел 6 секунд, чтобы предотвратить
риск заведенного в тупик сервера.
thread_pool_stall_limit
также позволяет пулу потоков обработать продолжительные операторы. Если бы продолжительному оператору разрешили
блокировать группу потока, то все другие соединения, присвоенные группе, были бы блокированы и неспособны
запустить выполнение до продолжительного завершенного оператора. В худшем случае это могло занять часы или даже
дни.
Значение thread_pool_stall_limit
должен быть выбран так, что операторы, которые выполняются дольше, чем его значение считают остановленным.
Остановленные операторы генерируют много дополнительных издержек, так как они включают дополнительные
контекстные переключения и в некоторых случаях даже дополнительные создания потока. С другой стороны, установка
thread_pool_stall_limit
параметр слишком высоко означает, что продолжительные операторы блокируют много коротко рабочих операторов для
дольше чем необходимый. Короткий ожидают потоки разрешения на значения, чтобы запуститься более быстро. Короткие
значения также лучше для ухода от ситуаций с мертвой блокировкой. Значения долгого ожидания полезны для рабочих
нагрузок, которые включают продолжительные операторы, чтобы избежать запускать слишком много новых операторов, в
то время как текущие выполняются.
Предположите, что сервер выполняет рабочую нагрузку, где 99.9 % операторов завершается в пределах 100 мс, даже
когда сервер загружается, и остающиеся операторы берут между 100 мс и 2 часа справедливо равномерно
распространение. В этом случае имело бы смысл устанавливать thread_pool_stall_limit
к 10 (значение 100 мс). Значение по умолчанию 60 мс
хорошо для серверов, которые прежде всего выполняют очень простые операторы.
thread_pool_stall_limit
параметр может быть изменен во времени выполнения, чтобы позволить Вам ударить баланс, подходящий для рабочей
нагрузки сервера. Принятие, что TP_THREAD_GROUP_STATS
таблица включается, можно
использовать следующий запрос, чтобы определить часть выполняемых операторов, которые остановились:
SELECT SUM(STALLED_QUERIES_EXECUTED) / SUM(QUERIES_EXECUTED)FROM information_schema.TP_THREAD_GROUP_STATS;
Это число должно быть настолько низким насколько возможно. Чтобы уменьшить вероятность остановки операторов,
увеличьте значение thread_pool_stall_limit
.
Когда оператор прибывает, каково максимальное время, это может быть задержано прежде, чем это фактически начнет выполняться? Предположите, что следующие условия применяются:
Есть 200 операторов, поставленных в очередь в низкоприоритетной очереди.
Есть 10 операторов, поставленных в очередь в высокоприоритетной очереди.
thread_pool_prio_kickup_timer
устанавливается в 10000 (10 секунд).
thread_pool_stall_limit
устанавливается в 100 (1 секунда).
В худшем случае 10 высокоприоритетных операторов представляют 10 транзакций, которые продолжают выполняться в течение долгого времени. Таким образом, в худшем случае, никакие операторы не будут перемещены к высокоприоритетной очереди, потому что это будет всегда уже содержать операторы, ждущие выполнения. После 10 секунд новый оператор имеет право быть перемещенным к высокоприоритетной очереди. Однако, прежде, чем это может быть перемещено, все операторы прежде, чем это должно будет быть перемещено также. Это могло занять еще 2 секунды, потому что максимум 100 операторов в секунду перемещается к высокоприоритетной очереди. Теперь, когда оператор достигает высокоприоритетной очереди, могло потенциально быть много продолжительных операторов перед этим. В худшем случае каждые из тех станут остановленными, и потребуется 1 секунда для каждого оператора прежде, чем следующий оператор будет получен от высокоприоритетной очереди. Таким образом, в этом сценарии, это возьмет за 222 секунды до того, как новый оператор начинает выполняться.
Этот пример показывает худший случай для приложения. То, как обработать это, зависит от приложения. Если у приложения есть высокие требования в течение времени отклика, оно должно наиболее вероятно отрегулировать пользователей в более высоком уровне непосредственно. Иначе, это может использовать параметры конфигурации пула потоков, чтобы установить некоторое максимальное время ожидания.