2016-08-18 8 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スレッドずつ実行して、妥当な時間枠で数千のサーバーからデータを取り出すことができます。あなたはスタート・ジョブと友達を見ていたのですか? –

+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; $ ($ result = Read-host "c:またはD:[デフォルトはC:]"を入力してください)-eq '' ){$ drive = "C:"} else {$ drive = $ result} icm -computer $ hostnames {gwmi -cl win32_logicaldisk | ? {$ _。deviceid -eq $ drive} |サイズ、空き領域、pscomputernameを選択} -asjob #$ x | receive-job receive-job – user183932

+0

@ user183932新規またはフォローアップの質問がある場合:新しい質問を投稿してください。この質問に記載されている問題を解決するのに役立つ私の答えが見つかった場合:[それを受け入れる](http://meta.stackoverflow.com/a/5235)を検討してください。 –

関連する問題