Exécuter le travail de l'agent de serveur sur la planification uniquement si le processeur est inactif

8

J'ai un travail configuré dans l'Agent SQL Server pour exécuter une requête de mise à jour. Je veux que ce travail s'exécute chaque nuit entre minuit et 5 heures du matin et je veux qu'il se répète toutes les 5 minutes pendant cette période. Mais je veux que le travail s'exécute réellement si le CPU est inactif, c'est-à-dire que l'utilisation du CPU est inférieure à 20%. Je sais que je peux configurer le calendrier, et je peux également configurer l'exigence d'inactivité du processeur séparément. Existe-t-il un moyen pour moi de le configurer de sorte que les deux «planifications» doivent être vraies pour que le travail s'exécute?

Merci

c.dunlap
la source

Réponses:

6

Ou vous pouvez avoir un travail qui s'exécute toutes les 5 minutes en 2 étapes:

Étape # 1 - vérifie l'utilisation du processeur (PowerShell), juste google et il y a beaucoup de scripts là-bas; Si <20% quitte avec succès, passez à l'étape 2, sinon quittez avec erreur et terminez le travail (pas d'étape # 2)

Étape # 2 - est la MISE À JOUR réelle.

Ou comme l'a suggéré Ken.

DenisT
la source
2
J'aime celui la. Je pense que c'est une meilleure solution.
KenWilson
4

L'utilisation du processeur est inférieure à 20%

Configurez l'Agent SQL via la fenêtre Propriétés avancées pour l'état du processeur inactif . Vous devez définir la valeur «L'utilisation moyenne du processeur tombe en dessous» à 20%, puis combien de temps il doit conserver à ce niveau avant l'exécution du travail.

Après cela, configurez l'étape du travail pour vérifier l'heure en vous assurant qu'elle se trouve dans votre fenêtre, si dans la fenêtre, exécutez la commande de mise à jour.

Maintenant, l'exigence pour toutes les 5 minutes peut ne pas être remplie exactement avec cette configuration. Je n'ai rien trouvé sur ce type de planification qui indique la fréquence d'exécution du travail. [Par exemple, si vous définissez le "et reste en dessous de ce niveau" à 30 secondes pour l'état CPU inactif, est-ce qu'il exécute le travail aussi fréquemment?] Cela nécessiterait un peu de test car je n'ai jamais utilisé cette configuration auparavant. Si j'en ai l'occasion, je peux essayer de voir ce qu'il fait et je mettrai à jour cette réponse.


la source
Le fonctionnement de la condition d'utilisation du processeur est le suivant: si le processeur a été sous le seuil spécifié pendant la durée spécifiée, l'événement se déclenche et exécute le travail. Si le CPU reste inactif pendant encore une seconde, l'événement serait à nouveau déclenché, le travail tenterait de s'exécuter à nouveau. Mais une seule instance d'un travail peut être exécutée à la fois, donc le résultat réel est que le travail continuera à démarrer, exécuter, terminer, répéter tant que le CPU restera inactif.
c.dunlap
2

Une façon serait d'avoir trois emplois. Le premier travail est défini sur une planification qui permet le deuxième travail au début de la fenêtre. Le travail deux est configuré pour s'exécuter lorsque le processeur est inactif et le troisième travail désactive le travail deux à la fin de la fenêtre. Je ne pense pas que ce soit la seule façon de le faire, mais c'est certainement la plus facile dans mon esprit.

KenWilson
la source
2

Denis était très proche. Mais la solution réelle a été un peu échangée. Comme PowerShell ne peut pas vérifier le processeur sur une durée, seule l'utilisation actuelle, la vérification SQL Server devait être utilisée.

Alors ma première étape du travail a été d'exécuter un script PowerShell qui vérifie si l'heure système actuelle se situe entre les deux contraintes de temps. Si c'est le cas, le script PowerShell ne fait rien. Le travail SQL Server interprète cela comme un succès.

Le Job passe ensuite à la dernière étape et exécute la requête de mise à jour.

Si toutefois l'heure actuelle est en dehors de la plage, j'effectue une Start-Time -s 600pause du script PowerShell pendant 10 minutes (en simulant l'exigence "une fois tous les 5 à 10 minutes). Ceci permet d'empêcher l'agent SQL Server d'essayer constamment d'exécuter ce travail. .

Après 10 minutes, le script PowerShell génère une erreur personnalisée. Depuis que j'ai $ErrorActionPreference = "Stop"au début du script, le script PowerShell cesse de s'exécuter après l'erreur. Cette étape est très importante.

Étant donné que powershell s'est arrêté et n'est pas revenu, l'Agent SQL Server interprète cela comme un échec et ne passera pas à l'étape qui exécute la requête de mise à jour.

PS Vous m'avez conduit dans la bonne direction. Si j'avais assez de réputation, je voterais pour vous.

Edit: Ajout du script Powershell

$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
la source
1
PowerShell peut vérifier le processeur sur une durée à l'aide de l'applet de commande Get-Counter. Vous pouvez interroger la valeur toutes les 5 secondes sur 45 secondes avec: $ t = Get-Counter "\ Processor (_total) \% Processor Time" -SampleInterval 5 -MaxSamples 10. Vous pouvez ensuite analyser la chaîne pour obtenir simplement les valeurs par: $ t.Readings.Trim ("\\ serveur \ processeur (_total) \% Temps processeur:")
Oui, mais cela nécessiterait que j'autorise le serveur SQL à exécuter ce travail toutes les 5 secondes. Étant donné que SQL Server surveille déjà l'utilisation du processeur sur une durée, j'ai choisi de suivre cette voie. Cela me permet d'exécuter le travail uniquement toutes les 10 minutes lorsque le processeur est trop élevé.
c.dunlap