Cómo resolver problemas de Max Worker Threads en SQL Server

Antes de discutir los problemas de rendimiento relacionados conHilos de trabajo máximos(MWT), entendamos quéMWThace.MWTHay subprocesos de trabajo disponibles para SQL Server y, utilizando los subprocesos nativos de Windows, SQL Server maneja simultáneamente múltiples tareas en paralelo. Por ejemplo, puntos de control de bases de datos, procesos de capa de red, manejo de procesamiento de transacciones, etc. El valor predeterminado es 0. El valor 0 permite a SQL Server generar subprocesos basados ​​en los recursos del servidor de forma dinámica. Funciona para la mayoría de las implementaciones de SQL Server en todo el mundo. Para mejorar el rendimiento, a veces es útil aumentar el valor MWT manualmente. En esta publicación, voy a hablar sobre cómo resolver problemas de subprocesos de trabajo máximos en SQL Server.

Solo se quedará sin MWT cuando SQL Server esté muy ocupado, haya una alta concurrencia de usuarios y características adicionales como SQL Server Always On y Replication Services estén habilitadas. Basado en las versiones de SQL Server (32 bits o 64 bits) y los núcleos del procesador, SQL Server genera un grupo de subprocesos de trabajo para atender las solicitudes de los usuarios. Aquí hay un vistazo rápido a los números concretos.

Recuento de núcleos de CPUServidores antiguos de 32 bitsÚltimos servidores de 64 bits
Hasta 4 procesadores256512
Procesadores Octa-Core 8288576
16 procesadores352704
32 procesadores480960
64 procesadores7361472
128 procesadores42244480
256 procesadores83208576

La opción Configuración de MWT excluye los subprocesos utilizados para grupos de disponibilidad Always On y creación de reflejo de bases de datos.

Utilice la siguiente consulta para averiguar qué tareas del sistema han provocado que se generen subprocesos de trabajo adicionales:

SELECT  
s.session_id,  
r.command,  
r.status,  
r.wait_type,  
r.scheduler_id,  
w.worker_address,  
w.is_preemptive,  
w.state,  
t.task_state,  
t.session_id,  
t.exec_context_id,  
t.request_id  
FROM sys.dm_exec_sessions AS s  
INNER JOIN sys.dm_exec_requests AS r  
    ON s.session_id = r.session_id  
INNER JOIN sys.dm_os_tasks AS t  
    ON r.task_address = t.task_address  
INNER JOIN sys.dm_os_workers AS w  
    ON t.worker_address = w.worker_address  
WHERE s.is_user_process = 0;

Cómo cambiar el recuento máximo de subprocesos de trabajo usando T-SQL

USE AdventureWorks2016 ;  
GO  
EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE ;  
GO  
EXEC sp_configure 'max worker threads', 1000 ;  
GO  
RECONFIGURE;  
GO

A veces, reducir el número de subprocesos de trabajo mejora el rendimiento.

Lectura recomendada:Cómo realizar una copia de seguridad híbrida de SQL Server en URL en Azure Storage en 2019

Prácticas recomendadas de Max Worker Threads para la creación de reflejo de bases de datos y grupos de disponibilidad siempre activos

  • Para evitar el agotamiento de MWT, no cree más de 10 grupos de disponibilidad y 100 bases de datos. Esto significa 10 bases de datos por grupo de disponibilidad. Esta es una recomendación y no un límite estricto.
  • Si hay un agotamiento de MWT, agregue CPU adicionales o CPU virtuales (en el caso de máquinas virtuales) para aumentar el recuento de MWT. Consulte la tabla anterior como referencia.
  • Crear otra instancia en el mismo servidor para mejorar MWT no aumentará el rendimiento.
  • Demasiada consolidación de bases de datos con bases de datos que ejecutan duplicación y grupos de disponibilidad puede provocar el agotamiento de MWT.
  • Calcule el MWT máximo y pruebe exhaustivamente el sistema antes de implementarlo siempre en AG.

¿Cómo calcular el recuento de MWT?

MWT = {512 + ((Number of CPU Cores - 4) * 16)} = Result

Cómo calcular el uso máximo de subprocesos de trabajo

select scheduler_id,current_tasks_count,

current_workers_count,active_workers_count,work_queue_count    

from sys.dm_os_schedulers    

where status = ‘Visible Online’

Desglose de qué tarea del sistema utiliza subprocesos MWT

select is_preemptive,state,last_wait_type,count(*) as NumWorkers from sys.dm_os_workers    

Group by state,last_wait_type,is_preemptive    

order by count(*) desc

Recursos oficiales en línea de Microsoft