Необходимо понимать ошибку выполнения параллельного запроса

18

Сегодня мы испытали снижение производительности на нашем производственном сервере sql. За время, когда это произошло, мы зафиксировали несколько "The query processor could not start the necessary thread resources for parallel query execution"ошибок. Чтение, которое я сделал, предполагает, что это связано с тем, сколько процессоров использовать при выполнении сложного запроса. Однако, когда я проверил во время отключения нашего CPU Utilization was only at 7%. Есть ли что-то еще, на что это может ссылаться, с которым я еще не сталкивался? Это вероятный виновник снижения производительности или я гоняюсь за красной сельдью?

Мои значения sp_configure для этого следующие:

name                                minimum maximum config_value run_value
cost threshold for parallelism      0       32767   5            5
комковатый
источник
Каково значение max degree of parallelismнастроенного и сколько процессоров у вас в настоящее время на сервере вместе с конфигурацией NUMA? Вы можете использовать coreinfo.exeот Sysinternals , чтобы узнать количество процессоров и конфигурации NUMA.
Кин Шах
Максимальная степень параллелизма установлена ​​в 0
Lumpy
Это объясняет, почему сервер sql будет нуждаться в ресурсах потоков.
Кин Шах
@Kin У меня 12 процессоров (0 - 11) процессоров, затем два логических процессора для отображения узла NUMA: записи Узел 0, Узел 1
Lumpy
@Kin Я думал, что SQL Server управляет тем, сколько потоков он должен использовать. Почему это приведет к тому, что SQL Server будет лишен ресурсов потока?
Lumpy

Ответы:

19

Несколько месяцев назад я столкнулся с подобной ситуацией, когда настройка MAXDOP была по умолчанию, а запрос на запуск исчерпал все рабочие потоки.

Как отметил Ремус, это называется голодом с рабочим потоком .

При возникновении этого условия на вашем сервере будет создан дамп памяти.

Если вы используете 2008R2 + SP1 и выше sys.dm_server_memory_dumps, вам также будет указано расположение файла дампа.

Теперь вернемся к проблеме:

Для каждого узла NUMA имеется 1 поток монитора планировщика, и, поскольку у вас 2 узла NUMA, будет 2 потока монитора планировщика, которые отвечают за проверку работоспособности всех планировщиков каждые 60 секунд для этого конкретного узла NUMA, обеспечивая при этом, что планировщик застрял или не.

Каждый раз, когда новый рабочий запрос извлекается из рабочей очереди планировщиков, счетчик рабочих процессов увеличивается. Таким образом, если планировщик поставил рабочий запрос в очередь и не обработал один из рабочих запросов в течение 60 секунд, планировщик считается застрявшим.

Из-за запроса на запуск или обширного параллелизма возникает условие, что рабочие потоки начинают исчерпываться, поскольку все потоки заняты этим единственным запросом на запуск или чрезмерной длительной блокировкой, и никакая работа не может быть выполнена, если этот нарушающий процесс не будет уничтожен.

Лучше всего сначала настроить максимальную степень параллелизма . Значение по умолчанию 0 означает, что SQL Server может использовать все доступные процессоры для параллельной обработки и исчерпать все рабочие потоки.

Есть много причин, которые могут привести к исчерпанию рабочих потоков:

  • Обширные длинные блокирующие цепочки, приводящие к тому, что в SQL Server заканчиваются рабочие потоки
  • Обширный параллелизм также ведет к исчерпанию рабочих потоков
  • Обширное ожидание любого типа «замков» - спин-замков, защелок. Сиротский спинлок является примером.

Обратитесь к моему ответу здесь , который покажет вам, как вы можете рассчитать значение MAXDOP для вашего экземпляра сервера.

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

Кин Шах
источник
Есть ли что-нибудь, что может указывать на запрос run awway? Что-нибудь, что я могу использовать, чтобы попытаться идентифицировать запросы, которые подвергаются риску этого?
Кусочек
Предложите вам посмотреть статистику ожидания, чтобы узнать, где болит . Кроме того, посмотрите на sys.dm_os_schedulers-> current_tasks_count, runnable_tasks_count, current_workers_count и active_workers_count, а также sys.dm_os_wait_statsиsys.dm_os_waiting_tasks
Кин Шах
10

Там может быть несколько причин. Скорее всего, у вас не было работников. См max_worker_threads. Условие называется «стратация работника». Рабочие могут быть украдены любым из множества способов (ни один из которых не приведет к высокой загрузке ЦП, кстати), например, блокирование множества запросов или выполнение глупых действий в CLR (например, HTTP-запросы).

Симптом, который вы видите, является жертвой проблемы, а не ее причиной. Мы не можем рекомендовать решение, не зная причину. Вам нужно собрать счетчики перфораторов, DMV и проверить ERRORLOG для получения дополнительной информации.

Ремус Русану
источник
максимальное количество рабочих потоков: Min = 128, max = 32767, config = 0, run = 0
Lumpy
2
@ Lumpy Это ваша максимальная конфигурация, но она не близка к фактическим максимальным рабочим. Нам нужно знать, сколько процессоров ваша машина должна рассчитать.
Томас Стрингер