Ejecute el trabajo del agente del servidor en la programación solo si la CPU está inactiva

8

Tengo un trabajo configurado en el Agente SQL Server para ejecutar una consulta de actualización. Quiero que este trabajo se ejecute todas las noches entre la medianoche y las 5 a.m. y quiero que se repita cada 5 minutos durante ese período de tiempo. Pero solo quiero que el trabajo se ejecute realmente si la CPU está inactiva, es decir, la utilización de la CPU está por debajo del 20%. Sé que puedo configurar el cronograma y también puedo configurar el requisito de inactividad de la CPU por separado. ¿Hay alguna manera de configurarlo para que ambos 'horarios' tengan que ser verdaderos para que el trabajo se ejecute?

Gracias

c.dunlap
fuente

Respuestas:

6

O puede tener un trabajo que se ejecuta cada 5 minutos con 2 pasos:

Paso 1: comprueba el uso de la CPU (PowerShell), solo google y hay muchos scripts disponibles; Si <20% sale con éxito, vaya al Paso 2, Salga con error y termine el trabajo (No Paso # 2)

Paso # 2: es la ACTUALIZACIÓN real.

O como Ken sugirió.

DenisT
fuente
2
Me gusta este. Creo que es una mejor solución.
KenWilson
4

La utilización de la CPU está por debajo del 20%.

Configure el Agente SQL a través de la ventana Propiedades avanzadas para la Condición de CPU inactiva . Debería establecer el valor "El uso promedio de la CPU cae por debajo" en 20%, y luego cuánto tiempo debe mantenerse en ese nivel antes de que se ejecute el trabajo.

Después de eso, configure el paso del trabajo para verificar el tiempo asegurándose de que esté dentro de su ventana, si dentro de la ventana emita el comando de actualización.

Ahora, el requisito de cada 5 minutos puede no cumplirse exactamente con esta configuración. No pude encontrar nada en este tipo de programación que indique con qué frecuencia se ejecutaría el trabajo. [por ejemplo, si configura "y permanece por debajo de este nivel" en 30 segundos para la condición de CPU inactiva, ¿ejecuta el trabajo con tanta frecuencia?] Eso requeriría un poco de prueba ya que nunca he usado esta configuración antes. Si tengo la oportunidad, puedo intentar ver qué hace y actualizaré esta respuesta.


fuente
La forma en que funciona la condición de utilización de la CPU es: si la CPU ha estado por debajo del umbral especificado durante la duración especificada, el evento se activará y ejecutará el trabajo. Si la CPU permanece inactiva incluso por otro segundo, entonces el evento se disparará nuevamente, por lo que el trabajo intentará ejecutarse nuevamente. Pero solo una instancia de un trabajo puede ejecutarse a la vez, por lo que el resultado del mundo real es que el trabajo continuará comenzando, ejecutándose, finalizando y repitiéndose mientras la CPU permanezca inactiva.
c.dunlap
2

Una forma sería tener tres trabajos. Trabajo uno establecido en un horario que habilita el trabajo dos al comienzo de la ventana. El trabajo dos está configurado para ejecutarse cuando la CPU está inactiva y el tercer trabajo desactiva el trabajo dos al final de la ventana. No creo que sea la única forma de hacerlo, pero definitivamente es la más fácil en mi mente.

KenWilson
fuente
2

Denis estaba muy cerca. Pero la solución real fue un poco cambiada. Como PowerShell no puede verificar la CPU durante un período de tiempo, solo el uso actual, la verificación de SQL Server tuvo que ser utilizada.

Entonces, mi primer paso del trabajo fue ejecutar un script de PowerShell que verifica si la hora actual del sistema está entre las dos restricciones de tiempo. Si es así, entonces el script de PowerShell no hace nada. El trabajo de SQL Server interpreta esto como un éxito.

Luego, el trabajo pasa al último paso y realiza la consulta de actualización.

Sin embargo, si el tiempo actual está fuera del rango, realizo una Start-Time -s 600pausa del script de PowerShell durante 10 minutos (simulando el "requisito de 5 a 10 minutos). Esto es para evitar que el agente del servidor SQL intente constantemente ejecutar este trabajo .

Después de 10 minutos, el script de PowerShell arroja un error personalizado. Como tengo $ErrorActionPreference = "Stop"al comienzo del script, el script de PowerShell deja de ejecutarse después del error. Este paso es muy importante.

Dado que powershell se detuvo y no regresó, el Agente SQL Server interpreta esto como un error y no continuará con el paso que realiza la consulta de Actualización.

PD: Ustedes me llevaron en la dirección correcta. Si tuviera suficiente reputación, los votaría.

Editar: Agregado Powershell Script

$ErrorActionPreference = "Stop"

$StartTime = Get-Date "12:00 AM"
$EndDate = Get-Date "05:00 AM"
$CurrentDate = Get-Date
$ExecuteJob = $StartTime -lt $CurrentDate -and $EndDate -gt $CurrentDate
if(!$ExecuteJob){    
    Start-Sleep -s 600
    throw "Current Time not within Server downtime"
}
c.dunlap
fuente
1
PowerShell puede verificar la CPU durante un tiempo usando el cmdlet Get-Counter. Puede sondear el valor cada 5 segundos durante 45 segundos con: $ t = Get-Counter "\ Processor (_total) \% Processor Time" -SampleInterval 5 -MaxSamples 10. Luego puede analizar la cadena para obtener los valores de la siguiente manera: $ t.Readings.Trim ("\\ servidor \ procesador (_total) \% Tiempo de procesador:")
Sí, pero esto requeriría que permita que el servidor SQL ejecute ese trabajo cada 5 segundos. Dado que el servidor SQL ya está monitoreando el uso de la CPU durante un tiempo, elegí seguir esa ruta. Esto me permite ejecutar el trabajo solo cada 10 minutos cuando la CPU es demasiado alta.
c.dunlap