進程作為計劃任務運行的速度比互動運行的速度慢

進程作為計劃任務運行的速度比互動運行的速度慢

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

我想知道的是為什麼作為計劃任務運行需要更長的時間 - 多了一個多小時。我注意到的一件事是任務計劃程式以低於正常的優先權運行,因此當我的任務啟動時,它會繼承相同的較低優先權。但是,我已更新腳本以將 Powershell 進程優先權設定回“正常”,但仍然需要同樣長的時間。

有人知道這兩種情況有什麼不同嗎?我已經排除了處理器和 IO 負載方面的差異 - 此任務是系統唯一使用的任務,因此沒有其他正在運行的東西可以競爭資源。

答案1

看來這裡不僅僅是「常規」進程優先權在起作用。正如我在問題中指出的,任務計劃程序預設以低於正常優先順序的方式運行您的任務。StackOverflow 上的這個問題描述如何修復任何任務以正常優先級運行,但修復仍然留下了一點不同:記憶體優先權。記憶體優先權是 Windows Vista 的一項新功能,在這篇 Technet 文章。您可以使用查看記憶體優先權流程瀏覽器,這是任何管理員或程式設計師必備的工具。

無論如何,即使修復了計劃任務優先級,任務的內存優先級也設置為 4,比正常設置 5 低一級。進程相同。

有關提高優先順序的信息,請參閱我對相關 StackOverflow 問題的回答關於IO優先權;設定記憶體優先權的方法類似,透過 NtSetInformationProcessPROCESS_INFORMATION_CLASS設定為ProcessMemoryPriority(該值是 39 或 0x27)。如果其他人需要它並且無法存取程式設計師工具,我可能會製作一個免費實用程序,可用於設定此功能。

編輯:我已經編寫了一個免費實用程式來查詢和設定任務的記憶體優先級,可以在這裡找到。下載包含原始碼和編譯的二進位。

答案2

問題是您的進程以低 I/O 優先權和低記憶體優先權啟動。驗證這一點最簡單的方法是使用 sysinternals 的進程資源管理器。如果您查看從此計劃任務產生的任何進程的屬性,您將看到它的 I/O 優先級為低,記憶體優先級為 2。

這是這個問題的解決方案:

  1. 創建任務
  2. 右鍵單擊任務並“匯出”它
  3. 編輯剛剛匯出的task.xml文件
  4. 您會發現類似以下內容的行<Priority>7</Priority>
  5. 將值變更為正常優先權(4-6 之間)。潛在值表:TaskSettings.Priority 屬性
    • 值為 4 將具有與互動式進程相同的 I/O 和記憶體優先權。值 5 和 6 將具有較低的記憶體優先權
  6. 在任務規劃程式中,刪除您最初建立的任務
  7. 在任務規劃程序的操作區域中,從 XML 檔案匯入任務

不幸的是,無法從 GUI 修改計劃任務的初始優先權。

答案3

這是用於設定優先權的 powershell 片段(在遠端 powershell 會話中工作!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

答案4

也許計劃任務預設以較低的優先權運行。

用於prio強制更高的優先權。

相關內容