Jak działa GRO (ogólne odciążenie odbioru) na bardziej zaawansowanych kartach sieciowych?

14

Interesują mnie konkretne odpowiedzi:

  1. Czy karta sieciowa z GRO edytuje / tworzy TCP ACK lub jakiekolwiek inne pakiety (czy też ta funkcja jest przezroczysta dla stosów TCP odbiorcy / nadawcy)?
  2. Powinien istnieć limit czasu / zdarzenie, w którym karta sieciowa powinna przekazać „segmenty sklejone” do stosu TCP? Czym oni są?
  3. W konfiguracji przekazywania pakietów - czy funkcja GRO próbuje również czytać potwierdzenia ACK odbiorcy (patrz poniżej, dlaczego o to pytam)?
  4. Wszelkie źródła, które wyjaśniają GRO, a także inne funkcje rozładowywania kart sieciowych (TSO, LSO ...) lepsze niż strony podręczników wikipedii i linuxa, byłyby bardzo mile widziane.

Więcej szczegółów:

Rozwiązuję problem wydajności z jedną implementacją IPSec. Problem polega na tym, że dostępna przepustowość nie jest równomiernie rozłożona na wszystkie 4 tunele VPN (rozproszone w przybliżeniu jako 200 MB / 200 MB / 1 MB / 1 MB / s; każdy tunel VPN zawiera pojedyncze połączenie TCP). W PCAP raz na jakiś czas widzę, że ten serwer działa na biegu jałowym przez około 2 sekundy (oczekiwanie na potwierdzenie). Pobieranie jest wznawiane, gdy serwer WWW ponownie przesyła niepotwierdzone segmenty.

Moje wewnętrzne wycięcie z PCAP polega na tym, że NIC GRO zawiera pakiety klejów razem, ale czasami nie przekazuje ich na stos TCP w odpowiednim czasie i to powoduje problemy.

Ponieważ ten serwer VPN nie ma interfejsów, które kończą połączenia TCP, a jedynie przekazuje pakiety. Następnie próbowałem wyłączyć GRO, a potem zauważyłem, że ruch był równomiernie rozłożony we wszystkich tunelach. Również gdy skalowanie okna TCP jest wyłączone na serwerze WWW, przepustowość jest nawet dystrybuowana nawet przy włączonej GRO (dlatego miałem pytanie nr 3).

Używam Linuksa 2.6.32-27 na serwerze Ubuntu 10.04 (64-bit). Karta sieciowa to Intel 82571EB. Wszystkie interfejsy (klient HTTP, klient VPN, serwer VPN, serwer WWW) są połączone bezpośrednio w łańcuch za pomocą kabli Ethernet 1Gbit.

użytkownik389238
źródło

Odpowiedzi:

15

Uważam, że ten artykuł jest niezwykle przydatny: JLS2009: Generic odciążenie . Daje świetny przegląd działania GRO.

  1. Niektóre karty mogą to zrobić, ale powiązane sterowniki również muszą o tym wiedzieć. Również sami kierowcy mogą to zrobić w oprogramowaniu. Ponieważ dzieje się to przed wejściem do stosu TCP / IP jądra, do czasu pełnego wprowadzenia stosu TCP / IP w przestrzeni jądra pakiety są ponownie sekwencjonowane.
  2. Limit czasu jest określony przez specyfikację GRO jako jeden „tik” TCP / IP (przyrost pola znacznika czasu), który jest bardzo małą liczbą, ale w szybkich sieciach wciąż może być odbieranych wiele pakietów.
  3. GRO wejdzie do gry po stronie odbierającej forwardera, a tak naprawdę GRO został stworzony, aby bardziej chciwa metoda LRO przestała psuć pakiety na forwarderach.
  4. Ten artykuł, który zamieściłem powyżej, naprawdę pomaga.

Ethtool może być w stanie włączyć / wyłączyć GRO na określonych interfejsach. Zależy od wersji.

sysadmin1138
źródło
1
Zaktualizowałem swoje pytanie. Wygląda na to, że odpowiedziałeś # 1 w kontekście wszystkich funkcji odciążania (sam IMHO GRO nie generuje ACK-ów, tylko „klei” wszystkie pakiety dla jednego tiku TCP / IP, a następnie obsługuje je w systemie operacyjnym). Dziękuję Ci!
user389238,