Число потоков

Microsoft.SQLServer.2016.DBEngine.ThreadCountMonitor (UnitMonitor)

Количество потоков для ядра СУБД 2016

Knowledge Base article:

Сводка

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

Причины

Увеличение объема работ, вызывающее увеличение количества используемых потоков; это может означать, что SQL Server работает под значительной загрузкой или выполняется излишнее количество запросов параллельно.

Решения

Установка максимального количества рабочих потоков является дополнительным параметром, и его следует изменять только опытным администраторам баз данных или сертифицированным техническим специалистам SQL Server.

Пул потоков помогает оптимизировать производительность при подключении к серверу большого числа пользователей. Обычно для каждого запроса в операционной системе создается отдельный поток. Однако в случае сотен соединений с сервером, использование одного потока на каждый запрос приводит к потреблению большого числа системных ресурсов. Параметр max worker threads позволяет SQL Server создавать пул рабочих потоков, чтобы обслужить большое число запросов, что улучшает производительность.

Настройка параметра конфигурации сервера max worker threads

http://go.microsoft.com/fwlink/?LinkId=799312

Переопределяемые параметры

Название

Описание

Значение по умолчанию

Приоритет предупреждения

Определяет приоритет предупреждения.

Обычные

Серьезность предупреждения

Определяет серьезность предупреждения.

Ошибка

Срок действия кэша

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

43200

Включено

Включает или отключает рабочий процесс.

Да

Создает предупреждения

Определяет, создает ли рабочий процесс предупреждения.

Да

Интервал (в секундах)

Повторяющийся интервал времени в секундах, по истечении которого запускается рабочий процесс.

300

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

Рабочий процесс определяет максимальное количество потоков и количество активных потоков для каждого процесса ядра СУБД. Предупреждение создается, если число свободных потоков меньше или равно значению этого параметра.

10

Число выборок

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

6

Время синхронизации

Время синхронизации указывается в 24-часовом формате и может быть опущено.

00:18

Время ожидания (в секундах)

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

200

Element properties:

TargetMicrosoft.SQLServer.2016.DBEngine
Parent MonitorSystem.Health.PerformanceState
CategoryPerformanceHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2016.DBEngine.ThreadCount.MonitorType
RemotableTrue
AccessibilityPublic
Alert Message
MSSQL 2016: количество потоков слишком велико
Число потоков экземпляра SQL Server "{0}" на компьютере "{1}" слишком велико. Дополнительные сведения см. на вкладке "Контекст предупреждения".
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2016.DBEngine.ThreadCountMonitor" Accessibility="Public" Enabled="true" Target="SQL2016Core!Microsoft.SQLServer.2016.DBEngine" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2016.DBEngine.ThreadCount.MonitorType" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.DBEngine.ThreadCountMonitor.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ServerRole"]/InstanceName$</AlertParameter1>
<AlertParameter2>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</AlertParameter2>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Normal" MonitorTypeStateID="Normal" HealthState="Success"/>
<OperationalState ID="Error" MonitorTypeStateID="Error" HealthState="Error"/>
</OperationalStates>
<Configuration>
<ServiceName>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/ServiceName$</ServiceName>
<IntervalSeconds>300</IntervalSeconds>
<TimeoutSeconds>200</TimeoutSeconds>
<MinFreeThreadsCount>10</MinFreeThreadsCount>
<NumSamples>6</NumSamples>
<SyncTime/>
<CacheExpirationTime>43200</CacheExpirationTime>
</Configuration>
</UnitMonitor>