Performance

程序作為計劃任務執行比互動式執行慢

  • May 28, 2021

我有一個非常耗費 CPU 和 IO 的計劃任務,執行大約需要四個小時(如果您好奇,可以建構原始碼)。該任務是一個 Powershell 腳本,它產生各種子程序來完成其工作。當我從 Powershell 提示符互動地執行相同的程序時,作為相同的使用者帳戶,它執行大約兩個半小時。該任務在 Windows Server 2008 R2 上執行。

我想知道的是為什麼作為計劃任務執行需要更長的時間——一個多小時。我注意到的一件事是任務調度程序以低於正常的優先級執行,因此當我的任務啟動時,它繼承了相同的降低優先級。但是,我已經更新了腳本以將 Powershell 程序優先級設置回正常,並且仍然需要同樣長的時間。

有人知道這兩種情況有什麼不同嗎?我已經排除了處理器和 IO 負載的差異——這個任務是系統唯一的用途,所以沒有其他執行可能會爭奪資源。

似乎這裡不僅僅是“正常”流程優先級。正如我在問題中指出的那樣,預設情況下,任務調度程序以低於正常優先級的方式執行您的任務。StackOverflow 上的這個問題描述瞭如何修復任何任務以正常優先級執行,但修復仍然留下一點不同:記憶體優先級。記憶體優先級是 Windows Vista 的一項新功能,在Technet 這篇文章中進行了描述。您可以使用Process Explorer查看記憶體優先級,這是任何管理員或程序員必備的工具。

無論如何,即使修復了計劃任務優先級,您的任務的記憶體優先級也設置為 4,比正常設置的 5 低一個檔次。當我手動將任務的記憶體優先級提高到 5 時,性能開啟與互動式執行程序相提並論。

有關提高優先級的資訊,請參閱我對 StackOverflow有關 IO 優先級的相關問題的回答;設置記憶體優先級的方法類似,通過 NtSetInformationProcessPROCESS_INFORMATION_CLASS設置為ProcessMemoryPriority(其值為 39 或 0x27)。如果其他人需要它並且無法訪問程序員工具,我可能會製作一個免費實用程序來設置它。

編輯:我已經繼續編寫了一個免費實用程序,用於查詢和設置任務的記憶體優先級,可在此處獲得。下載包含原始碼和已編譯的二進製文件。

引用自:https://serverfault.com/questions/151824