VMXNET3 接收緩衝區大小和記憶體使用情況
背景
我們遇到了一個 Windows 故障轉移群集中斷的事件。事後分析表明該節點已按照本文所述“刪除”。
我們最近才將該集群完全遷移到我們的 VMware 環境中,看來上述事件可能是導致中斷的原因。
與此相關的 VMware 知識庫文章討論了增加
Small Rx Buffers
和Rx Ring #1
設置,但警告說,增加太多可能會大大增加主機上的記憶體成本。在對我們約 150 個 Windows 虛擬機的性能計數器進行審計後
Network Interface\Packets Received Discarded
,16 個來賓的 22 個 vNIC 有一些丟棄的數據包。數量足夠少,我不擔心會因額外的記憶體使用而對主機徵稅,但我想了解這些設置如何使用記憶體以及記憶體來自何處。
問題
緩衝區數量和環大小之間有什麼關係?
如何計算這些設置的給定值所使用的記憶體量?
因為這些設置在來賓作業系統中的 NIC 本身上,所以我假設它們是驅動程序設置。這讓我認為所使用的 RAM 可能是分頁池或非分頁池。
它是否正確?
如果是這樣,我應該擔心嗎?
有沒有我在這裡沒有考慮到的問題?
我們正在嘗試確定在受影響的虛擬機上將這些設置為最大值是否存在缺陷,而不是 VMware 主機記憶體使用量。例如,如果我們增加客戶機中池記憶體耗盡的風險,我們更傾向於從小處著手。
這些問題中的一些(也許全部)可能不是特定於 VMware 或虛擬化的。
緩衝區數量和環大小之間有什麼關係?
它們是相關的,但又是獨立的。rx“環”是指記憶體中的一組緩衝區,用作隊列將傳入的網路數據包從主機(管理程序)傳遞到來賓(Windows VM)。記憶體被網路驅動程序保留在來賓中,並被映射到主機記憶體中。
當新的網路數據包進入主機時,它們會被放入環中的下一個可用緩衝區。然後,主機在客戶機中觸發一個 IRQ,客戶機驅動程序通過將數據包從環中取出來響應該 IRQ,並將其分派到客戶機作業系統的網路堆棧,據推測,客戶機作業系統將其發送到客戶機應用程序以接收它。假設數據包進來的速度足夠慢,並且客戶驅動程序處理它們的速度足夠快,那麼環中應該總是有一個空閒槽。但是,如果數據包進來太快,或者客戶處理它們的速度太慢,環可能會變滿,數據包可能會被丟棄(正如您在您的情況中看到的那樣)。
增加戒指尺寸可以幫助緩解這個問題。如果增加它,環中一次將有更多可用插槽。這涉及到第二個設置“Small Rx Buffers”,這是可用於填充環中插槽的可用緩衝區總量。至少需要與環中的插槽一樣多的緩衝區。通常你想要更多。當來賓從環中取出緩衝區以提供給來賓網路堆棧時,它可能並不總是立即返回給驅動程序。如果發生這種情況,有備用緩衝區來填充環意味著您可以走更長時間而不會失去數據包。
Rx Ring #1 / Small Rx 緩衝區用於非巨型幀。如果您有一個預設的 NIC 配置,那將是唯一使用的環。
如何計算這些設置的給定值所使用的記憶體量?
假設您正在談論非巨型幀,每個緩衝區需要足夠大以儲存整個網路數據包,大約 1.5kb。因此,如果您有 8192 個可用緩衝區,則將使用 12MB。更大的環也會使用更多的記憶體,但描述符很小(字節),所以它確實是你需要擔心的緩衝區。
因為這些設置在來賓作業系統中的 NIC 本身上,所以我假設它們是驅動程序設置。這讓我認為所使用的 RAM 可能是分頁池或非分頁池。
是的,它是一個非分頁池。如果對環形緩衝區進行了分頁,則可能會在緩衝區被分頁時導致丟包。
有沒有我在這裡沒有考慮到的問題?
我不確定這是否與您的情況有關,但可能值得注意的是,較大的環會增加網路 rx 路徑的記憶體佔用空間。在微基準測試中,您會看到較大的環通常會損害性能。也就是說,在現實生活中的應用程序中,如果一個數據包被丟棄,這通常比速度爆發中的小幅性能提升更重要。
資料來源:我曾在 VMware 工作。