# -- User Defined Constants --------------------------- $LOG_PATH = "C:\Scripts\HDS-SNM2\pfmlog" $FRONT_END_PORTS = 16 # Modify port and controller options as needed $Controllers = @(0,1) $Ports = @("A","C","E","G") # -- Modifications below this line should not be required --------------------------------------- # -- Setup environment ------------------------------ $testsnapin = $null $testsnapin = get-pssnapin | where { $_.Name -eq "PowerGadgets"} if(-not $testsnapin){add-pssnapin -Name PowerGadgets} . ./start-session.ps1 Set-Location $env:STONAVM_HOME # -- Objects to hold port data ------------------------ $allportiopdata = @() $allportcmddata = @() $allporterrdata = @() # -- Processing flags ------------------------------------- $IOPDataRead = $FALSE $CMDDataRead = $FALSE $ERRDataRead = $FALSE # -- Specify whether to run new collection if not existing files are used -- Write-Host ”Collect Data Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ $collectiontime = Read-Host "Collection Time/Count in minutes" Write-Host "Collecting Data..." ./auperform.exe -unit $DEFAULTARRAY -auto 1 -count $collectiontime -path $LOG_PATH -pfmstatis } # Get data from files Write-Host "Analyzing Data..." $perffiles = Get-ChildItem $LOG_PATH foreach($perffile in $perffiles){ $filedata = Get-Content $LOG_PATH\$perffile foreach($line in $filedata){ # Get collection times if($line -match '^(\d{4}\/(?:0[1-9]|1[0-2]?)\/(?:0[1-9]|[12][0-9]|3[01]?)\s(?:0[0-9]|1[0-9]|2[0-3]?)\:(?:0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]?)\:(?:0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]?))\s-\s(\d{4}\/(?:0[1-9]|1[0-2]?)\/(?:0[1-9]|[12][0-9]|3[01]?)\s(?:0[0-9]|1[0-9]|2[0-3]?)\:(?:0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]?)\:(?:0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]?))$'){ $collectfrom = $matches[1] $collectto = $matches[2] } # Get Port IOP Data if($line -match 'CTL\s+Port\s+IO\sRate'){ $IOPDataRead = $TRUE $IOPLineCount = 0 }elseif($IOPDataRead -and ($IOPLineCount -lt $FRONT_END_PORTS)){ $line -match '([0,1]{1})\s+([A-H]{1})\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)' | Out-Null $portiopdata = "" | Select ctl,port,iops,readiops,writeiops,readhit,writehit,tranrate,readrate,writerate,datetime $portiopdata.ctl = $matches[1] $portiopdata.port = $matches[2] $portiopdata.iops = $matches[3] $portiopdata.readiops = $matches[4] $portiopdata.writeiops = $matches[5] $portiopdata.readhit = $matches[6] $portiopdata.writehit = $matches[7] $portiopdata.tranrate = $matches[8] $portiopdata.readrate = $matches[9] $portiopdata.writerate = $matches[10] $portiopdata.datetime = $collectto $allportiopdata += $portiopdata $IOPLineCount += 1 if($IOPLineCount -eq $FRONT_END_PORTS){$IOPDataRead = $FALSE} } # Get Port CMD Data if ($line -match 'CTL\s+Port\s+Read\sCMD\sCount'){ $CMDDataRead = $TRUE $CMDLineCount = 0 }elseif($CMDDataRead -and ($CMDLineCount -lt $FRONT_END_PORTS)){ $line -match '([0,1]{1})\s+([A-H]{1})\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)' | Out-Null $portcmddata = "" | Select ctl,port,readcmdcount,writecmdcount,readcmdhitcount,writecmdhitcount,readsize,writesize,datetime $portcmddata.ctl = $matches[1] $portcmddata.port = $matches[2] $portcmddata.readcmdcount = $matches[3] $portcmddata.writecmdcount = $matches[4] $portcmddata.readcmdhitcount = $matches[5] $portcmddata.writecmdhitcount = $matches[6] $portcmddata.readsize = $matches[7] $portcmddata.writesize = $matches[8] $portcmddata.datetime = $collectto $allportcmddata += $portcmddata $CMDLineCount += 1 if($CMDLineCount -eq $FRONT_END_PORTS){$CMDDataRead = $FALSE} } # Get Port ERR Data if ($line -match 'CTL\s+Port\s+Timeout\sError\sCount'){ $ERRDataRead = $TRUE $ERRLineCount = 0 }elseif($ERRDataRead -and ($ERRLineCount -lt $FRONT_END_PORTS)){ $line -match '([0,1]{1})\s+([A-H]{1})\s+(\d+)' | Out-Null $porterrdata = "" | Select ctl,port,timeouterrcount,datetime $porterrdata.ctl = $matches[1] $porterrdata.port = $matches[2] $porterrdata.timeouterrcount = $matches[3] $porterrdata.datetime = $collectto $allporterrdata += $porterrdata $ERRLineCount += 1 if($ERRLineCount -eq $FRONT_END_PORTS){$ERRDataRead = $FALSE} } } } # -- List Data --------------------------------- Write-Host ”List Port Data Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ $allportiopdata | ft -prop * $allportcmddata | ft -prop * $allporterrdata | ft -prop * } # -- Create Port IOPS Chart Group ---------------------- Write-Host ”Show Port IOPS Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "IOPS for Controller:$Controller Port:$Port" $allportiopdata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select iops,readiops,writeiops,readhit,writehit,tranrate,readrate,writerate,datetime | ` Out-Chart -Values iops,readiops,writeiops -Series_0_Text "Port IOPS" -Series_1_Text "Port Read IOPS" -Series_2_Text "Port Write IOPS" -Label datetime -Title $ChartTitle -Gallery Lines -Group "PORTIOPS" -Name $ChartTitle -Caption "Port IOPS" } } } # -- Create Port Cache Hit Chart Group --------------- Write-Host ”Show Port Cache Hit Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "Cache Hits for Controller:$Controller Port:$Port" $allportiopdata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select iops,readiops,writeiops,readhit,writehit,tranrate,readrate,writerate,datetime | ` Out-Chart -Values readhit,writehit -Series_0_Text "Read Hit %" -Series_1_Text "Write Hit %" -Label datetime -Title $ChartTitle -Gallery Lines -Group "PORTCACHE" -Name $ChartTitle -Caption "Port Cache Hits" } } } # -- Create Port Transaction Rate Chart Group --------------- Write-Host ”Show Port Transaction Rate Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "Transaction Rate for Controller:$Controller Port:$Port" $allportiopdata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select iops,readiops,writeiops,readhit,writehit,tranrate,readrate,writerate,datetime | ` Out-Chart -Values tranrate,readrate,writerate -Series_0_Text "Port Transaction Rate (MB/S)" -Series_1_Text "Port Transaction Read Rate (MB/S)" -Series_2_Text "Port Transaction Write Rate (MB/S)" -Label datetime -Title $ChartTitle -Gallery Lines -Group "TRANSACTIONRATE" -Name $ChartTitle -Caption "Port Transaction Rate" } } } # -- Create Port Transaction size Chart Group --------------- Write-Host ”Show Port Transaction Size Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "Transaction Size for Controller:$Controller Port:$Port" $allportcmddata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select readcmdcount,writecmdcount,readcmdhitcount,writecmdhitcount,readsize,writesize,datetime | ` Out-Chart -Values readsize,writesize -Series_0_Text "Read Trans. Size (MB)" -Series_1_Text "Write Trans. Size (MB)" -Label datetime -Title $ChartTitle -Gallery Lines -Group "TRANSACTIONSIZE" -Name $ChartTitle -Caption "Port Transaction Size" } } } # -- Create Port Command Chart Group --------------- Write-Host ”Show Port Command Count Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "Command Counts for Controller:$Controller Port:$Port" $allportcmddata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select readcmdcount,writecmdcount,readcmdhitcount,writecmdhitcount,readsize,writesize,datetime | ` Out-Chart -Values readcmdcount,writecmdcount,readcmdhitcount,writecmdhitcount -Series_0_Text "Read Command Count" -Series_1_Text "Write Command Count" -Series_2_Text "Read Command Hit Count" -Series_3_Text "Write Command Hit Count" -Label datetime -Title $ChartTitle -Gallery Lines -Group "PORTCMDCOUNTS" -Name $ChartTitle -Caption "Port Command Counts" } } } # -- Create Port Error Chart Group --------------- Write-Host ”Show Port Timeout Error Charts Y or N...” $modekey = $Host.UI.RawUI.ReadKey(”NoEcho,IncludeKeyDown”) if($modekey.Character.ToString().ToLower() -eq "y"){ Write-Host "Generating Charts..." foreach($Controller in $Controllers){ foreach($Port in $Ports){ $ChartTitle = "Timeout Errors for Controller:$Controller Port:$Port" $allporterrdata | where {($_.port -eq $Port) -and ($_.ctl -eq $Controller)} | sort datetime | Select timeouterrcount,datetime | ` Out-Chart -Values timeouterrcount -Series_0_Text "Timeout Errors" -Label datetime -Title $ChartTitle -Gallery Lines -Group "PORTERROR" -Name $ChartTitle -Caption "Port Timeout Errors" } } } Set-Location $SCRIPTHOME