Conteggio thread

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

Conteggio thread per il motore di database 2016

Knowledge Base article:

Riepilogo

In SQL Server viene in genere aperto il thread di sistema per ogni richiesta di query, ma se la quantità di thread supera il valore massimo specificato per i thread di lavoro, SQL Server raggruppa i thread di lavoro in pool. Quando tutti i thread di lavoro sono attivi con query a esecuzione prolungata, SQL Server potrebbe non rispondere fino a quando un thread di lavoro non viene completato e diventa disponibile. Benché non si tratti di un difetto, questo comportamento può talvolta risultare indesiderato. Il monitoraggio analizza la quantità di thread liberi e notifica se tale quantità è insufficiente.

Cause

Un incremento della quantità di lavoro che provoca un aumento di thread utilizzati; questo potrebbe indicare che SQL Server viene eseguito con carichi notevoli o che vi è un numero eccessivo di query eseguite in parallelo.

Soluzioni

La modifica dell'opzione max worker threads è avanzata ed è riservata ad amministratori di database esperti o a tecnici dotati di certificazione per SQL Server.

La creazione di un pool di thread consente di ottimizzare le prestazioni quando al server è connesso un numero elevato di client. In genere viene creato un thread del sistema operativo distinto per ogni richiesta di query. In presenza, tuttavia, di centinaia di connessioni al server, l'utilizzo di un thread per ogni richiesta di query può occupare quantità elevate di risorse di sistema. L'opzione max worker threads consente di migliorare le prestazioni di SQL Server grazie alla creazione di un pool di thread di lavoro per soddisfare una maggiore quantità di richieste di query.

Configurare l'opzione di configurazione del server max worker threads

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

Parametri di cui è possibile eseguire l'override

Nome

Descrizione

Valore predefinito

Priorità avviso

Definisce la priorità dell'avviso.

Normale

Gravità avviso

Definisce la gravità dell'avviso.

Errore

Ora di scadenza della cache

Specifica la durata massima delle informazioni presenti nella cache che possono essere usate dal flusso di lavoro. Può essere omesso.

43200

Abilitato

Abilita o disabilita il flusso di lavoro.

Genera avvisi

Definisce se il flusso di lavoro genera un avviso.

Intervallo (secondi)

Intervallo di tempo ricorrente in secondi in cui eseguire il flusso di lavoro.

300

Soglia minima thread disponibili

Il flusso di lavoro determina il numero massimo di thread e il numero di thread attivi per ogni processo del motore di database. Se il numero di thread disponibili è minore o uguale a questo parametro, verrà generato un avviso.

10

Numero di campioni

Indica quante volte un valore misurato deve violare una soglia prima che venga modificato lo stato.

6

Ora di sincronizzazione

Ora di sincronizzazione specificata usando il formato a 24 ore. Può essere omessa.

00:18

Timeout (secondi)

Specifica il tempo di esecuzione consentito per il flusso di lavoro prima che venga chiuso e contrassegnato come non riuscito.

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: il conteggio thread è troppo alto
Il conteggio di thread dell'istanza di SQL "{0}" nel computer "{1}" è troppo alto. Per altre informazioni, vedere la scheda relativa al contesto dell'avviso.
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>