Korzystam z zestawu testów obciążenia, aby określić wydajność następującej konfiguracji:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
W skrócie, pakiet testowy node.js wysyła określoną liczbę pomiarów co x sekund do instancji StatsD, która znajduje się na innym serwerze. Następnie StatsD opróżnia metryki co sekundę do instancji grafitu zlokalizowanej na tym samym serwerze. Następnie patrzę na to, ile metryk zostało faktycznie wysłanych przez pakiet testowy i ile otrzymano przez Graphite, aby określić utratę pakietów między pakietem testowym a Graphite.
Zauważyłem jednak, że czasami mam bardzo duże szybkości upuszczania pakietów (zauważ, że są one wysyłane z protokołem UDP), od 20-50%. Więc wtedy zacząłem szukać miejsca, w którym te pakiety były upuszczane, widząc, że może to być jakiś problem z wydajnością w StatsD. Zacząłem więc rejestrować metryki w każdej części systemu, aby śledzić, gdzie wystąpił ten spadek. I tutaj rzeczy stają się dziwne.
Korzystam z tcpdump, aby utworzyć plik przechwytywania, który sprawdzam po zakończeniu testu. Ale ilekroć uruchamiam testy przy uruchomionym tcpdump, utrata pakietów prawie nie istnieje! Wygląda na to, że tcpdump w jakiś sposób zwiększa wydajność moich testów i nie mogę zrozumieć, dlaczego i jak to robi. Korzystam z następującego polecenia, aby zarejestrować komunikaty tcpdump na serwerze i kliencie:
tcpdump -i any -n port 8125 -w test.cap
W jednym konkretnym przypadku testowym przesyłam 40000 metryk / s. Test podczas działania tcpdump ma utratę pakietów około 4%, podczas gdy w przypadku tej bez utraty pakietów około 20%
Oba systemy działają jako maszyny wirtualne Xen z następującą konfiguracją:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- 2 GB pamięci RAM
- Ubuntu 14.04 x86_64
Rzeczy, które już sprawdziłem pod kątem potencjalnych przyczyn:
- Zwiększenie rozmiaru odbierania / wysyłania bufora UDP.
- Obciążenie procesora wpływające na test. (maks. obciążenie 40-50%, zarówno po stronie klienta, jak i serwera)
- Uruchamianie tcpdump na określonych interfejsach zamiast „any”.
- Uruchamianie tcpdump z '-p', aby wyłączyć tryb rozwiązły.
- Uruchamianie tcpdump tylko na serwerze. Spowodowało to utratę pakietów o 20% i wydaje się nie wpływać na testy.
- Uruchamianie tcpdump tylko na kliencie. Spowodowało to wzrost wydajności.
- Zwiększenie netdev_max_backlog i netdev_budget do 2 ^ 32-1. To nie miało znaczenia.
- Próbowałem każdego możliwego ustawienia trybu rozwiązanego w każdej nici (serwer włączony i klient wyłączony, serwer wyłączony i klient włączony, oba włączone, oba wyłączone). To nie miało znaczenia.
ifconfig eth0 promisc
włącza i ifconfig eth0 -promisc
wyłącza tryb rozwiązły w eth0. Jeśli to robi różnicę, spróbuj porównać 4 możliwe kombinacje włączania / wyłączania promisów na obu komputerach. To może pomóc w wskazaniu źródła problemów.
-p
pominąć opcję pominięcia tej czynności, aby sprawdzić, czy to robi różnicę.