2

Windows EventLog のマルチスレッド解析を実装しようとしていますが、デュアル コア システムでは、順次コードが並列コードよりもはるかに高速であることがわかりました。これらは例です:

一連の:

$start = Get-Date

$code1 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003005914.evtx" -MaxEvents 200 }
$code2 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003015906.evtx" -MaxEvents 200 }

$result1 = & $code1
$result2 = & $code2

$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds in all."

平行:

$start = Get-Date

$code1 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003005914.evtx" -MaxEvents 200 }
$code2 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003015906.evtx" -MaxEvents 200 }

$job1 = Start-Job -ScriptBlock $code1 
$job2 = Start-Job -ScriptBlock $code2 

$alljobs = Wait-Job $job1, $job2
$result1, $result2 = Receive-Job $alljobs

$end = Get-Date
$timespan = $end - $start

$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds in all."

順次コードは ~5 秒 (CPU 使用率が 50% 近く) で実行されるのに対し、並列コードは ~19 秒 (CPU 使用率が 100% 近く) で実行されます。結果をエコーし​​て、両方が正しく、問題ないように見えることを確認しました。

Windows 8 を実行しています。PowerShell の詳細は次のとおりです。

名前 値
---- -----
PSバージョン3.0
WSManStack バージョン 3.0
シリアル化バージョン 1.1.0.1
CLR バージョン 4.0.30319.18051
ビルドバージョン 6.2.9200.16628
PSCompatibleVersions {1.0、2.0、3.0}
PSRemotingProtocolバージョン 2.2

何か案は?

編集: この難問を生み出すのは Get-WinEvent だけではありません。同じ結果で Get-ChildItem を試しました。

ただし、これを実行するコードとして使用すると、並列コードはより速く実行されます (予想どおり)。

$code1 = { Start-Sleep -Seconds 5; "A" }
$code2 = { Start-Sleep -Seconds 12; "B" }

シーケンシャルで 17.002 秒。並列で14.2秒。

4

3 に答える 3

2

Powershell ジョブを使用すると、Powershell はスクリプトブロックを実行するための新しいセッションを作成します。

これを試して:

measure-command { start-job -ScriptBlock {} }

それは、ジョブを作成するのにかかる時間です。ジョブを使用しているタスクの所要時間がそれより短い場合は、ローカル セッションでタスクを順番に実行する方がよいでしょう。

于 2013-11-03T17:13:37.863 に答える
1

作成するジョブごとに、スケジューリングや .net ランタイムのロードなどにリソースを必要とする新しい powershell プロセスが作成されます。多くの CPU オーバーヘッドが発生し、ジョブごとに最低 20 MB 以上のメモリが必要です。

このため、仕事は次のような方に適しています。

  • 数分から数時間続く長時間実行スクリプト。

  • 複数のコンピューターでコードを並行して実行する。

于 2013-11-03T17:13:09.983 に答える
0

http://tfl09.blogspot.com/2010/12/powershell-jobs.htmlの Thomas Lee による、ここで既に述べたことを裏付ける追加のドキュメント:

「PowerShell ジョブを (ISE またはコンソールで) 実行するたびに、PowerShell は PowerShell.exe のインスタンスを作成してスクリプトまたはスクリプト ブロックを実行します。これは、各ジョブに多少のオーバーヘッドが伴うことを意味します。プロセスの作成には CPU/ IO/メモリ要件. しかし、複数のタスクを別々のプロセスで実行できる場合、Windows のマルチプロセッシング機能を使用すると、ジョブが並行して実行されるため、全体の時間が大幅に短縮されます. 少なくとも理論的には!

相変わらず、場合による。実行中のタスクが実際に実行するために多くまたはリソースを使用する場合、複数のタスクを並行して実行すると、リソースの使用率が高くなります。具体的には、「重い」タスクが 1 つまたは 2 つ以上ある場合、システムのページングが頻繁に行われていることがわかります。このページングは​​実際には実行速度を遅くし、ページングのコストによって並列化の利点が失われる可能性があります。」

于 2013-11-04T17:02:39.840 に答える