Execute o trabalho do agente do servidor no agendamento apenas se a CPU estiver ociosa

8

Eu tenho um trabalho configurado no SQL Server Agent para executar uma consulta de atualização. Quero que esse trabalho seja executado todas as noites entre meia-noite e cinco da manhã e que ele se repita a cada 5 minutos durante esse período. Mas eu só quero que o trabalho seja executado se a CPU estiver ociosa, ou seja, a utilização da CPU está abaixo de 20%. Sei que posso configurar o agendamento e também posso configurar o requisito de inatividade da CPU separadamente. Existe uma maneira de configurá-lo para que ambos os 'cronogramas' sejam verdadeiros para que o trabalho seja executado?

obrigado

c.dunlap
fonte

Respostas:

6

Ou você pode ter um trabalho que é executado a cada 5 minutos com 2 etapas:

Etapa 1 - verifica o uso da CPU (PowerShell), apenas no Google e há muitos scripts por aí; Se a saída <20% for concluída com êxito, vá para a Etapa 2, Senão, saia com erro e termine o trabalho (sem a etapa 2)

Etapa 2 - é a atualização atual.

Ou como Ken sugeriu.

DenisT
fonte
2
Eu gosto deste. Eu acho que é uma solução melhor.
precisa saber é o seguinte
4

A utilização da CPU está abaixo, digamos 20%

Configure o SQL Agent através da janela Propriedades avançadas para Condição de CPU inativa . Você definiria o valor "O uso médio da CPU cai abaixo" para 20% e, em seguida, quanto tempo precisará manter nesse nível antes da execução da tarefa.

Depois disso, configure a etapa do trabalho para verificar o tempo, garantindo que esteja dentro da sua janela, se dentro da janela emitir o comando update.

Agora, o requisito para cada 5 minutos pode não atender exatamente a essa configuração. Não foi possível encontrar nada neste tipo de agendamento que indique com que frequência o trabalho seria executado. [por exemplo, se você definir "e permanecer abaixo desse nível" para 30 segundos para a condição de CPU ociosa, ele executa o trabalho com tanta frequência?] Isso exigiria um pouco de teste, pois nunca usei essa configuração antes. Se eu tiver uma chance, posso tentar ver o que ele faz e atualizará esta resposta.


fonte
O funcionamento da condição de utilização da CPU é: Se a CPU estiver abaixo do limite especificado pela duração especificada, o evento será acionado e executará o trabalho. Se a CPU permanecer inativa por mais um segundo, o evento será acionado novamente, portanto, o trabalho tentará executar novamente. Mas apenas uma instância de um trabalho pode ser executada por vez, de modo que o resultado no mundo real é que o trabalho continuará sendo iniciado, executado, finalizado e repetido enquanto a CPU permanecer inativa.
precisa saber é o seguinte
2

Uma maneira seria ter três empregos. Trabalho um definido em uma programação que permite o trabalho dois no início da janela. O trabalho dois está definido para ser executado quando a CPU está ociosa e o terceiro desabilita o trabalho dois no final da janela. Não acho que seja a única maneira de fazê-lo, mas é definitivamente o mais fácil em minha mente.

KenWilson
fonte
2

Denis estava muito perto. Mas a solução real foi um pouco trocada. Como o PowerShell não pode verificar a CPU por um período, apenas o uso atual, a verificação do SQL Server teve que ser usada.

Portanto, minha primeira etapa do trabalho foi executar um script do PowerShell que verifica se a hora atual do sistema está entre as duas restrições de tempo. Se for, o script PowerShell não faz nada. O trabalho do SQL Server interpreta isso como um sucesso.

Em seguida, o trabalho passa para a última etapa e executa a consulta de atualização.

Se, no entanto, o horário atual estiver fora do intervalo, execute uma Start-Time -s 600para pausar o script do PowerShell por 10 minutos (simulando o requisito "uma vez a cada 5 a 10 minutos). Isso evita que o agente do servidor SQL tente constantemente executar esse trabalho. .

Após 10 minutos, o script do PowerShell gera um erro personalizado. Como eu tenho $ErrorActionPreference = "Stop"no início do script, o script do PowerShell para de ser executado após o erro. Este passo é muito importante.

Como o powershell parou e não retornou, o SQL Server Agent interpreta isso como uma falha e não continuará na etapa que executa a consulta Atualização.

PS Vocês me levaram na direção certa. Se eu tivesse reputação suficiente, eu votaria em vocês.

Edit: Adicionado 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
fonte
11
O PowerShell pode verificar a CPU por uma duração usando o cmdlet Get-Counter. Você pode pesquisar o valor a cada 5 segundos em 45 segundos com: $ t = Get-Counter "\ Processor (_total) \% Time do Processador" -SampleInterval 5 -MaxSamples 10. Você pode analisar a sequência para obter apenas os valores: $ t.Readings.Trim ("\\ servidor \ processador (_total) \% do tempo do processador:")
Sim, mas isso exigiria que eu permitisse ao servidor sql executar esse trabalho a cada 5 segundos. Como o SQL Server já está monitorando o uso da CPU por um período, eu escolhi seguir esse caminho. Isso me permite executar o trabalho apenas a cada 10 minutos quando a CPU está muito alta.
precisa saber é o seguinte