Czy ktoś ma jakieś dane lub podstawowe obliczenia, na które można odpowiedzieć, gdy wymagane jest łączenie ramek (NAPI) i kiedy wystarczy pojedyncze przerwanie na ramkę?
Mój sprzęt: IBM BladeServer HS22, sprzęt Broadcom 5709 Gigabit NIC (MSI-X), z dwoma czterordzeniowymi procesorami Xeon E5530. Głównym celem jest serwer proxy Squid. Switch to niezła seria Cisco 6500.
Naszym podstawowym problemem jest to, że w godzinach szczytu (ruch 100 Mb / s, tylko 10 000 pps) zwiększa się opóźnienie i utrata pakietów. Zrobiłem wiele tuningu i aktualizacji jądra do wersji 2.6.38 i poprawiło to utratę pakietów, ale opóźnienia są nadal słabe. Pingi są sporadyczne; przeskakuje nawet do 200ms w lokalnej sieci Gbps LAN. Średnia odpowiedź Squid wzrasta z 30ms do 500 + ms, mimo że obciążenie procesora / pamięci jest w porządku.
Przerwy wznoszą się do około 15 000 na sekundę w szczycie. Ksoftirqd nie używa dużo procesora; Zainstalowałem nierównowagę, aby zrównoważyć przerwania IRQ (8 dla eth0 i eth1) we wszystkich rdzeniach, ale to niewiele pomogło.
Wydaje się, że Intel NIC nigdy nie ma tego rodzaju problemów, ale faktem jest, że system kasetowy i sprzęt do stałej konfiguracji są w pewnym sensie utknęli z Broadcom.
Wszystko wskazuje na to, że NIC jest głównym winowajcą. Najlepszym pomysłem, jaki mam teraz, jest zmniejszenie przerwania przy jednoczesnym utrzymaniu niskiego opóźnienia i wysokiej przepustowości.
Bnx2 niestety nie obsługuje adaptive-rx ani tx.
Odpowiedź wątku NAPI vs Adaptive Interrupts zapewnia doskonały przegląd moderacji przerwań, ale nie ma konkretnych informacji na temat sposobu obliczania optymalnych ustawień koalescencji ettoolu dla danego obejścia. Czy istnieje lepsze podejście niż tylko próba i błąd?
Czy wyżej wymienione obciążenie i konfiguracja sprzętowa w ogóle wymagają NAPI? A może powinien być w stanie przeżyć pojedyncze przerwanie na pakiet?