5

パラメーターを使用してジョブとして呼び出される、実行時間の長いPowerShell スクリプト ワークフロー-AsJobがあります。Retrieve-Jobコマンドレットを使用して取得する必要がある警告と出力メッセージを定期的に書き込みます。

まだ取得されていないこのジョブの出力を PowerShell がどこに保存するか、また実際的な上限があるかどうかに興味があります。もしそうなら、FIFO方式でジョブ出力を自動的にパージしますか? クラッシュ?

4

1 に答える 1

6

これが本当にあなたの質問に答えるかどうかはわかりませんが、Start-Job1から大きな数までの範囲を作成するさまざまなコマンドを試しました.ほとんどの場合、メモリ不足の例外が発生しましたが、最終的に完了まで動作するようになりました:

# these all bombed out
Start-Job -ScriptBlock { 1..4000000000 }
Start-Job -ScriptBlock { 1..2000000000 }
Start-Job -ScriptBlock { 1..1000000000 }
# this one finally started evaluating
Start-Job -ScriptBlock { 1..100000000 }

しばらく実行したところ、範囲を評価している間に 1 つの CPU コアが完全に消費されました。タスク マネージャーによると、約 5GB の RAM を使用して終了し、それ以上使用したはずでしたが、その時点で物理メモリが不足し始めました。OS が狂ったようにメモリのページングを開始しなければならなかったため、CPU 使用率が低下しました。

下のスクリーンショットでわかるように、実際には別の powershell.exe プロセスが生成されたので、ジョブの実行中にデータをどこに保存するかという質問に部分的に答えていると思います. 利用可能なリソースに依存する実質的な制限があるようです。PowerShell は、ジョブ バッファー内の情報を消去したり、失われたりすることはありません (2 番目のプロセスがクラッシュしない限り?)。いくつかの試行を実行して、環境でサポートできる許容範囲と実際の制限を確認することをお勧めします。

注: 1..100000 のように、はるかに小さい範囲を使用すると、システムを完全に圧倒することなく、動作を観察するための十分な数のレコードが提供されます。より大きな数値を使用して、実際の制限が何であるかを確認しました。

大量のメモリを使用している powershell.exe を示すタスク マネージャー

于 2013-09-08T02:13:24.967 に答える