2

我正在尝试实现 Windows EventLogs 的多线程解析,并且在双核系统上我发现顺序代码比并行代码快得多。这些是示例:

顺序:

$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
WSManStackVersion 3.0
序列化版本 1.1.0.1
CLRVersion 4.0.30319.18051
构建版本 6.2.9200.16628
PSCompatibleVersions {1.0、2.0、3.0}
PSRemotingProtocolVersion 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

对于您创建的每个作业,都会创建一个新的 powershell 进程,该进程需要资源来进行调度、加载 .net 运行时等。它会产生大量 CPU 开销,并且每个作业至少需要 20mb+ 内存。

因此,工作更适合:

  • 持续数分钟或数小时的长时间运行脚本。

  • 在多台计算机上并行运行代码。

于 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/Memory 要求。但是如果您可以在单独的进程中运行多个任务,那么使用 Window 的多处理功能,这些作业可以并行运行,因此总体时间要短得多。至少在理论上!

一如既往,这取决于。如果正在执行的任务使用大量资源来实际执行,那么让多个任务并行运行会提高资源利用率。具体来说,如果有超过一两个“繁重”任务,您会发现系统正在大量分页。这种分页实际上可能最终会减慢执行速度,以至于并行化的好处被分页成本扫除。”

于 2013-11-04T17:02:39.840 回答