SharePoint 2013 Environment Latency and Network Test Script
The intra-farm latency requirement of SharePoint is one of the hardware requirement, described at https://technet.microsoft.com/en-us/library/cc262485.aspx
It can be difficult to test and is often left un-verified because short of having a server sit there and ping the rest of the farm for 10 minutes, there is no way to ensure that the environment is compliant. To solve this, I have written a script that leaves one of the servers sitting around pinging the rest of the farm for 10 minutes and reports back on whether the environment complies.
The Script performs the following tests:
- Check connectivity in the farm and make sure all servers are reachable. (this saves you from wasting 10 minutes waiting for the script to run only to find out the hosts weren't reachable)
- Open an ODBC connection to the database server. (This is always handy)
- Verify the environment meets the SharePoint hardware requirement that 99.9% of pings between servers in the farm take less than 1ms over a 10 minute period. For convenience, how long this runs can be changed by setting the $RunTime variable to a lower value.
To run the script, either copy and paste the code into PowerShell_ISE and run it, or save it as a .ps1 file, right click it and select "Run with PowerShell". The second method requires the powershell execution policy to be "unrestricted" (to set, run Set-ExecutionPolicy Unrestricted).
#####Set Local Variables
#Set Host Names, or IP Addresses
$hostnames = "10.0.0.1", "SomeHost"
#SQL Server Name\Instance
$SQLname = "SQL\Instance"
#Configure Run Time in Minutes (helpful for debugging)
$RunTime = 10
#Configure an allowance for late pings (in ms, one way)
$allowance = 0
#####
### test connectivity ###
Write-Host "Test Connectivity:"
Write-Host "Testing Ping"
$ping = New-Object System.Net.NetworkInformation.ping
foreach($a in $hostnames){
$status = $ping.send($a).Status
if($status -ne "Success"){
throw "Ping Failed to $($a)"
}
}
Write-Host " - Succeeded `n"
### test SQL connectivity ###
Write-Host "Testing SQL Connection"
$SQLConnection = New-Object System.Data.Odbc.OdbcConnection
$SQLConnection.connectionstring = "Driver={SQL Server};Server=$SQLname"
$SQLConnection.open()
if($SQLConnection.state -ne "Open"){
throw "SQL Connection Failed"
}
Write-Host " - Succeeded `n"
### Intra-server latency consistency test ###
Write-Host "Start network consistency test"
$ScriptBlock = {
# accept the loop variable across the job-context barrier
param($InHost, $RunTime)
$start = [DateTime]::Now
$ping = New-Object System.Net.NetworkInformation.ping
$PingResults = @()
while([datetime]::now -le $start.AddMinutes($RunTime)){
$outping = $ping.send($InHost)
if($outping.Status -ne "Success"){
$PingResults = $PingResults + 100
} else{
$PingResults = $PingResults + $outping.RoundtripTime
}
Start-Sleep .1
}
return $PingResults
}
#run ping jobs in parallel
foreach($i in $hostnames){
Start-Job $ScriptBlock -ArgumentList $i, $RunTime -Name "$i.latency_test"
}
Write-Host "
processing...`n"
#wait and clean up
While (Get-Job -State "Running") { Start-Sleep 5 }
$output = @{}
foreach($i in $hostnames){
$output[$i] = Receive-Job -Name "$i.latency_test"
}
Remove-Job *
#test results
$LatencyTestFailed = 0
foreach($i in $hostnames){
$BadPings = $output[$i] | ?{$_/2 -ge 1 + $allowance}
$PercentBadPings = $BadPings.length / $output[$i].Length * 100
if($PercentBadPings -ge .1){
"$i DOES NOT meet the latency requirements with $PercentBadPings % of pings >$(1+$allowance)ms" | Write-Host
$LatencyTestFailed = 1
} else{
"$i meets the latency requirements with $PercentBadPings % of pings >$(1+$allowance)ms" | Write-Host
}
}
if($LatencyTestFailed -eq 1){
throw "Farm Latency Test Failed"
}
Comments
Anonymous
December 12, 2013
Hi, Assume this script can be run for SP2010 farms as well? /AAnonymous
January 07, 2014
Should be compatible, it does not make use of any SharePoint features.Anonymous
March 07, 2014
Hello,
This is nice unless the icmp is disabled and you can't use the ping. This happen very often in real world scenario.Anonymous
May 20, 2014
EricA has issued an improved version of this script which can be found here:
http://blogs.msdn.com/b/erica/archive/2013/11/11/sharepoint-2013-network-latency-test-script.aspxAnonymous
June 23, 2014
Hi Isabelle,
ICMP is a requirement for the distributed cache and should be enabled in all production deployments. For more information please see Steve Peschka's blog:
http://blogs.technet.com/b/speschka/archive/2013/01/11/configuring-multiple-distributed-cache-servers-in-sharepoint-2013.aspx
-AlexAnonymous
June 24, 2014
Hi Alex - Thanks for the script. It is very helpful! I'm kind of stuck right now and wanted to see if anyone had any thoughts how I should move forward.
I set the SPServerNames to the 8 servers in our farm. When I run the script, 1-10% of the pings are greater than 1ms. This is obviously not good.
So I tried a couple variations of the script:
- If I change SPServerNames array to only include 1 server, 0-1% of the pings are greater than 1ms. Better but still not good enough all the time.
- If I change the sleep time between pings to 1 second in the $ScriptBlock, 0-1% are greater than 1ms. I leave all 8 servers in. Again, Better but still not good enough all the time.
- If I both change the sleep time and reduce the number of servers in the array, I can get 0% greater than 1ms.
The MSDN technet article doesn't define criteria around number of simultaneous tests or the polling interval between pings. Any guidance or experiences or suggestions or thoughts? Thanks!Anonymous
June 24, 2014
Good oneAnonymous
June 24, 2014
Need to try this.Anonymous
June 26, 2014
Eric,
That is an interesting finding, I will investigate. As long as your servers individually meet the requirements, even with the longer ping interval you should be alright.Anonymous
May 21, 2015
The comment has been removed