Nic

GRO(通用接收解除安裝)如何在更高級的 NIC 上工作?

  • April 8, 2014

我對特定答案感興趣:

  1. 具有 GRO 的 NIC 是否編輯/創建 TCP ACK 或任何其他數據包(或者此功能對接收方/發送方 TCP 堆棧是否透明)?
  2. 當 NIC 應該將“粘合段”傳遞給 TCP 堆棧時應該有一個超時/事件?這些是什麼?
  3. 在數據包轉發設置中 - GRO 功能是否也嘗試讀取接收器 ACK(請參閱下面我問這個的原因)?
  4. 任何能比維基百科和 linux 手冊頁更好地解釋 GRO 和其他 NIC 解除安裝功能(TSO、LSO …)的資源將不勝感激。

更多細節:

我正在對一個 IPSec 實現的性能問題進行故障排除。問題是可用頻寬沒有均勻分佈在所有 4 個 VPN 隧道中(分佈大約為 200MBps/200MBps/1MBps/1MBps;每個 VPN 隧道封裝單個 TCP 連接)。在 PCAP 中,我偶爾會看到網路伺服器空閒了大約 2 秒(等待 ACK)。當網路伺服器重新傳輸未確認的段時,下載恢復。

我對 PCAP 的內在感覺是 NIC GRO 功能將數據包粘合在一起,但有時沒有及時將它們傳遞給 TCP 堆棧,這就是問題所在。

因為這個 VPN 伺服器沒有終止 TCP 連接的介面,而只是轉發數據包。然後我嘗試禁用 GRO,然後我觀察到流量均勻分佈在所有隧道中。此外,當在 Web 伺服器上禁用 TCP 視窗縮放時,即使啟用了 GRO,頻寬也會分配(這就是我有問題 #3 的原因)。

我在 Ubuntu 10.04 伺服器(64 位)上使用 2.6.32-27 linux。網卡是英特爾 82571EB。所有介面(HTTP 客戶端、VPN 客戶端、VPN 伺服器、Web 伺服器)都通過 1Gbit 乙太網電纜直接連接。

我發現這篇文章非常有用:JLS2009:通用接收解除安裝。它很好地概述了 GRO 的工作原理。

  1. 一些適配器可能會這樣做,但相關的驅動程序也必須意識到這一點。此外,驅動程序本身可以在軟體中執行此操作。由於這發生在進入核心 TCP/IP 堆棧之前,當核心空間 TCP/IP 堆棧完全進入時,數據包已經重新排序。
  2. GRO 規範將超時定義為一個 TCP/IP ’tick’(時間戳欄位的增量),這是一個非常小的數字,但在快速網路上仍可能接收到多個數據包。
  3. GRO 將在轉發器的接收端發揮作用,事實上,創建 GRO 是為了讓更貪婪的 LRO 方法停止在轉發器上搞砸數據包。
  4. 我在上面連結的那篇文章真的很有幫助。

Ethtool可能能夠在特定介面上啟用/禁用 GRO。取決於版本。

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