Networking

Windows 性能監控 - “已丟棄的數據包”永不改變

  • December 4, 2018

我編寫了以下簡短的 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-丟棄?forum=winservergen)。

請幫忙。謝謝。

我也一直在這裡尋找澄清,這就是我發現的。

  1. 此計數器沒有輪詢週期。它隨著丟棄的發生而增加。
  2. 它會在重新啟動時重置。我沒有找到說明這一點的文件,但在實踐中沒有看到任何例外。
  3. 它不會在任何時間間隔內重置。
  4. 計數器達到 DWORD32 位無符號整數)的最大值時,它應該迴繞,但一些 .NET 文件指出,如果該值大於 32 位 int 的最大值,則該值將被截斷。因此,此行為因您訪問計數器的方式而異。

計數器停留在 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 呼叫返回以獲取介面統計資訊。

引用自:https://serverfault.com/questions/937376