プロセスは、対話型で実行するよりもスケジュールされたタスクとして実行するのが遅くなります。

プロセスは、対話型で実行するよりもスケジュールされたタスクとして実行するのが遅くなります。

スケジュールされたタスクがあり、これは CPU と IO を非常に集中的に使用し、実行に約 4 時間かかります (興味があれば、ソース コードのビルドにもかかります)。タスクは、さまざまなサブプロセスを作成して作業を行う Powershell スクリプトです。同じユーザー アカウントで Powershell プロンプトから同じプロセスを対話的に実行すると、約 2 時間半で実行されます。タスクは Windows Server 2008 R2 で実行されています。

私が知りたいのは、スケジュールされたタスクとして実行するとなぜこんなにも時間がかかるのか、1 時間以上もかかるのかということです。気づいたことの 1 つは、タスク スケジューラが通常以下の優先度で実行されるため、タスクが開始されると、同じ低い優先度が継承されるということです。ただし、スクリプトを更新して、Powershell プロセスの優先度を通常に戻しましたが、それでも同じ時間がかかります。

2 つのシナリオの違いについて、何か考えはありますか? プロセッサと IO 負荷の違いは除外しました。このタスクはシステムが使用される唯一のタスクであるため、リソースを競合する可能性のある他の実行中のタスクはありません。

答え1

ここでは、単なる「通常の」プロセス優先度以上のものが機能しているようです。質問で述べたように、タスク スケジューラはデフォルトで、通常よりも低い優先度でタスクを実行します。StackOverflowのこの質問では、タスクを通常の優先度で実行するように修正する方法が説明されていますが、この修正では、メモリの優先度というわずかに異なる点が残っています。メモリの優先度はWindows Vistaの新機能であり、このTechnetの記事メモリの優先度は次のように確認できます。プロセスエクスプローラーこれは、管理者やプログラマーにとって必須のツールです。

とにかく、スケジュールされたタスクの優先度を修正しても、タスクのメモリ優先度は 4 に設定され、これは通常の設定である 5 より 1 段階低い値です。タスクのメモリ優先度を手動で 5 まで上げると、パフォーマンスはプロセスを対話的に実行する場合と同等になりました。

優先度を上げる方法については、関連するStackOverflowの質問に対する私の回答IO 優先度について。メモリ優先度の設定も同様に、NtSetInformationProcess を介して(この値は 39 または 0x27)PROCESS_INFORMATION_CLASSに設定して行われProcessMemoryPriorityます。他の人がこれを必要とし、プログラマー ツールにアクセスできない場合は、これを設定するために使用できる無料のユーティリティを作成する可能性があります。

編集: タスクのメモリ優先度を照会および設定するための無料ユーティリティを作成しました。こちらから入手可能ダウンロードにはソース コードとコンパイルされたバイナリの両方が含まれます。

答え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

関連情報