Chạy công việc đại lý máy chủ theo lịch chỉ khi CPU không hoạt động


8

Tôi có một công việc được thiết lập trong SQL Server Agent để chạy truy vấn cập nhật. Tôi muốn công việc này được thực hiện mỗi đêm từ nửa đêm đến 5 giờ sáng và tôi muốn nó lặp lại cứ sau 5 phút trong khung thời gian đó. Nhưng tôi chỉ muốn công việc thực sự thực thi nếu CPU không hoạt động, đó là mức sử dụng CPU dưới 20%. Tôi biết tôi có thể thiết lập lịch trình và tôi cũng có thể thiết lập riêng yêu cầu CPU Idle. Có cách nào để tôi thiết lập nó để cả hai 'lịch trình' phải đúng với công việc không?

Cảm ơn

Câu trả lời:


6

Hoặc bạn có thể có một công việc chạy cứ sau 5 phút với 2 bước:

Bước # 1 - kiểm tra mức độ sử dụng CPU (PowerShell), chỉ cần google và có rất nhiều tập lệnh ngoài kia; Nếu thoát <20% thành công, hãy chuyển sang Bước 2, Thoát khỏi Lỗi và hoàn thành công việc (Không có Bước # 2)

Bước # 2 - là CẬP NHẬT thực tế.

Hoặc như Ken đề nghị.


2
Tôi thích cái này. Tôi nghĩ đó là một giải pháp tốt hơn.
KenWilson

4

Sử dụng CPU dưới 20%

Định cấu hình Tác nhân SQL thông qua cửa sổ Thuộc tính nâng cao cho Điều kiện CPU nhàn rỗi . Bạn sẽ đặt giá trị "Mức sử dụng CPU trung bình giảm xuống dưới" đến 20%, và sau đó nó phải giữ ở mức đó bao lâu trước khi công việc sẽ chạy.

Sau đó, cấu hình bước công việc để kiểm tra thời gian đảm bảo nó nằm trong cửa sổ của bạn, nếu trong cửa sổ phát lệnh cập nhật.

Bây giờ yêu cầu cứ sau 5 phút có thể không được đáp ứng chính xác với thiết lập này. Tôi không thể tìm thấy bất cứ điều gì trong loại lịch trình này cho biết tần suất công việc sẽ được thực hiện. [ví dụ: nếu bạn đặt "và duy trì dưới mức này" thành 30 giây cho điều kiện CPU nhàn rỗi, nó có chạy công việc thường xuyên không?] Điều đó sẽ yêu cầu một chút thử nghiệm vì tôi chưa bao giờ sử dụng cấu hình này trước đây. Nếu tôi có cơ hội tôi có thể thử xem những gì nó làm và sẽ cập nhật câu trả lời này.


Cách thức hoạt động của điều kiện sử dụng CPU là: Nếu CPU đã ở dưới ngưỡng được chỉ định trong khoảng thời gian được chỉ định, sự kiện sẽ kích hoạt và chạy công việc. Nếu CPU không hoạt động trong một giây nữa, thì sự kiện sẽ được kích hoạt lại do đó công việc sẽ cố gắng chạy lại. Nhưng chỉ một trường hợp của một công việc có thể chạy cùng một lúc nên kết quả trong thế giới thực là công việc sẽ tiếp tục bắt đầu, thực thi, kết thúc, lặp lại miễn là CPU không hoạt động.
c.dunlap

2

Một cách sẽ có ba công việc. Công việc một được đặt trên một lịch trình cho phép công việc hai ở đầu cửa sổ. Công việc hai được thiết lập để chạy khi CPU không hoạt động và công việc thứ ba vô hiệu hóa công việc hai ở cuối cửa sổ. Tôi không nghĩ đó là cách duy nhất để làm điều đó nhưng nó chắc chắn là dễ nhất trong tâm trí tôi.


2

Denis đã rất thân thiết. Nhưng giải pháp thực tế là một chút hoán đổi. Vì powershell không thể kiểm tra CPU trong một khoảng thời gian, chỉ sử dụng hiện tại, kiểm tra SQL Server phải được sử dụng.

Vì vậy, bước đầu tiên của công việc là chạy tập lệnh PowerShell để kiểm tra xem thời gian hệ thống hiện tại có nằm giữa hai ràng buộc thời gian không. Nếu có, thì tập lệnh powershell không làm gì cả. Công việc SQL Server diễn giải điều này là một thành công.

Sau đó, công việc chuyển sang bước cuối cùng và thực hiện truy vấn cập nhật.

Tuy nhiên, nếu thời gian hiện tại nằm ngoài phạm vi tôi thực hiện Start-Time -s 600để tạm dừng tập lệnh powershell trong 10 phút (mô phỏng "yêu cầu 5 - 10 phút một lần). Điều này là để giữ cho tác nhân máy chủ SQL không ngừng cố gắng chạy công việc này .

Sau 10 phút, tập lệnh powershell đưa ra một lỗi tùy chỉnh. Vì tôi có $ErrorActionPreference = "Stop"ở phần đầu của tập lệnh, tập lệnh powershell dừng thực thi sau lỗi. Bước này rất quan trọng.

Vì powershell đã dừng và không trả về, SQL Server Agent diễn giải điều này là một lỗi và sẽ không tiếp tục bước thực hiện truy vấn Cập nhật.

PS Các bạn đã dẫn tôi đi đúng hướng. Nếu tôi có đủ danh tiếng, tôi sẽ nâng cao các bạn.

Chỉnh sửa: Đã thêm 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 có thể kiểm tra CPU trong một khoảng thời gian bằng cách sử dụng lệnh ghép ngắn Get-Counter. Bạn có thể thăm dò giá trị cứ sau 5 giây trong 45 giây với: $ t = Get-Counter "\ Processor (_total) \% Time Processor" -SampleInterval 5 -MaxSamples 10. Sau đó, bạn có thể phân tích chuỗi để chỉ nhận các giá trị bằng cách: $ t.Readings.Trim ("\ server \ bộ xử lý (_total) \% Thời gian xử lý:")

Có, nhưng điều này sẽ yêu cầu tôi cho phép máy chủ sql chạy công việc đó cứ sau 5 giây. Vì máy chủ SQL đã theo dõi việc sử dụng CPU trong một khoảng thời gian tôi đã chọn để đi theo con đường đó. Điều này cho phép tôi chỉ thực hiện công việc cứ sau 10 phút khi CPU quá cao.
c.dunlap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.