Jalankan Pekerjaan Server Agent sesuai Jadwal hanya jika CPU dalam kondisi idle

8

Saya memiliki pekerjaan yang diatur dalam SQL Server Agent untuk menjalankan permintaan pembaruan. Saya ingin pekerjaan ini dieksekusi setiap malam antara tengah malam dan jam 5 pagi dan saya ingin pekerjaan ini diulang setiap 5 menit selama jangka waktu tersebut. Tapi saya hanya ingin pekerjaan benar-benar dieksekusi jika CPU idle, yaitu utilisasi CPU di bawah katakanlah 20%. Saya tahu saya dapat mengatur jadwal, dan saya juga dapat mengatur persyaratan CPU Idle secara terpisah. Apakah ada cara bagi saya untuk mengaturnya sehingga kedua 'jadwal' harus benar agar pekerjaan dapat berjalan?

Terima kasih

cununap
sumber

Jawaban:

6

Atau Anda dapat memiliki satu pekerjaan yang berjalan setiap 5 menit dengan 2 langkah:

Langkah # 1 - periksa Penggunaan CPU (PowerShell), hanya google dan ada banyak skrip di luar sana; Jika <20% keluar dengan sukses, lanjutkan ke Langkah 2, Keluar dengan Kesalahan dan selesaikan pekerjaan (Tidak Langkah # 2)

Langkah # 2 - adalah UPDATE yang sebenarnya.

Atau seperti yang disarankan Ken.

DenisT
sumber
2
Saya suka yang ini. Saya pikir ini solusi yang lebih baik.
KenWilson
4

Pemanfaatan CPU di bawah ini mengatakan 20%

Mengkonfigurasi SQL Agent melalui jendela Advanced properties untuk Kondisi CPU Idle . Anda akan menetapkan nilai "Penggunaan CPU rata-rata di bawah" menjadi 20%, dan kemudian berapa lama harus tetap pada tingkat itu sebelum pekerjaan akan berjalan.

Setelah itu konfigurasikan langkah pekerjaan untuk memeriksa waktu memastikannya ada di dalam jendela Anda, jika di dalam jendela berikan perintah pembaruan.

Sekarang persyaratan untuk setiap 5 menit mungkin tidak dapat dipenuhi dengan pengaturan ini. Saya tidak dapat menemukan apa pun pada jenis jadwal ini yang menunjukkan seberapa sering pekerjaan itu akan dieksekusi. [mis. jika Anda mengatur "dan tetap di bawah level ini" ke 30 detik untuk kondisi CPU menganggur, apakah itu menjalankan pekerjaan yang sering?] Itu akan memerlukan sedikit pengujian karena saya belum pernah menggunakan konfigurasi ini sebelumnya. Jika saya mendapat kesempatan, saya dapat mencoba untuk melihat apa yang dilakukannya dan akan memperbarui jawaban ini.


sumber
Cara kerja kondisi Penggunaan CPU adalah: Jika CPU berada di bawah ambang batas yang ditentukan untuk durasi yang ditentukan, acara tersebut akan diaktifkan dan dijalankan. Jika CPU tetap tidak digunakan selama sedetik pun, maka acara akan dinyalakan kembali sehingga pekerjaan akan mencoba berjalan kembali. Tetapi hanya satu contoh pekerjaan yang dapat berjalan pada satu waktu sehingga hasil dunia nyata adalah pekerjaan akan terus memulai, mengeksekusi, menyelesaikan, ulangi selama CPU tetap menganggur.
c.dunlap
2

Salah satu caranya adalah memiliki tiga pekerjaan. Pekerjaan satu diatur pada jadwal yang memungkinkan pekerjaan dua di awal jendela. Pekerjaan dua diatur untuk dijalankan ketika CPU menganggur dan pekerjaan ketiga menonaktifkan pekerjaan dua di akhir jendela. Saya tidak berpikir itu satu-satunya cara untuk melakukannya, tetapi itu pasti yang paling mudah dalam pikiran saya.

KenWilson
sumber
2

Denis sangat dekat. Tetapi solusi yang sebenarnya adalah sedikit bertukar. Karena PowerShell tidak dapat memeriksa CPU selama durasi, hanya penggunaan saat ini, cek SQL Server harus digunakan.

Jadi, langkah pertama pekerjaan saya adalah menjalankan skrip PowerShell yang memeriksa untuk melihat apakah waktu sistem saat ini antara dua kendala waktu. Jika ya, maka skrip powershell tidak melakukan apa pun. Pekerjaan SQL Server mengartikan ini sebagai sukses.

Kemudian Pekerjaan bergerak ke langkah terakhir dan melakukan permintaan pembaruan.

Namun, jika waktu saat ini di luar kisaran saya melakukan Start-Time -s 600untuk menjeda skrip PowerShell selama 10 menit (mensimulasikan "sekali 5 - 10 menit persyaratan). Ini adalah untuk menjaga agen SQL server dari terus-menerus mencoba menjalankan pekerjaan ini .

Setelah 10 menit, skrip PowerShell melempar kesalahan khusus. Karena saya miliki $ErrorActionPreference = "Stop"di awal skrip, skrip PowerShell berhenti dijalankan setelah kesalahan. Langkah ini sangat penting.

Karena PowerShell berhenti dan tidak kembali, SQL Server Agent menafsirkan ini sebagai kegagalan dan tidak akan melanjutkan ke langkah yang melakukan permintaan pembaruan.

PS Kalian menuntun saya ke arah yang benar. Jika saya memiliki cukup reputasi, saya akan membesarkan hati kalian.

Sunting: Menambahkan Skrip 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"
}
cununap
sumber
1
PowerShell dapat memeriksa CPU selama durasi dengan menggunakan cmdlet Get-Counter. Anda dapat mengumpulkan nilai setiap 5 detik selama 45 detik dengan: $ t = Dapatkan-Counter "\ Processor (_total) \% Waktu Proses" -SampleInterval 5 -MaxSamples 10. Anda kemudian dapat mengurai string untuk mendapatkan nilai hanya dengan: $ t.Readings.Trim ("\\ server \ processor (_total) \% Waktu prosesor:")
Ya, tetapi ini akan mengharuskan saya untuk mengizinkan sql server menjalankan pekerjaan itu setiap 5 detik. Karena SQL server sudah memantau penggunaan CPU selama saya memilih untuk pergi rute itu. Ini memungkinkan saya untuk hanya menjalankan pekerjaan setiap 10 menit ketika CPU terlalu tinggi.
c.dunlap