使用 HostName 更好地测试连接性能
Test-Connection Performance Better with HostName
使用 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 可能会根据是否显示输出/导致类似量子的效果而以不同的方式工作,这很聪明;所以它不仅仅是 运行 按顺序给出的命令,而是在幕后进行一些(去)优化。
我的环境
OS: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 连接错误
我只是在 运行 Test-Connection
使用和不使用 Quiet
开关参数时进行了一次 Wireshark 跟踪,为 Computername
参数提供了一个 IPv4 地址。
当省略 Quiet
开关时,PowerShell 似乎发送的不是 1 个,而是 6 个 NetBIOS 名称查询到目标机器,然后 returns 格式化输出。
如果我 分配 来自 Test-Connection
的输出,它会立即 returns,但是一旦我将其通过管道传输到 Format-Table
,它挂起并再次发送 NBSTAT 查询
根本原因实际上不是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
运行 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 可能会根据是否显示输出/导致类似量子的效果而以不同的方式工作,这很聪明;所以它不仅仅是 运行 按顺序给出的命令,而是在幕后进行一些(去)优化。
我的环境
OS: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 连接错误
我只是在 运行 Test-Connection
使用和不使用 Quiet
开关参数时进行了一次 Wireshark 跟踪,为 Computername
参数提供了一个 IPv4 地址。
当省略 Quiet
开关时,PowerShell 似乎发送的不是 1 个,而是 6 个 NetBIOS 名称查询到目标机器,然后 returns 格式化输出。
如果我 分配 来自 Test-Connection
的输出,它会立即 returns,但是一旦我将其通过管道传输到 Format-Table
,它挂起并再次发送 NBSTAT 查询
根本原因实际上不是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