W moim laboratorium jest serwer do pomiarów na Ubuntu. I jest program C, który odbiera dane przez połączenie TCP i powinien jak najszybciej wysłać odpowiedź.
Konfiguracja
- Procesory: 2 procesory x 4 rdzenie - procesor Intel (R) Xeon (E) E5345 @ 2,33 GHz
- RAM: 12 GB
- Karta sieciowa: Intel Corporation 80003ES2LAN Gigabit Ethernet Controller / 82546EB Gigabit Ethernet Controller
- Przełącznik sieciowy: Cisco Catalyst 2960
- Informacje o danych: bloki danych pochodzą ok. co 10 milisekund. Rozmiar bloku danych to ok. 1000 bajtów.
Opóźnienie sieci podczas odbierania pakietów jest bardzo krytyczne (ważne są dziesiątki mikrosekund). Zoptymalizowałem program do maksimum, ale nie mam doświadczenia w ulepszaniu Ubuntu.
Co można skonfigurować w Ubuntu, aby zmniejszyć lokalne opóźnienie przetwarzania / wysyłania pakietów?
linux
ubuntu
networking
performance-tuning
latency
Alex V.
źródło
źródło
Odpowiedzi:
Szczerze mówiąc, nie używałbym do tego Ubuntu ... ale istnieją opcje, które można zastosować do dowolnego wariantu Linuksa.
Będziesz chciał zwiększyć bufory stosu sieciowego:
Jeśli aplikacja zapisuje na dysk, być może konieczna będzie zmiana harmonogramu / windy (np.
deadline
Winda).Na poziomie serwera możesz modyfikować regulator procesora oraz zarządzanie mocą i częstotliwością procesora (stany P, stany C).
Na poziomie systemu operacyjnego możesz zmienić priorytet aplikacji (
chrt
) w czasie rzeczywistym , optymalizując ją w celu ograniczenia przerwań, przypinając ją do procesora lub grupy procesorów (taskset
) i zatrzymując niepotrzebne usługi lub demony.Możesz również zobaczyć kilka sugestii na: Jak rozwiązywać problemy z opóźnieniami między 2 hostami Linux
Trudno jest sprecyzować, nie znając sprzętu ani sprzętu sieciowego.
źródło
Jeśli wybierasz się na drogę wysokiej wydajności, zazwyczaj będziesz chciał uruchomić jak najmniej innych (zaplanowanych) procesów, ponieważ mogą one zakłócać działanie Twojej aplikacji.
Linux, podobnie jak klasyczne systemy operacyjne UNIX, jest zaprojektowany do równoczesnego uruchamiania wielu aplikacji w sposób równomierny i stara się zapobiegać głodowaniu zasobów, a ty dążysz do czegoś przeciwnego, głodzisz wszystko inne oprócz aplikacji. Proste kroki na poziomie systemu operacyjnego to zmiana ładnego poziomu i priorytetu aplikacji w czasie rzeczywistym, zmiana harmonogramu lub wybranie jądra w czasie rzeczywistym .
Protokół TCP / IP jest zazwyczaj dostrojony, aby zapobiegać zrywaniu połączeń i efektywnie wykorzystywać dostępną przepustowość. Aby uzyskać jak najkrótsze opóźnienie z bardzo szybkiego łącza, zamiast uzyskać najwyższą możliwą przepustowość z połączenia, w którym niektóre łącza pośrednie są bardziej ograniczone, dostosujesz dostrojenie stosu sieciowego.
pokaże ci wiele ustawień jądra, które możesz dostroić. Ustawienia zależą od tego, czy korzystasz z IPv4 czy IPv6, i od tego, co dokładnie robisz w aplikacji, ale może Cię zainteresować:
net.ipv4.tcp_window_scaling=1
RFC 1323 - obsługa rozmiarów okien IPV4 TCP większych niż 64 KB - generalnie potrzebne w sieciach o dużej przepustowościnet.ipv4.tcp_reordering=3
Maksymalny czas, w którym pakiet IPV4 może zostać ponownie uporządkowany w strumieniu pakietów TCP, bez zakładania utraty pakietów i powolnego startu.net.ipv4.tcp_low_latency=1
przeznaczony do preferowania niskiego opóźnienia w stosunku do wyższej przepustowości; ustawienie = 1 wyłącza przetwarzanie wstępnej kolejki IPV4 tcpnet.ipv4.tcp_sack=0
ustawienie na 1 włącza selektywne potwierdzanie dla IPV4, co wymaga włączenia tcp_timestamps i dodaje pewien narzut pakietów, który nie jest potrzebny, jeśli nie występuje utrata pakietównet.ipv4.tcp_timestamps=0
Zalecane tylko w przypadkach, gdy potrzebny jest worek.net.ipv4.tcp_fastopen=1
Włącz wysyłanie danych w otwierającym pakiecie SYN.Większość, jeśli nie wszystkie, są lepiej udokumentowane w źródle jądra .
Możesz oczywiście kodować nieprzetworzone gniazda TCP i w dużej mierze omijać stos TCP / IP jądra.
Często dobrze dostrojone systemy działają w zaufanej sieci i mają wyłączone lokalne zapory ogniowe (iptables).
źródło