El Sistema Operativo Interno (SQLOS): Planificación Cooperativa Non-Preemptive, Quantum de 4ms y Diagnóstico de Wait Stats (55 min)
El Sistema Operativo Interno (SQLOS): Planificación Cooperativa Non-Preemptive, Quantum de 4ms y Diagnóstico de Wait Stats
1. Por qué SQL Server Implementa su Propio Planificador de Hilos dentro de Windows/Linux
Para evitar costosos cambios de contexto en modo kernel (Preemptive Context Switches) miles de veces por segundo cuando existen $2,000$ sesiones concurrentes, SQLOS crea un Scheduler lógico por cada núcleo de CPU físico/vCPU y ejecuta una máquina de estados de Multitarea Cooperativa (Non-Preemptive Scheduling) con un Quantum estricto de $4\text{ ms}$:
stateDiagram-v2
[*] --> RUNNING : Obtiene el CPU Scheduler (1 hilo por Core)
RUNNING --> SUSPENDED : Espera un recurso I/O o Lock (Wait List)
SUSPENDED --> RUNNABLE : Recurso disponible (Cola FIFO de CPU)
RUNNING --> RUNNABLE : Agota su Quantum de 4ms (Yield voluntario -> SOS_SCHEDULER_YIELD)
RUNNABLE --> RUNNING : Siguiente en la cola FIFO del Scheduler
2. Descomposición Matemática del Tiempo de Espera: Resource Wait vs Signal Wait
Cuando consultas sys.dm_os_wait_stats, el tiempo total acumulado wait_time_ms de un hilo se descompone en dos fases:
$T_{\text{wait\_total}} = T_{\text{resource\_wait}} + T_{\text{signal\_wait}}$
- $T_{\text{resource\_wait}} = \text{wait\_time\_ms} - \text{signal\_wait\_time\_ms}$: Tiempo que el hilo permaneció en la lista SUSPENDED esperando que el disco terminara de leer (PAGEIOLATCH_SH) o que otra transacción liberara un bloqueo de fila (LCK_M_X).
- $T_{\text{signal\_wait}} = \text{signal\_wait\_time\_ms}$: Tiempo que el recurso ya estaba listo, pero el hilo permaneció haciendo fila en la cola RUNNABLE esperando que el procesador quedara libre (Presión pura de CPU).
| Tipo de Espera Dominante | Causa Raíz Arquitectónica | Acción de remediación de Nivel Principal |
| :--- | :--- | :--- |
| SOS_SCHEDULER_YIELD ($> 15\%$ Signal Wait) | Escaneos masivos en memoria RAM (Spinning sobre Buffer Pool por falta de índices cubrientes) | Eliminar Key Lookups / Scans en RAM con índices INCLUDE |
| CXPACKET / CXCONSUMER | Paralelismo asimétrico (hilos paralelos esperando a un hilo rezagado con Data Skew) | Ajustar MAXDOP ($le 8$) y Cost Threshold for Parallelism ($ge 50$) |
| WRITELOG | Latencia de flush síncrono del Transaction Log (LDF) a almacenamiento | Aislar archivo LDF en NVMe dedicado y evitar micro-commits unitarios |'