Eseguire il processo dell'agente server su Pianificazione solo se la CPU è inattiva


8

Ho un lavoro impostato in SQL Server Agent per eseguire una query di aggiornamento. Voglio che questo lavoro venga eseguito tutte le sere tra mezzanotte e le 5 del mattino e voglio che si ripeta ogni 5 minuti in quel lasso di tempo. Ma voglio che il lavoro venga effettivamente eseguito se la CPU è inattiva, ovvero l'utilizzo della CPU è inferiore al 20%. So che posso impostare il programma e posso anche impostare il requisito di inattività della CPU separatamente. C'è un modo per configurarlo in modo che entrambe le 'pianificazioni' debbano essere vere per l'esecuzione del lavoro?

Grazie

Risposte:


6

Oppure puoi avere un lavoro che viene eseguito ogni 5 minuti con 2 passaggi:

Step # 1 - controlla l'utilizzo della CPU (PowerShell), basta google e ci sono molti script là fuori; Se <20% esce con successo, vai al passaggio 2, Altrimenti Esci con errore e termina il lavoro (Nessun passaggio 2)

Step # 2: è l'attuale AGGIORNAMENTO.

O come ha suggerito Ken.


2
Mi piace questa. Penso che sia una soluzione migliore.
KenWilson,

4

L'utilizzo della CPU è inferiore al 20%

Configurare SQL Agent tramite la finestra Proprietà avanzate per Condizione CPU inattiva . Impostare il valore "L'utilizzo medio della CPU scende al di sotto" al 20% e quindi per quanto tempo deve rimanere a quel livello prima che il lavoro venga eseguito.

Dopodiché configura il passaggio del lavoro per verificare il tempo assicurandoti che sia all'interno della tua finestra, se all'interno della finestra emetti il ​​comando di aggiornamento.

Ora il requisito per ogni 5 minuti potrebbe non essere esattamente conforme a questa configurazione. Non sono riuscito a trovare nulla su questo tipo di pianificazione che indica la frequenza con cui il lavoro verrà eseguito. [ad es. se si imposta "e rimane al di sotto di questo livello" su 30 secondi per la condizione di CPU inattiva, esegue il lavoro frequentemente?] Ciò richiederebbe un po 'di test in quanto non avevo mai usato questa configurazione prima. Se ne avrò la possibilità, posso provare a vedere cosa fa e aggiornerò questa risposta.


Il modo in cui funziona la condizione di utilizzo della CPU è: Se la CPU è stata al di sotto della soglia specificata per la durata specificata, l'evento verrà generato ed eseguirà il processo. Se la CPU rimane inattiva anche per un altro secondo, l'evento verrebbe nuovamente generato, quindi il processo tenterebbe di eseguire nuovamente. Ma è possibile eseguire solo un'istanza di un lavoro alla volta, quindi il risultato reale è che il lavoro continuerà ad iniziare, eseguire, terminare, ripetere fino a quando la CPU rimane inattiva.
c.dunlap

2

Un modo sarebbe quello di avere tre lavori. Lavoro uno impostato su una pianificazione che abilita il lavoro due all'inizio della finestra. Il lavoro due è impostato per l'esecuzione quando la CPU è inattiva e il terzo lavoro disabilita il lavoro due alla fine della finestra. Non penso che sia l'unico modo per farlo, ma sicuramente il più semplice nella mia mente.


2

Denis era molto vicino. Ma la soluzione effettiva è stata leggermente scambiata. Poiché PowerShell non può controllare la CPU per un periodo di tempo, è necessario utilizzare solo il controllo di SQL Server.

Quindi il mio primo passo del lavoro è stato quello di eseguire uno script PowerShell che controlla se l'ora di sistema corrente è tra i due vincoli temporali. Se lo è, lo script PowerShell non fa nulla. Il processo di SQL Server lo interpreta come un successo.

Quindi il lavoro passa all'ultimo passaggio ed esegue la query di aggiornamento.

Se tuttavia, l'ora corrente è al di fuori dell'intervallo, Start-Time -s 600eseguo una pausa per lo script PowerShell per 10 minuti (simulando il requisito "una volta ogni 5-10 minuti). Questo per impedire all'agente del server SQL di provare costantemente a eseguire questo lavoro .

Dopo 10 minuti, lo script PowerShell genera un errore personalizzato. Da quando ho $ErrorActionPreference = "Stop"all'inizio dello script, lo script PowerShell si interrompe dopo l'errore. Questo passaggio è molto importante.

Poiché PowerShell si è arrestato e non è tornato, SQL Server Agent lo interpreta come un errore e non proseguirà nel passaggio che esegue la query di aggiornamento.

PS Ragazzi, mi avete guidato nella giusta direzione. Se avessi abbastanza reputazione, voterei voi ragazzi.

Modifica: aggiunto 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"
}

1
PowerShell può controllare la CPU per un periodo di tempo usando il cmdlet Get-Counter. Puoi eseguire il polling del valore ogni 5 secondi per 45 secondi con: $ t = Get-Counter "\ Processor (_total) \% Processor Time" -SampleInterval 5 -MaxSamples 10. Puoi quindi analizzare la stringa per ottenere i valori semplicemente: $ t.Readings.Trim ("\\ server \ processor (_total) \% Tempo processore:")

Sì, ma questo mi richiederebbe di consentire a SQL Server di eseguire quel lavoro ogni 5 secondi. Poiché SQL Server sta già monitorando l'utilizzo della CPU per un periodo di tempo, ho scelto di seguire questa strada. Questo mi permette di eseguire il lavoro solo ogni 10 minuti quando la CPU è troppo alta.
c.dunlap,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.