CPUがアイドル状態の場合にのみ、サーバーエージェントジョブをスケジュールどおりに実行する


8

SQL Serverエージェントで更新クエリを実行するようにジョブを設定しています。このジョブを毎晩真夜中から午前5時まで実行し、その時間枠内で5分ごとに繰り返すようにしたい。ただし、CPUがアイドル状態の場合、つまり、CPU使用率が20%を下回っている場合にのみ、ジョブを実際に実行する必要があります。スケジュールを設定できることはわかっていますが、CPUアイドル要件を個別に設定することもできます。ジョブを実行するために両方の「スケジュール」がtrueでなければならないように設定する方法はありますか?

ありがとう

回答:


6

または、2つのステップで5分ごとに実行される1つのジョブを持つことができます。

ステップ#1-CPU使用率(PowerShell)をチェックします。Googleだけで、そこにはたくさんのスクリプトがあります。20%未満で成功して終了する場合は、ステップ2に進み、それ以外の場合はエラーで終了してジョブを終了します(ステップ#2なし)

ステップ2-実際の更新です。

またはケンが示唆したように。


2
私はこれが好きです。私はそれがより良い解決策だと思います。
ケンウィルソン2014年

4

CPU使用率が20%を下回っています

Idle CPU Conditionの [詳細プロパティ]ウィンドウからSQLエージェントを構成します。「平均CPU使用率が下回る」値を20%に設定し、ジョブが実行されるまでにそのレベルを維持する必要がある時間を設定します。

その後、ウィンドウ内にある場合はupdateコマンドを発行して、ジョブステップがウィンドウ内にあることを確認するためにジョブステップを構成します。

5分ごとの要件は、この設定では正確に満たされない場合があります。このスケジュールタイプでは、ジョブが実行される頻度を示すものは何も見つかりませんでした。[たとえば、アイドルCPU状態で「このレベルを下回る」を30秒に設定した場合、ジョブは頻繁に実行されますか?]これまでこの構成を使用したことがないため、少しテストが必要になります。機会があれば、それが何であるかを見ることができ、この答えを更新します。


CPU使用率の条件が機能する方法は次のとおりです。CPUが指定された期間、指定されたしきい値を下回っている場合、イベントが発生してジョブを実行します。CPUがさらに1秒間アイドル状態のままである場合、イベントが再度発生するため、ジョブが再度実行されます。ただし、一度に実行できるジョブのインスタンスは1つだけなので、CPUがアイドル状態である限り、ジョブは継続して開始、実行、終了、繰り返しになります。
c.dunlap 2014年

2

1つの方法は、3つの仕事をすることです。ウィンドウの最初でジョブ2を有効にするスケジュールに設定されたジョブ1。ジョブ2は、CPUがアイドル状態のときに実行するように設定されており、3番目のジョブはウィンドウの最後でジョブ2を無効にします。それが唯一の方法だとは思いませんが、私の心の中でそれは間違いなく最も簡単です。


2

デニスはとても親しかった。しかし、実際のソリューションは少し交換されました。powershellは一定期間CPUをチェックできないため、現在の使用状況のみを確認できるため、SQL Serverチェックを使用する必要がありました。

したがって、ジョブの最初のステップは、現在のシステム時刻が2つの時間制約の間にあるかどうかを確認するPowerShellスクリプトを実行することでした。そうであれば、PowerShellスクリプトは何もしません。SQL Serverジョブは、これを成功と解釈します。

次に、ジョブは最後のステップに進み、更新クエリを実行します。

ただし、現在の時刻が範囲外の場合は、Start-Time -s 600Powershellスクリプトを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"
}

1
PowerShellは、Get-Counterコマンドレットを使用して、一定期間CPUをチェックできます。$ t = Get-Counter "\ Processor(_total)\%Processor Time" -SampleInterval 5 -MaxSamples 10.を使用して、45秒で5秒ごとに値をポーリングできます。次に、次のようにして文字列を解析して値を取得できます。 $ t.Readings.Trim( "\\ server \ processor(_total)\%Processor time:")

はい。ただし、SQLサーバーが5秒ごとにそのジョブを実行できるようにする必要があります。SQLサーバーは既にCPU使用率を監視しているため、そのルートを選択しました。これにより、CPUが高すぎる場合にのみ、10分ごとにジョブを実行できます。
c.dunlap 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.