0

約 280 の XenApp サーバーにクエリを実行しています。ここに私の質問があります。

$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

これが最適かどうか、または最適化できるかどうかを教えてください。また、各クエリにタイムアウト パラメータを組み込む方法。これは可能ですか?

4

1 に答える 1

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サーバーごとに個別のジョブで実行してクエリを並行して実行し、全体的な処理時間を短縮します。

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
于 2016-08-18T14:22:58.430 に答える