2013-11-03 2 views
2

Windows EventLogs의 다중 스레드 구문 분석을 구현하려고하는데 이중 코어 시스템에서 순차 코드가 병렬 코드보다 훨씬 빠르다는 것을 알게되었습니다.PowerShell 병렬 대 순차 작업 - 순차가 더 빠릅니까?

연속 :

$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." 

병렬 : 다음은 예입니다 순차 코드는 반면 (에 가까운 50 %의 CPU 사용률로) ~ 오초에서 실행

$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." 

병렬 코드는 ~ 19 초 (CPU 사용률 100 %에 가깝게)로 실행됩니다. 나는 그들 모두가 정확하고 괜찮아 보이는지 확인하기 위해 결과를 echo'd했습니다.

나는 윈도우 8 실행 해요 PowerShell을 세부 사항은 다음과 같습니다

Name       Value 
----       ----- 
PSVersion      3.0 
WSManStackVersion    3.0 
SerializationVersion   1.1.0.1 
CLRVersion      4.0.30319.18051 
BuildVersion     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 초.

답변

1

작성한 각 작업에 대해 스케줄링, .net 런타임로드 등의 리소스가 필요한 새로운 powershell 프로세스가 작성됩니다. 이는 많은 CPU 오버 헤드를 가져오고 작업 당 최소 20MB 이상의 메모리가 필요합니다. 이 때문에

, 작업에 더 적합 : 몇 분 또는 몇 시간 동안 계속

  • 장기 실행 스크립트.

  • 여러 컴퓨터에서 parrallel 코드가 실행 중입니다. 당신이 파워 쉘 작업을 사용하는 경우

+0

프로세스를 길게했지만 언급 된 바와 같이 여전히 직관적이지 않은 결과가 발생합니다 위의 설명에 대한 회신에 – Robin

2

는 PowerShell은의 스크립트 블록을 실행하기 위해 새로운 세션을 생성

을이을 시도해보십시오.

는 작업을 생성 할 비용이 얼마나 많은 시간
measure-command { start-job -ScriptBlock {} } 

. 작업을 사용하는 작업에 소요되는 시간이 그보다 짧으면 로컬 세션에서 작업을 순차적으로 실행하는 것이 좋습니다.

+0

이것이 합리적이지만, 불행히도 내가 보는 것을 설명하지는 않습니다. 작업을 만드는 데 걸리는 시간은 매우 작습니다. 작업 자체를 길게하려면 -MaxEvents 2000으로 변경되었고 현재 작업중인 컴퓨터 (쿼드 코어 i7)에서 실행 중입니다. $ job1을 생성하는 데 걸린 시간은 병렬 코드에서 0.18 초 및 $ job2 0.11 초이며 CPU 사용량은 2 코어를 사용하여 50 %에 가깝습니다. ~ 49 초 소요 순차 코드는 ~ 25 % CPU 사용으로 18 초 만에 실행 – Robin

+0

병렬 코드에서 단일 작업을 실행하려고했는데 ~ 49 초도 걸렸습니다. Get-WinEvent 이전과 이후에 스크립트 블록에 Out-File을 사용하면 대기 작업 또는 수신 작업이 아닌 시간이 걸리는 것으로 나타났습니다. 따라서 병렬 작업에서 스크립트 블록 내에서 실행될 때 Get-WinEvent의 동작은 순차적 코드와 다릅니다. 동일한 시간 차이가 내 Windows 8.1 시스템 * 및 * Server 2008R2에서 분명합니다 (데스크톱 OS가 백그라운드에서 병렬 프로세스를 사용하고 있지만 서버에서 동일한 결과가 발생하는 것으로 추정됩니다). – Robin

+0

@Rob 다음과 같이하십시오 : Receive-Jobs 다음에 -Keep을 추가 한 다음 각 작업을 개별적으로 살펴보십시오. beginTime 및 endTime 타임 스탬프가 있습니다. 그것은 당신에게 일 자체에 무슨 일이 벌어지고 있는지 훨씬 더 정확하게 보여 줄 것이고, 나는 당신이 놀랄 것이라고 생각합니다. 덧붙여서 Powershell 워크 플로우에서 병렬 블록을 사용해 보셨습니까? 당신을 위해 더 잘 작동 할 수도 있습니다. – crownedjitter

0
이미 여기 말했다 http://tfl09.blogspot.com/2010/12/powershell-jobs.html 토마스 리에서 있었는지 지원

또한 문서 :

"당신이 (이세 또는 콘솔 여부) PowerShell은 작업을 실행할 때마다, PowerShell에서 PowerShell.exe의 인스턴스가 실행 생성 스크립트 또는 스크립트 블록. 이것은 각 작업에 약간의 오버 헤드가 있음을 의미합니다. 프로세스 생성에는 CPU/IO/메모리 요구 사항이 있습니다.그러나 여러 프로세스를 별도의 프로세스로 실행할 수 있고 Window의 다중 처리 기능을 사용하면 작업이 병렬로 실행되므로 전체 시간이 훨씬 단축됩니다. 적어도 이론적으로는!

전례에 따라 다릅니다. 실행중인 작업이 로트 또는 리소스를 사용하여 실제로 실행되는 경우 여러 작업을 병렬로 실행하면 리소스 사용률이 높아집니다. 특히 하나 또는 두 개의 '무거운'작업을 사용하면 시스템에서 페이징이 많이 발생하는 것을 알 수 있습니다. 이 페이징은 실제로 병렬 처리의 이점이 페이징 비용으로 휩쓸려 버리는 지점까지 실행 속도를 늦출 수 있습니다. "

+0

페이징으로 설명 할 수 있기를 바랄 지 모르지만 시스템이 그렇게하지 않습니다 (시스템은 SSD에 8GB RAM, 쿼드 코어 i7을 거의 실행하지 않습니다). 메모리에서만 실행해야하는 이러한 예제를 시도해 볼 수 있습니까? 순차 : [link] (http://pastebin.com/7enDSCkK) 및 Parallel : [link] (http://pastebin.com/x1BCYNgV) - 길이에 대해 확신이없는 경우 숫자를 조정할 수 있습니다. 별도의 PS1 파일로 저장하고 별도의 PS 창에서 실행하십시오. 병렬 코드가 실행되면 두 개의 실행 된 PS 프로세스가 프로세스 모니터에서 ~ 46-48 %의 CPU를 사용합니다. 코드는 연속적인 것보다 약 10 배 더 오래 걸립니다. – Robin

+1

그러나 이것을 PowerGUI에서 실행하면 Parallel이 빠릅니다. – Robin

관련 문제