Chciałbym zasymulować opóźnienie i utratę pakietów dla UDP
i TCP
na Linuksa, aby zmierzyć wydajność aplikacji. Czy istnieje prosty sposób to zrobić?
Chciałbym zasymulować opóźnienie i utratę pakietów dla UDP
i TCP
na Linuksa, aby zmierzyć wydajność aplikacji. Czy istnieje prosty sposób to zrobić?
Odpowiedzi:
netem wykorzystuje funkcje wbudowane w Linuksa i narzędzia przestrzeni użytkownika do symulacji sieci. Właśnie do tego odnosi się odpowiedź Marka pod innym imieniem.
Przykłady na ich stronie głównej pokazują już, jak możesz osiągnąć to, o co prosiłeś:
Przykłady
Emulowanie opóźnień sieci rozległej
Jest to najprostszy przykład, po prostu dodaje stałą ilość opóźnienia do wszystkich pakietów wychodzących z lokalnej sieci Ethernet.
# tc qdisc add dev eth0 root netem delay 100ms
Teraz prosty test ping do hosta w sieci lokalnej powinien wykazać wzrost o 100 milisekund. Opóźnienie jest ograniczone rozdzielczością zegara jądra (Hz). W większości systemów 2.4 zegar systemowy pracuje z częstotliwością 100 Hz, co pozwala na opóźnienia w odstępach co 10 ms. W wersji 2.6 wartością jest parametr konfiguracyjny od 1000 do 100 Hz.
Późniejsze przykłady zmieniają parametry bez ponownego ładowania qdisc
Rzeczywiste sieci rozległe wykazują zmienność, więc można dodawać zmienność losową.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
To powoduje, że dodane opóźnienie wynosi 100 ± 10 ms. Zmienność opóźnienia sieci nie jest czysto losowa, więc aby naśladować, że istnieje również wartość korelacji.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
To powoduje, że dodane opóźnienie wynosi 100 ± 10 ms, a następny losowy element zależy od 25% od ostatniego. To nie jest prawdziwa korelacja statystyczna, ale przybliżenie.
Opóźniona dystrybucja
Zazwyczaj opóźnienie w sieci nie jest jednolite. Bardziej powszechne jest użycie czegoś w rodzaju rozkładu normalnego do opisania zmiany opóźnienia. Dyscyplina netem może przyjąć tabelę, aby określić nierównomierny rozkład.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Rzeczywiste tabele (normal, pareto, paretonormal) są generowane jako część kompilacji iproute2 i umieszczane w / usr / lib / tc; więc możliwe jest z pewnym wysiłkiem stworzenie własnej dystrybucji w oparciu o dane eksperymentalne.
Utrata pakietu
Losowa utrata pakietów jest określona w komendzie „tc” w procentach. Najmniejszą możliwą wartością niezerową jest:
2 −32 = 0,0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
Powoduje to losowe upuszczenie 1/10 procent (tj. 1 na 1000) pakietów.
Można również dodać opcjonalną korelację. Powoduje to, że generator liczb losowych jest mniej losowy i może być używany do emulacji strat pakietów.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Spowoduje to utratę 0,3% pakietów, a każde kolejne prawdopodobieństwo zależy o jedną czwartą od ostatniego.
Prob n = 0,25 × Prob n-1 + 0,75 × Losowo
Pamiętaj , że powinieneś używać, tc qdisc add
jeśli nie masz reguł dla tego interfejsu lub tc qdisc change
jeśli masz już reguły dla tego interfejsu. Próba użycia tc qdisc change
interfejsu bez reguł spowoduje błąd RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
wyświetli listę aktualnie zdefiniowanych reguł i tc qdisc del dev eth0 root
je usunie
W przypadku upuszczonych pakietów użyłbym po prostu iptables i modułu statystycznego .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Powyżej upuści pakiet przychodzący z prawdopodobieństwem 1%. Bądź ostrożny, wszystko powyżej 0,14 i większość z was połączeń TCP najprawdopodobniej całkowicie się zawiesi.
Spójrz na man iptables i wyszukaj „statystyki”, aby uzyskać więcej informacji.
DROP
na połączeniach wychodzących śmiesznie powoduje to, że send()
operacje zwracają się EPERM
, a nie po prostu odrzuca pakiety (tak jak powinno).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Ten samouczek na temat symulacji fizyki sieci zawiera klasę C ++ w przykładowym kodzie do symulacji opóźnień i utraty pakietów w połączeniu UDP i może być wskazówką. Zobacz publiczne opóźnienie i zmienne packetLoss klasy Connection znajdujące się w pliku Connection.h kodu źródłowego do pobrania .
Nie próbowałem tego sam, ale na tej stronie znajduje się lista modułów wtyczek, które działają w systemie Linux z wbudowanym systemem filtrowania IP iptables. Jeden z modułów nazywa się „n-ty” i pozwala ustawić regułę, która zrzuci konfigurowalną szybkość pakietów. Przynajmniej może być dobrym miejscem do rozpoczęcia.
Możesz spróbować http://snad.ncsl.nist.gov/nistnet/ To dość stary projekt NIST (ostatnie wydanie 2005), ale działa dla mnie.
Łatwym w użyciu narzędziem do wstrzykiwania uszkodzeń sieci jest Saboteur . Może symulować:
- Całkowita partycja sieciowa
- Usługa zdalna nie działa (nie nasłuchuje na oczekiwanym porcie)
- Opóźnienia
- Utrata pakietów - Limit czasu połączenia TCP (co często zdarza się, gdy dwa systemy są oddzielone zaporą stanową)
Jednym z najczęściej używanych narzędzi w tym środowisku naukowym jest DummyNet . Po zainstalowaniu ipfw
modułu jądra, aby wprowadzić opóźnienie propagacji 50 ms między 2 maszynami, po prostu uruchom następujące polecenia:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Aby również wprowadzić 50% strat pakietów, musisz uruchomić:
./ipfw pipe 1 config plr 0.5
Tutaj więcej szczegółów.