Performance Testing Through The Network Layers

Problem this snippet solves:

This script will perform timing tests at various layers in the network stack in an attempt to isolate performance issues.

Code :

param(
$domain = $null,
$url = $null,
$count = 5,
[string[]]$groups
);

$UA = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0";

$VIP_IPS = (
  ("Outside-Vip", "XXX.XXX.XXX.XXX", 443),
  ("Inside-Vip", "YYY.YYY.YYY.YYY", 443)
)

$APP_IPS = (
  ("app-01", "10.10.10.1", 80),
  ("app-02", "10.10.10.2", 80)
)

function Show-Usage()
{
Write-Host ".\Time-EntryPoints.ps1 -url  -count <5> -groups [vips|apps|all]";
}

function Get-IPFromHostname()
{
  param($hostname);
  ([System.Net.Dns]::GetHostAddresses($hostname))[0].ToString()
}

function Get-Stats()
{
  param($stats, $hostname, $ip, $port, $secs, $url);
  
  $o = 1 | Select Host, IP, Port, Url, Count, Min, Max, Avg, Sum, Secs;
  $o.Host = $hostname.Split(".")[0];
  $o.IP = $ip;
  $o.Port = $port;
  $o.Url = $url;
  $o.Count = $stats.Count;
  $o.Min = $stats.Minimum;
  $o.Max = $stats.Maximum;
  $o.Avg = $stats.Average;
  $o.Sum = $stats.Sum;
  $o.Secs = $secs;
  $o;
}

function Get-HostsToTest()
{
  param([string[]]$groups);
  
  $HOSTS = @();
  
  foreach($group in $groups )
  {
    switch ($group.ToLower())
    {
      "vips"    { $HOSTS += $VIP_IPS; }
      "apps"    { $HOSTS += $APP_IPS; }
      "all"     { $HOSTS += ($VIP_IPS + $APP_IPS); }
      default   { $HOSTS += ( ($group, "", 80), ("", "", 80) ); }
    }
  }
  
  $HOSTS;
}

if ( ($null -ne $domain) -and ($null -ne $url) )
{
  $secs = @();
  
  [System.Object[]]$hostEntries = Get-HostsToTest $groups;

  foreach($hostEntry in $hostEntries)
  {
    $hostname = $hostEntry[0];
    if ( $hostname.Length -gt 0 )
    {
      $ip = $hostEntry[1];
      if ( "" -eq $ip ) { $ip = Get-IPFromHostname $hostname; }
      $port = $hostEntry[2];
    
      $fullUrl = "http";
      if ( $port -eq 443 ) { $fullUrl += "s"; }
      $fullUrl += "://$domain";
      $fullUrl += $url;
    
      foreach($i in 1..$count)
      {
        $sec = (Measure-Command {curl --insecure -sNA $UA --resolve "${domain}:${port}:${ip}" $fullUrl | Out-Null}).TotalSeconds;
        $secs += (, $sec);
        
        Start-Sleep -Milliseconds 10;
      }
      $len = $secs.Length;

      $stats = Get-Stats ($secs | Measure-Object -Average -Minimum -Maximum -Sum) $hostname $ip $port $secs $url;
      $stats;
    }
    $secs = @();
  }
}
else
{
Show-Usage;
}
Published Mar 12, 2015
Version 1.0
No CommentsBe the first to comment