2016-08-18 2 views
0

약 280 개의 XenApp 서버를 쿼리하고 있습니다. 다음은 내 검색어입니다.WMI 쿼리가 오래 걸립니다.

$bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem" -ComputerName $srv 
#$cpuLoad  = gwmi -Query "SELECT * FROM Win32_Processor" -ComputerName $srv 
#$tSessions = gwmi -Query "SELECT * FROM Win32_TerminalService" -ComputerName $srv 
$ima   = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'" -ComputerName $srv 
$mfcom  = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'" -ComputerName $srv 
$ctxPrintMgr = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'" -ComputerName $srv 
$msmqstatus = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'" -ComputerName $srv 

$cDrive  = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'" -ComputerName $srv 
$dDrive  = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'" -ComputerName $srv 
$loginStatus = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix -ComputerName $srv 
$load   = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix -ComputerName $srv 

최적인지 또는 최적화 할 수 있는지 제안 해주세요. 각 쿼리에 시간 초과 매개 변수를 통합하는 방법도 나와 있습니다. 이것이 가능한가?

+1

WMI 만 너무 많은 진짜 대답은 멀티 스레딩의 많은 전에 당신이 할 수있다. 합리적인 시간대에 수천 개의 서버에서 데이터를 가져올 수 있도록 각 서버마다 100 개의 스레드를 사용하여 여러 서버에 이러한 종류의 문제를 전파하는 터무니없는 시스템이 있습니다. Start-Job과 친구들을 보았습니까? –

+0

start-job help는 280 개의 서버 모두에서 동시에 실행됩니다. 또한 내 대답을 도와주세요 : 내 코드는 원격 파일 공유에 누워있다, 시작 작업은 각 서버에 로컬 파일이 필요하거나 원격 공유에 스크립트를 처리 할 수 ​​있습니다. – user183932

답변

5

동일한 호스트에 대해 동일한 클래스에 대해 여러 쿼리를 실행하는 것은 확실히 최적이 아닙니다. 당신은 동일한 클래스에 대한 쿼리의 WHERE 절을 병합하여 어느 정도 코드를 최적화 할 수 있습니다

SELECT * FROM Win32_Service WHERE name='imaservice' OR name='mfcom' OR name='cpsvc' OR name='msmq' 

을하지만, 당신은 아직도 내가 원격 호스트의 전체 코드를 실행하는 것이 좋습니다 여러 가지 클래스를 쿼리해야하기 때문에과 맞춤 객체로 결과를 리턴 :

$result = Invoke-Command -ComputerName $srv -ScriptBlock { 
    New-Object -Type PSObject -Property @{ 
    computername = $env:COMPUTERNAME 
    bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem" 
    #cpuLoad  = gwmi -Query "SELECT * FROM Win32_Processor" 
    #tSessions = gwmi -Query "SELECT * FROM Win32_TerminalService" 
    ima   = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'" 
    mfcom  = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'" 
    ctxPrintMgr = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'" 
    msmqstatus = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'" 
    cDrive  = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'" 
    dDrive  = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'" 
    loginStatus = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix 
    load   = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix 
    } 
} 

실행 Invoke-Command를 각 서버에 대해 별도 job으로하는 병렬 쿼리를 실행함으로써 전체 처리 시간을 감소시킨다. (마티아스는 의견 제안)

Start-Job -ScriptBlock { 
    Invoke-Command -ComputerName $args[0] -ScriptBlock { 
    New-Object ... 
    } 
} -ArgumentList $srv 

Get-Job | Wait-Job | Receive-Job 

또는

Invoke-Command -ComputerName $srv -AsJob -ScriptBlock { 
    New-Object ... 
} 

Get-Job | Wait-Job | Receive-Job 
+2

Invoke-Command에는 '-AsJob'스위치가있어 더 쉽게 사용할 수 있습니다! –

+0

-asjob과 함께 invoke-command를 실행하려고하는데 결과가 전혀 없습니다. $ serversRaw = qfarm/load $ hostnames = for ($ i = 3; $ i -lt $ serversRaw.length; $ ($ 결과 = 읽기 호스트 "c : 또는 D : [기본값은 C :]"를 입력하십시오.) -eq '') {$ drive = "C :"} else {$ drive = $ result} icm -computer $ 호스트 이름 {gwmi -cl win32_logicaldisk | ? {$ _. deviceid -eq $ drive} | 크기, 자유 공간, pscomputername 선택} -asjob # $ x | 수신 작업 수신 작업 – user183932

+0

@ user183932 신규 또는 추가 질문이있는 경우 : 새로운 질문을 게시하십시오. 이 질문에 설명 된 문제를 해결하는 데 도움이되는 내 대답을 발견하면 [수락] (http://meta.stackoverflow.com/a/5235)을 고려하십시오. –

관련 문제