プロセスは、インタラクティブに実行するよりも、スケジュールされたタスクとして遅くなります


41

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

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

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


アップデートはありますか?私はあなたが見つけることができるものを見て非常に興味があります。
mfinni

私が原因だと思うことを見つけました。以下の私の答えをご覧ください。
チャーリー

Windows 10 Fall Creatorsの時点では、この問題は依然として存在しており、@ Jason Mathisonの回避策(タスクスケジューラの.xmlファイルを編集する)が依然として最善のソリューションです。
BSalita

回答:


36

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

とにかく、スケジュールされたタスクの優先度の修正を行っても、タスクのメモリ優先度は4に設定されます。これは、通常の設定5よりも1ノッチ低いです。プロセスをインタラクティブに実行するのと同等です。

優先度の引き上げに関する情報については IO優先度に関するStackOverflowの関連質問への私の回答を参照しください。メモリの優先度の設定も同様に、NtSetInformationProcessを介してPROCESS_INFORMATION_CLASS設定されますProcessMemoryPriority(この値は39または0x27です)。他の人がそれを必要とし、プログラマーツールにアクセスできない場合、これを設定するために使用できる無料のユーティリティを作成するかもしれません。

編集:私は先に進み、ここ利用可能なタスクのメモリ優先度を問い合わせて設定するための無料のユーティリティを書きました。ダウンロードには、ソースコードとコンパイル済みバイナリの両方が含まれています。


あなたは、実行可能ファイルの名前をダブルクリックしてプロセスエクスプローラでメモリの優先順位を参照してください「パフォーマンス」タブを開き、「物理メモリ」の下に「メモリ優先」のエントリであることができます
モシェ

17

問題は、プロセスが低い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からスケジュールされたタスクの初期優先順位を変更する方法はありません。


提案をありがとう。通常のプロセス優先度とIO優先度は間違いなくその一部であり、他の部分はメモリ優先度です。詳細については、受け入れられた回答を参照してください。
チャーリー

タスクをXMLファイルにエクスポートした後、文字エンコードをUnicodeからANSIに変更する必要がある場合があります。Windows Server 2008 R2では、エクスポートはUnicodeファイルであり、インポートして戻すとエラーメッセージThe format of the task is not valid. The following error was reported: (1,2)::が表示されます。ファイルをANSIに保存すると解決します。
エリックアンダーソン

本当にありがとう、これは本当に最高のソリューションです。ドキュメントが言及しているように、CPU優先度を高くするために、優先度をさらに高く設定することもできます(少なくとも1まで)。
ルーンアーモット

レジストリでこれを微調整できるかもしれないと考えている人にとっては、気にしないで、うまく編集できる方法でそこにいるようには見えません。
ニック

1

ユーザーXとしてスケジュールされたタスクとして実行するように設定し、実行する前にユーザーXとしてログインすると、実行時にセッションでウィンドウが開き、セッションで実行されます。

これを行う場合、それはより長い、またはより短い時間を要しますか?これが何を意味するのか分かりませんが、それは有用な差別化要因かもしれません。ログイン時にユーザーアカウントが持つネットワークアクセスがありますが、スケジュールされたタスクとして実行しているときは、タイムアウトして失敗する必要がありますか?新しいユーザーアカウントを作成し、そのアカウントでスケジュールされたタスクとして実行する場合の動作は異なりますか?

別のアイデア:スケジュールされたタスクとして実行する場合-スクリプトの優先度を修正したので、サブプロセスはすべて通常または通常以下として実行されますか?


1
サブプロセスは、procexp / taskmanによって検証されるように、必ず通常として実行されます。実質的なネットワークアクセスを行わないため、ネットワークの問題ではないと思いますが、再確認します。タスクをインタラクティブとして実行するという考え方も興味深いので、試してみます。
チャーリー

プロセス自体は、これが問題になるために知っているネットワークアクセスを行う必要はありません。Sysinternalsからのこの投稿を読んで、一見無関係に見える何かがハング/スローネスを引き起こす可能性があることを確認してください。 blogs.technet.com/b/markrussinovich/archive/2005/08/28/...
mfinni

1

スケジュールされたタスクはデフォルトで低い優先度で実行される可能性があります。

prioより高い優先度を強制するために使用します。


あなたは彼らが低い優先度で実行することは正しいですが、私が言ったように、私はすでにそれを説明しました。私が知らないプロセス優先度以外の優先度がない限り。
チャーリー

0

最初は-通常より高い優先度を使用できます(たとえば、高)

第二に-フォアグラウンドセッションが主にハードディスクIOとメモリを使用するため、スケジュールされたタスクが少なくなるため、理解する必要があります。明確なベンチマークを得るには、PowerShellスクリプトの実行中にログオフする必要があります

また、メモリを追加する/ ramdriveを使用する/複数のハードディスクで作業を分割してプロセスを高速化することもできます


アイデアをありがとう。マシンには十分なメモリとIO容量がありますが、問題は、スケジュールされたタスクとして対話的に実行するよりも処理が遅くなるだけです。スケジュールされたタスクが実行されている場合、通常、対話型ログオンセッションはないため、これも問題ではないと思います。
チャーリー

0

この質問はしばらく前のもので、Windows Server 2008R2のものです。同じ質問がありましたが、Windows 10の場合、Windows 10(1703および1809で検証済み)では、インポートされたxmlを介して「優先度」を4に設定するだけで、同じ基本優先度、動的優先度、I / O優先度を得ることができます、および対話的に開始されたプロセスとしてのメモリ優先度。


0

優先順位を設定するためのPowerShellスニペットを次に示します(リモートPowerShellセッションで動作します!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.