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 CPU | Servidores antiguos de 32 bits | Últimos servidores de 64 bits |
|---|---|---|
| Hasta 4 procesadores | 256 | 512 |
| Procesadores Octa-Core 8 | 288 | 576 |
| 16 procesadores | 352 | 704 |
| 32 procesadores | 480 | 960 |
| 64 procesadores | 736 | 1472 |
| 128 procesadores | 4224 | 4480 |
| 256 procesadores | 8320 | 8576 |
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)} = ResultCó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
Más información sobreOpción máxima de subprocesos de trabajo
- Más información sobreRestricciones siempre activas de SQL Server
