我编写了以下简短的 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
我也一直在这里寻找澄清,这就是我所发现的。
- 此计数器没有轮询周期。当发生丢弃时,它会递增。
- 它会在重启时重置。我没有找到任何文档说明这一点,但在实践中没有看到例外。
- 它不会在任何时间间隔内重置。
- 当。。。的时候计数器达到 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 调用返回以获取接口统计信息。