使用HostName更好地测试连接性能

时间:2015-07-22 17:18:48

标签: performance powershell ping

使用IP地址运行Test-Connection需要比使用服务器主机名运行相同命令的时间长得多。

然而;如果我添加-quiet参数,那么性能大致相同(IP速度快一点,如您所料)。

使用Measure-Command此异常未显示;可能是输出的一些怪癖没有显示出来。

以下代码更准确地反映了所看到的异常情况:

$begin=(get-date).ticks;test-connection '123.45.67.89'; $a=((get-date).ticks - $begin)
$begin=(get-date).ticks;test-connection 'MyHostName'; $b=((get-date).ticks - $begin)
$a-$b

同事们在他们的机器上重现了同样的问题。

问题:是否有人知道可能导致此问题的原因? 即我怀疑它是一个错误(并且已经报告过它),但这意味着有一些聪明的事情,PowerShell可能会以不同的方式工作,具体取决于是否要显示输出/导致量子像效果;所以它不仅仅是按顺序运行命令,而是在封面下进行一些(de)优化。

我的环境

操作系统:MS Windows 7 Pro SP1

$PSVersionInfo

Name                           Value                                  
----                           -----                                                                                                                                                  
PSVersion                      4.0                                     
WSManStackVersion              3.0                                     
SerializationVersion           1.1.0.1                                 
CLRVersion                     4.0.30319.18444                         
BuildVersion                   6.3.9600.16406                          
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                    
PSRemotingProtocolVersion      2.2

MS Connect Bug

https://connect.microsoft.com/PowerShell/feedbackdetail/view/1578010/test-connection-performance-with-ip-and-output

1 个答案:

答案 0 :(得分:1)

我在运行带有和不带Test-Connection开关参数的Quiet时执行了Wireshark跟踪,为Computername参数提供了IPv4地址。

当省略Quiet开关时,PowerShell似乎不会向目标机器发送1个,而是6个NetBIOS名称查询,之后它将返回格式化的输出。

如果我分配 Test-Connection的输出,它会立即返回,但只要我将其传递给Format-Table,它就会挂起并再次发送NBSTAT查询< / p>

根本原因实际上不是Test-Connection cmdlet本身,而是格式化输出。其中一个属性(IPV4Address)是ScriptProperty,其定义如下:

PS C:\> $ping = Test-Connection -ComputerName 10.0.0.101 -Count 1
PS C:\> Get-Member -InputObject $ping -Name IPV4Address | Select-Object -ExpandProperty Definition
System.Object IPV4Address {get=$iphost = [System.Net.Dns]::GetHostEntry($this.address)
                    $iphost.AddressList | ?{ $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork } | select -first 1;}

因此,当显示输出时,调用[System.Net.Dns]::GetHostEntry(10.0.0.101)来计算IPV4Address - 这就是导致等待时间的原因

如果您不关心IP地址的模拟解决方案,请使用Select-Object来阻止IPV4Address的计算和输出:

Test-Connection -ComputerName 10.0.0.101 -Count 1 | Select Address,StatusCode