【问题标题】:Test-Connection Performance Better with HostName使用主机名更好地测试连接性能
【发布时间】:2015-10-12 17:26:51
【问题描述】:

使用 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可能会根据是否显示输出而以不同的方式工作/导致类似量子的效果;所以它不仅仅是按顺序运行命令,而是在幕后进行一些(去)优化。

我的环境

操作系统: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 错误

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

【问题讨论】:

  • 忠告:不要像这样使用 Get-Date 进行取证测量。使用[System.Diagnostics.Stopwatch]::StartNew()。我能够复制顺便说一句
  • 这是猜测(尚未进行网络跟踪),但可能是 PowerShell 尝试对 IP 进行反向查找以解析为 Destination 字段中的主机名输出
  • @MathiasR.Jessen;好叫声;我想知道在 ping 发生之前是否就是这种情况,但无法弄清楚为什么/如何隐藏输出会影响它......如果它只在输出结果时这样做,尽管这对所看到的更有意义。奇怪的是他们在每次迭代时都进行查找而不是缓存它,但大概是有原因的(也许是在 ping 之间 DNS 发生变化的情况下)?
  • 找到罪魁祸首,稍后会上传截图和进一步解释

标签: performance powershell ping


【解决方案1】:

我刚刚在运行 Test-Connection 时使用和不使用 Quiet 开关参数进行了 Wireshark 跟踪,为 Computername 参数提供 IPv4 地址。

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

如果我分配来自Test-Connection 的输出,它会立即返回,但一旦我将它传送到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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2023-04-02
    • 2013-06-07
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多