Неэффективный параллелизм — досадная проблема, потому что старые методы обеспечения DOP неэффективны

Степень параллелизма (degree of parallelism - DOP), с которой выполняется запрос, может сильно повлиять на его производительность. Когда для запроса используется параллелизм, уместен вопрос, используется ли для запроса оптимальный уровень параллелизма. Если степень параллелизма слишком высока, это может стать причиной снижения эффективности выполнения запроса. Если степень параллелизма слишком низкая, это может привести к потере возможного выигрыша во времени исполнения запроса, который мог получиться при большем параллелизме. Для запроса можно задать максимальную степень параллелизма вручную, указав его с помощью подсказки MAXDOP , установив его на уровне конфигурации сервера или пула регулятора ресурсов. Однако, часто бывает что пользователи подбирают степень параллелизма вручную для каждого критичного для приложений запроса. В лучшем случае используется подсказка MAXDOP, когда проблему удаётся локализовать, но чаще всего даже не пытаются определить оптимальную степень параллелизма для каждого запроса из рабочей нагрузки,  а подбирается параметр конфигурации сервера max degree of parallelism (server configuration option).

Degree of parallelism feedback: обзор функциональности

В SQL Server 2022 мы представили новую функцию, называемую: «Degree of parallelism feedback» (обратная связь для DOP). Эта функция отслеживает запросы с параллелизмом и определяет, может ли запрос работать лучше при меньшей степени параллелизма, чем используется в момент исполнения. Например, вполне возможно, что 16 потоков будут работать лучше двадцати, если в этих потоках много ожиданий процессора. Будет выполнена пробная проверка новой степени параллелизма и либо принято решение, что это хорошее изменение, и далее будут применяться 16 потоков, либо так и останется DOP = 20 потоков. Если новая степень параллелизма покажет лучшие оценки для запроса, то это значение будет сохранено в «Query Store» (хранилище запросов) и будет соответствующим образом применяться к запросу при следующем исполнении.

Рис. 1. Обратная связь для DOP постепенно снижает степень параллелизма, определяя лучшее значение на каждом этапе
Рис. 1. Обратная связь для DOP постепенно снижает степень параллелизма, определяя лучшее значение на каждом этапе

Обратная связь для DOP никогда не увеличивает степень параллелизма, в лучшем случае она вернется к стабильному предыдущему DOP. Уменьшение DOP работает постепенно, то есть вместо того, чтобы пытаться сразу резко снизить степень параллелизма, степень параллелизма уменьшается по чуть-чуть. Затем, если такое уменьшение окажется удачным, будет предпринята попытка использования ещё чуть меньший DOP. Если и это окажется выигрышным изменением, может так продолжить уменьшать его минимум до двух, и в итоге план запроса в этом алгоритме никогда не изменится на последовательную обработку. Если более низкий DOP окажется не так хорош, алгоритм вернёт всё к предыдущему, давшему преимущество уровню DOP и запрос сохранит параллелизм на этом уровне.

Пример

Запрос компилируется со степенью параллелизма 32. Это означает, что запрос при выполнении будет разделен на 32 потока. Если обратная связь для DOP обнаружит превышение установленного порога времени ожидания потоков и уровня накладных расходов для процессоров, будет предложено опробовать меньшее значение DOP, скажем, равное 20. При следующем выполнении запрос будет выполняться с DOP = 20. Несколько исполнений запроса с DOP = 20 будут считаться стабилизационными. Однако с помощью обратной связи для DOP может выясниться, по-прежнему еще слишком много ожиданий, и будет предпринята попытка ещё уменьшить DOP до 16. Опять же, для проверки корректности обратной связи будет несколько исполнений запроса с этим DOP. После этого, можно попробовать DOP = 8. Если после нескольких исполнений производительность с DOP = 8 не улучшится, система вернется к прежнему DOP = 16 в качестве самого последнего, стабильного и проверенного DOP.

Простая настройка и легкая оптимизация

Если эта функция включена, все это делается без запуска перекомпиляции запросов и не требует никаких дополнительных действий от пользователя. Degree Of Parallelism Feedback в SQL Server 2022 помогает решать давнюю проблему в поисках правильной степени параллелизма для каждого запроса без необходимости вручную исследовать и настраивать каждый запрос для достижения его оптимальной производительности. Это одна из немногих функций, которая позволяет поднять производительность и удобство работы без какого-либо участия разработчика или DBA.

Комментарии (1)


  1. ptr128
    17.08.2023 14:21

    В идеале, хотелось бы иметь адаптивность не только в количестве потоков для всего запроса, а в количестве потоков для элемента плана выполнения.

    На практике, в таких случаях, когда это действительно существенно, приходится разбивать сложный запрос на два с разными значениями maxdop.