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-丟棄?forum=winservergen)。
請幫忙。謝謝。
我也一直在這裡尋找澄清,這就是我發現的。
- 此計數器沒有輪詢週期。它隨著丟棄的發生而增加。
- 它會在重新啟動時重置。我沒有找到說明這一點的文件,但在實踐中沒有看到任何例外。
- 它不會在任何時間間隔內重置。
- 當計數器達到 DWORD(32 位無符號整數)的最大值時,它應該迴繞,但一些 .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 呼叫返回以獲取介面統計資訊。