2010-07-22 4 views
0

J'ai écrit la fonction Powershell ci-dessous pour appeler une unité F5. Il boucle pour chaque serveur et obtient chaque stat individuel, puis exécute un appel SQL SMO.Fonction Slow Powershell. Comment améliorer?

Le code s'exécute très lentement et je pense avoir écarté l'appel SQL comme cause.

Comment la Powershell peut-elle être améliorée?

function Print-VServerStats() 
{ 

param($virtual_server); 


$VirtualServerStatistics = (Get-F5.iControl).LocalLBVirtualServer.get_statistics((, $virtual_server)); 
$VirtualServerStatisticEntry = $VirtualServerStatistics.statistics[0]; 
$Statistics = $VirtualServerStatisticEntry.statistics | ? {$_.type -eq "STATISTIC_CLIENT_SIDE_CURRENT_CONNECTIONS" -or 
                  $_.type -eq "STATISTIC_CLIENT_SIDE_MAXIMUM_CONNECTIONS" -or 
                  $_.type -eq "STATISTIC_CLIENT_SIDE_TOTAL_CONNECTIONS"}; 

foreach ($Statistic in $Statistics) 
{ 
    $val = Convert-To64Bit $Statistic.value.high $Statistic.value.low; 

    switch ($Statistic.type) { 
    "STATISTIC_CLIENT_SIDE_CURRENT_CONNECTIONS" { 
    $label = "Current Connections"; 
    } 
    "STATISTIC_CLIENT_SIDE_MAXIMUM_CONNECTIONS" { 
    $label = "Max Connections"; 
    } 
     "STATISTIC_CLIENT_SIDE_TOTAL_CONNECTIONS" { 
    $label = "Total Connections"; 
    } 
    } 
    $profcmd.Parameters["@property"].Value = $SrceName 
    $profcmd.Parameters["@propertyDesc"].Value = $label 
    $profcmd.Parameters["@ValDim1"].Value = $virtual_server 
    $profcmd.Parameters["@value"].Value = $val 
    $profcmd.Parameters["@Timestamp"].Value = $t 
    [void]$profcmd.ExecuteNonQuery() 
    } 
} 
+1

Qu'est-ce que cela signifie « lent »? Avez-vous mesuré ce que la déclaration prend la plupart du temps? Je pense que le goulot d'étranglement sera source externe (serveur sql), pas PowerShell. – stej

+0

Juste pour info, vous pouvez utiliser l'applet de commande 'Measure-Command' pour l'analyse des performances. Comme le dit Stej, il est hautement improbable que PowerShell soit responsable d'être «lent». –

+0

Merci, ne connaissait pas l'applet de commande Measure-Command. Va l'utiliser et voir si je peux identifier la cause exacte – Andrew

Répondre

0

Nous avons un F5 BigIP et nous avons remarqué que l'interface utilisateur sur l'appareil est vraiment vraiment lent. Nous n'avons pas retracé la cause, mais il est très probable que votre retard se fasse sur l'appareil F5 lui-même. Mesure-commande sur

$VirtualServerStatistics = (Get-F5.iControl).LocalLBVirtualServer.get_statistics((, $virtual_server)); 

Doit le montrer si c'est le cas.

0

il est difficile de tester sans F5 mais vous pouvez peut-être réduire/améliorer le code en remplaçant:

$Statistics = $VirtualServerStatisticEntry.statistics | ? {$_.type -eq "STATISTIC_CLIENT_SIDE_CURRENT_CONNECTIONS" -or 
                  $_.type -eq "STATISTIC_CLIENT_SIDE_MAXIMUM_CONNECTIONS" -or 
                  $_.type -eq "STATISTIC_CLIENT_SIDE_TOTAL_CONNECTIONS"}; 

Avec

$Statistics = $VirtualServerStatisticEntry.statistics | ? {$_.type -match '^STATISTIC_CLIENT_SIDE_(CURRENT|MAXIMUM|TOTAL)_CONNECTIONS?' } 
+0

Je pense que cela pourrait sauver plusieurs milisecondes, mais Andrew aimerait sauver quelques secondes (au moins). – stej