Windows 性能监控 - “接收丢弃的数据包”从未改变

Windows 性能监控 - “接收丢弃的数据包”从未改变

我编写了以下简短的 PowerShell 脚本来帮助诊断服务器上的一些性能问题:

$counters = @("\Process(*)\% Processor Time","\Process(*)\Working Set","\Process(*)\IO Read Bytes/sec","\Process(*)\IO Write Bytes/sec","\Process(*)\IO Data Bytes/sec","\Network Interface(*)\Bytes Total/sec","\Network Interface(*)\Packets/sec","\Network Interface(*)\Packets Received Discarded","\Network Interface(*)\Packets Received Errors","\Network Interface(*)\Packets Outbound Discarded","\Network Interface(*)\Packets Outbound Errors")

$timeout = new-timespan -Seconds 10
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout)
{
    get-counter -counter $counters  | select -expand countersamples | select timestamp,path,instancename,cookedvalue | export-csv -append -notypeinformation "c:\misc\counters.txt"
    start-sleep -seconds 2
}
write-host "Finished"

该脚本运行良好,并给出了我需要的值。但是,当查看“已接收丢弃的数据包”计数器时,它始终没有从值“801”改变。

这个计数器的轮询周期是多少?它会在重启时重置吗?我找不到任何文档显示它何时重置为 0。

来自 Microsoft 的链接(https://msdn.microsoft.com/en-us/library/ms803962.aspx) 状态:

显示选择丢弃的传入数据包数量(即使未检测到任何错误,这些数据包仍无法传送到更高层协议)。丢弃此类数据包的一个可能原因可能是释放缓冲区空间。

...仍然没有说明时间表。

2015 年,有人在 TechNet 上问过这个问题,但没有得到答案(https://social.technet.microsoft.com/Forums/ie/en-US/f2093760-5462-45b5-a3e1-128d0b119509/packets-received-discarded?forum=winservergen)。

请帮忙。谢谢。

答案1

我也一直在这里寻找澄清,这就是我所发现的。

  1. 此计数器没有轮询周期。当发生丢弃时,它会递增。
  2. 它会在重启时重置。我没有找到任何文档说明这一点,但在实践中没有看到例外。
  3. 它不会在任何时间间隔内重置。
  4. 当。。。的时候计数器达到 DWORD 的最大值32 位无符号整数)它应该环绕,但一些 .NET 文档指出,如果该值大于 32 位整数的最大值,它将被截断。因此,此行为取决于您如何访问计数器。

计数器停留在 801 的唯一原因是没有更多丢弃。除非出现问题,否则丢弃应该非常罕见。丢弃通常发生在网络活动非常频繁的时期。它们更多地表明存在缓冲区问题,而不是其他问题。


资料来源:

这是 .NET 的所有文档。来自同一MSDN 链接您发布后,您会看到这个计数器的类型为PERF_COUNTER_RAWCOUNT

搜索更多信息PERF_COUNTER_RAWCOUNT我发现GitHub 上的此评论这表明这些类型没有时间参考。

            //
            //  These counters do not use any time reference
            //
            case NativeMethods.PERF_COUNTER_RAWCOUNT:
            case NativeMethods.PERF_COUNTER_RAWCOUNT_HEX:
            case NativeMethods.PERF_COUNTER_DELTA:
            case NativeMethods.PERF_COUNTER_LARGE_RAWCOUNT:
            case NativeMethods.PERF_COUNTER_LARGE_RAWCOUNT_HEX:
            case NativeMethods.PERF_COUNTER_LARGE_DELTA:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = 0;

页面上还指出此计数器类型没有时间参考:

    // Indicates the data is a counter  which should not be
    // time averaged on display (such as an error counter on a serial line)
    // Display as is.  No Display Suffix.
    public const int PERF_COUNTER_RAWCOUNT =
            (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |
            PERF_DISPLAY_NO_SUFFIX);

该评论指出任何大于的值都将被截断:

    ///     Directly accesses the raw value of this counter.  If counter type is of a 32-bit size, it will truncate
    ///     the value given to 32 bits.  This can be significantly more performant for scenarios where
    ///     the raw value is sufficient.   Note that this only works for custom counters created using
    ///     this component,  non-custom counters will throw an exception if this property is accessed.

这是 MibIpStats 的结构定义这是由 Win32 调用返回以获取接口统计信息。

相关内容