Pregunta simple
¿Cómo se sincroniza el SQL Server Quantum (4 ms) con el servidor OS Quantum (normalmente: 187,5 ms)?
Pregunta simple explicada
Después de utilizar 184 ms del sistema operativo cuántico (que corresponde a 46 cuánticos SQL completos), el sistema cuántico del sistema operativo tiene 3.5 ms de tiempo antes de que tenga que entregar la programación a un proceso diferente. El sistema operativo SQL inicia un cuanto (4 ms) y después de 3,5 ms, el cuántico del sistema operativo ha decidido detener el subproceso actual del sistema operativo SQL que todavía tiene 0,5 ms antes de que produzca la programación. ¿Que pasa ahora?
Inmersión profunda en OS Quantum
En las próximas dos secciones escribiré lo que he encontrado hasta ahora sobre el cuanto del sistema operativo y cómo se puede calcular la duración de un cuanto. La duración de un "quantum" del sistema operativo se basa en "ticks" y la duración del "tick" en sí se basa en el "intervalo de reloj" que normalmente es de 15.625000 ms. Pero déjame explicar un poco ...
garrapata
En el artículo del blog Know Thy Tick, el autor Jim explica los conceptos básicos de los intervalos de reloj (también conocidos como "ticks") y para qué sirven.
Cuando leo algo como "el intervalo de reloj ... para la mayoría de los multiprocesadores x86 es de aproximadamente 15 milisegundos", me veo obligado a determinar el valor de mi reloj, o "tic", intervalo. Afortunadamente, el libro en el que leí esta cita, Windows Internals Fourth Edition, proporciona una referencia para ayudarme con mi aflicción. ... El autor, Mark Russinovich, del libro mencionado ha hecho gentilmente la utilidad ClockRes disponible en su sitio web. Al ejecutar esta utilidad, pude determinar que el intervalo de reloj en mi PC multiprocesador x86 es de 15.625000 ms. Interesante, pero mi mente curiosa quiere saber más.
Cuántico
El autor del artículo continúa explicando en su segundo artículo ese...
Por supuesto, la verdadera razón por la cual el intervalo de tick es importante es que afecta la programación de subprocesos . El programador de Windows le da a cada subproceso un "tiempo cuántico" de ejecución antes de permitir que se ejecute otra tarea, con el mismo nivel de prioridad. El cuanto que el programador asigna a un hilo es un múltiplo del intervalo de tics . El valor cuántico específico elegido para un hilo específico está un poco más allá de donde quiero ir con este artículo.
Ok, sé lo que es un cuanto, pero no cuánto tiempo durará un cuanto.
Por ahora, examinemos el valor cuántico predeterminado para un subproceso en primer plano en XPe. En este caso, el planificador de Windows asigna una cantidad de 18 o 6 intervalos de tics. (Sí, para convertir los intervalos cuánticos en tics, uno debe dividir entre 3. ..., pero la razón del múltiplo es permitir que el programador pueda "cargar" un subproceso para realizar una operación que hace que se suspenda).
Ahora sabemos que un intervalo de reloj (tick) debe ser de alrededor de 15.625000 ms y en un sistema operativo de escritorio de Windows donde la cantidad predeterminada es 18 que dará como resultado 6 ticks o 93.750000 ms (18/3 * 15.625000 ms).
En un sistema operativo Windows Server, la cantidad predeterminada es diferente. La configuración "Programación del procesador" está establecida en "Servicios en segundo plano"
Esta configuración se puede encontrar en "Configuración del sistema | Avanzado (pestaña) | Rendimiento (sección) | Configuración ..." que abrirá "Opciones de rendimiento | Avanzado (pestaña) | Programación del procesador"
La configuración cuántica predeterminada es 36 (Fondo) a 36 (Primer plano). El cuanto es más grande y, por lo tanto, más largo. Esto es el doble de la cantidad de 93.750000 ms de la configuración cuántica de primer plano de 18 (6 tick) en un SO de escritorio de Windows, que en un SO de servidor configurado para Servicios en segundo plano es de aproximadamente 187.500000 ms.
Observación / Explicación
Cuando cambia la configuración de "Servicios en segundo plano" a "Aplicaciones" en un servidor o escritorio, la clave HKLM \ SYSTEM \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation en el registro cambia de 0x18 a 0x02. ¿Cuál es el valor cuántico predeterminado para 0x02? Esto se puede encontrar en un comentario:
El valor 0x02 implica que los campos "Corto vs. Largo" y "Variable vs. Fijo" son los predeterminados para el sistema operativo.
El valor predeterminado para estos campos para XPe y XP Pro es: Corto y Variable, que es lo mismo que tener los siguientes bits adicionales: 0x24.
O si ingresa este valor con 0x02 le da 0x26, que encontrará en la tabla del artículo.
Referencia: Comentario a "Domina tu cuanto" (Blogs de MSDN)
La tabla que explica la configuración cuántica del mismo artículo:
Win32PrioritySeparation Foreground Background
0x28, 0x29, 0x2A 18 18
0x18, 0x19, 0x1A 36 36
0x24 6 6
0x25, 0x14 12 6
0x26 18 6
0x15 24 6
0x16 36 6
Breve resumen de OS Quantum
Según la información anterior y las citas de artículos, sabemos que un cuanto no es un tamaño fijo, sino que se deriva de una configuración del sistema operativo en las Propiedades del sistema. Un cuanto varía según la Win32PrioritySeparation
configuración en el registro que normalmente corresponde a una de las configuraciones en "Propiedades del sistema" ("Servicios en segundo plano" o "Aplicaciones").
Un cuanto a nivel de sistema operativo es
- para la configuración "Aplicaciones"
- 18 (que es 6 ticks) para aplicaciones en primer plano (93.75 ms)
- 6 (que es 2 ticks) para aplicaciones en segundo plano (31.25 ms)
- para la configuración "Servicios en segundo plano"
- 36 (que es 18 ticks) para aplicaciones en primer plano (187,5 ms)
- 36 (que es 18 ticks) para aplicaciones en segundo plano (187,5 ms)
Entonces, ahora sabemos que un cuanto de sistema operativo en una configuración de Windows Server para optimizar los Servicios en segundo plano es ...
36 / 3 * 15.625000 ms = 187.5 ms
SQL OS Quantum
Esta sección enumera lo que he encontrado en SQL OS Quantum ...
SOS_SCHEDULER_YIELD Tipo de espera
De la descripción de Paul Randall en el tipo de espera SOS_SCHEDULER_YIELD:
Este tipo de espera es cuando un subproceso pudo ejecutarse para su cuántica de subproceso completo (4 milisegundos en todas las versiones de SQL Server, inmutable ), y así voluntariamente arrojó el planificador, moviéndose al final de la Cola Runnable en su planificador.
Referencia: SOS_SCHEDULER_YIELD (Tipos de espera de SQLSkills.com)
Programadores en DMV de SQL Server
En una explicación sobre los DMV de SQL Server para el DMV sys.dm_os_schedulers.
[...] Windows utiliza un mecanismo de programación preventivo y asigna una cantidad de tiempo de CPU a cada subproceso, cuando un subproceso consume su cantidad, se envía a una cola y se concede la ejecución de otros subprocesos.
Por el contrario, SQL Server utiliza un mecanismo de programación cooperativo cuando los subprocesos pueden producir voluntariamente su cantidad de tiempo (puede ver este comportamiento cuando tiene un tipo de espera SOS_SCHEDULER_YIELD). Esto permite que SQL Server optimice la utilización de la CPU, ya que cuando un subproceso está indicado para su ejecución pero no está listo para ejecutarse, puede producir su cantidad de tiempo a favor de otros subprocesos .
Referencia: Comprender los programadores, trabajadores y tareas de SQL Server (MSSQLTips.com)
Detectar la presión de la CPU del servidor SQL
Esta es una sección muy pequeña de un artículo sobre la presión de la CPU en SQL Server.
Se produce cuando una tarea entrega voluntariamente el programador para que otras tareas se ejecuten. Durante esta espera, la tarea está esperando que se renueve su cuanto .
Referencia: detectar la presión de la CPU del servidor SQL (MSSQLTips.com)
sys.dm_os_schedulers (documentos de Microsoft)
Supongo que la siguiente cita es el fragmento de información más importante sobre la cantidad de SQL OS que pude encontrar:
quantum_length_us bigint Identified for informational purposes only. Not supported. Future compatibility is not guaranteed. Exposes the scheduler quantum used by SQLOS.
Referencia: sys.dm_os_schedulers (Transact-SQL) (Microsoft | Docs)
Mi enigma
El servidor OS Quantum regula la cantidad de tiempo que se le otorga al servicio SQL Server para ejecutar "tareas". El SQL Server OS Quantum se define como 4 ms. Si divido los 187.5 ms por 4 ms, me quedan 3.5 ms.
Y ni siquiera hemos comenzado la discusión sobre cuándo el Intervalo de reloj se establece en algo diferente al valor predeterminado de 15.625000 ms ...
Pregunta simple
¿Cómo se sincroniza el SQL Server Quantum (4 ms) con el servidor OS Quantum (normalmente: 187,5 ms)?
Pregunta simple explicada
Después de utilizar 184 ms del sistema operativo cuántico (que corresponde a 46 cuánticos SQL completos), el sistema cuántico del sistema operativo tiene 3.5 ms de tiempo antes de que tenga que entregar la programación a un proceso diferente. El sistema operativo SQL inicia un cuanto (4 ms) y después de 3,5 ms, el cuántico del sistema operativo ha decidido detener el subproceso actual del sistema operativo SQL que todavía tiene 0,5 ms antes de que produzca la programación. ¿Que pasa ahora?