Запустить задание агента сервера по расписанию, только если процессор не используется

8

У меня есть задание, настроенное в агенте SQL Server для запуска запроса на обновление. Я хочу, чтобы эта работа выполнялась каждую ночь с полуночи до 5 утра, и я хочу, чтобы она повторялась каждые 5 минут в течение этого периода времени. Но я хочу, чтобы работа выполнялась только в том случае, если процессор простаивает, то есть загрузка ЦП ниже 20%. Я знаю, что могу настроить расписание, и я также могу настроить требование простоя процессора отдельно. Есть ли способ для меня настроить его так, чтобы оба «расписания» должны были быть верными для выполнения задания?

Спасибо

c.dunlap
источник

Ответы:

6

Или у вас может быть одно задание, которое выполняется каждые 5 минут с 2 шагами:

Шаг № 1 - проверяет использование процессора (PowerShell), просто Google и есть множество сценариев; Если <20% успешно завершен, перейдите к шагу 2, иначе выйдите с ошибкой и завершите работу (без шага № 2)

Шаг № 2 - это актуальное ОБНОВЛЕНИЕ.

Или, как предложил Кен.

DenisT
источник
2
Мне нравится этот. Я думаю, что это лучшее решение.
KenWilson
4

Загрузка процессора ниже, скажем, 20%

Настройте агент SQL через окно дополнительных свойств для состояния неактивного процессора . Вы должны установить значение «Среднее использование ЦП ниже» на 20%, а затем, сколько времени он должен оставаться на этом уровне, прежде чем задание будет запущено.

После этого настройте шаг задания, чтобы проверить время, которое оно находится в пределах вашего окна, если в пределах окна выполните команду обновления.

Теперь требование для каждых 5 минут может не соответствовать точно с этой настройкой. Я не смог найти ничего в этом типе расписания, который бы указывал, как часто будет выполняться задание. [например, если вы установите для параметра «и остается ниже этого уровня» значение 30 секунд для состояния незанятого ЦП, выполняется ли это задание так часто?] Это потребует небольшого тестирования, поскольку я никогда раньше не использовал эту конфигурацию. Если я получу шанс, я могу попытаться увидеть, что он делает, и обновлю этот ответ.


источник
Вот как работает условие использования ЦП: если ЦП не достиг заданного порога в течение указанной продолжительности, событие будет запущено и выполнит задание. Если процессор остается бездействующим даже в течение еще одной секунды, то событие будет запущено снова, поэтому задание будет выполнено снова. Но одновременно может запускаться только один экземпляр задания, поэтому реальным результатом является то, что задание будет продолжать запускаться, выполняться, завершаться и повторяться, пока процессор не используется.
c.dunlap
2

Одним из способов было бы иметь три рабочих места. Задание 1 установлено по расписанию, которое позволяет заданию два в начале окна. Задание два настроено на выполнение, когда процессор простаивает, а третье задание отключает задание два в конце окна. Я не думаю, что это единственный способ сделать это, но это определенно самый легкий в моей памяти.

KenWilson
источник
2

Денис был очень близко. Но фактическое решение было немного поменяно местами. Так как powershell не может проверять ЦП в течение определенного периода времени, только при текущем использовании, необходимо было использовать проверку SQL Server.

Итак, мой первый шаг в этой работе - запустить скрипт PowerShell, который проверяет, находится ли текущее системное время между двумя временными ограничениями. Если это так, то скрипт powershell ничего не делает. Задание SQL Server интерпретирует это как успех.

Затем задание переходит к последнему шагу и выполняет запрос на обновление.

Однако, если текущее время выходит за пределы диапазона, я выполняю Start-Time -s 600команду, чтобы приостановить выполнение сценария powershell на 10 минут (имитируя требование «один раз в 5–10 минут»). Это позволяет агенту SQL-сервера постоянно пытаться выполнить это задание. ,

Через 10 минут сценарий powershell выдает пользовательскую ошибку. Поскольку у меня есть $ErrorActionPreference = "Stop"в начале сценария, сценарий powershell перестает выполняться после ошибки. Этот шаг очень важен.

Поскольку powershell остановлен и не вернулся, агент SQL Server интерпретирует это как сбой и не будет переходить к шагу, выполняющему запрос на обновление.

PS Вы, ребята, привели меня в правильном направлении. Если бы у меня было достаточно репутации, я бы проголосовал за вас, ребята.

Изменить: добавлен скрипт 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
источник
1
PowerShell может проверять ЦП в течение определенного времени с помощью командлета Get-Counter. Вы можете опрашивать значение каждые 5 секунд в течение 45 секунд с помощью: $ t = Get-Counter "\ Processor (_total) \% Processor Time" -SampleInterval 5 -MaxSamples 10. Затем можно проанализировать строку, чтобы получить только значения: $ t.Readings.Trim ("\\ сервер \ процессор (_total) \% время процессора:")
Да, но для этого нужно, чтобы сервер sql запускал это задание каждые 5 секунд. Поскольку сервер SQL уже отслеживает загрузку ЦП, я решил пойти по этому пути. Это позволяет мне выполнять работу каждые 10 минут, когда процессор слишком высок.
c.dunlap