Szybkość, z jaką mój serwer może akceptować () nowe połączenia przychodzące TCP, jest naprawdę zła w Xen. Ten sam test na metalowym sprzęcie pokazuje przyspieszenie 3-5x.
- Dlaczego to takie złe pod Xenem?
- Czy możesz dostosować Xen, aby poprawić wydajność dla nowych połączeń TCP?
- Czy istnieją inne platformy wirtualizacji lepiej dostosowane do tego rodzaju przypadków użycia?
tło
Ostatnio badam pewne wąskie gardła w wydajności własnego serwera Java działającego pod kontrolą Xena. Serwer mówi HTTP i odbiera proste połączenia TCP / żądania / odpowiedzi / rozłączenia TCP.
Ale nawet podczas wysyłania dużej ilości ruchu do serwera, nie może zaakceptować więcej niż ~ 7000 połączeń TCP na sekundę (w 8-rdzeniowej instancji EC2, c1.xlarge z uruchomionym Xen). Podczas testu serwer wykazuje również dziwne zachowanie, w którym jeden rdzeń (niekoniecznie procesor 0) jest bardzo obciążony> 80%, podczas gdy inne rdzenie pozostają prawie bezczynne. To prowadzi mnie do wniosku, że problem związany jest z wirtualizacją jądra / bazowego.
Podczas testowania tego samego scenariusza na platformie bez systemu wirtualnego otrzymuję wyniki testu pokazujące szybkość akceptacji TCP () powyżej 35 000 / sekundę. To na maszynie Core i5 4 Core z systemem Ubuntu ze wszystkimi rdzeniami prawie całkowicie nasyconymi. Wydaje mi się, że ta postać jest odpowiednia.
W instancji Xen ponownie próbowałem włączyć / dostosować niemal wszystkie ustawienia w sysctl.conf. Włączając włączanie funkcji odbierania sterowania pakietami i odbierania sterowania przepływem oraz przypinania wątków / procesów do procesorów, ale bez widocznych korzyści.
Wiem, że podczas działania zwirtualizowanego należy oczekiwać obniżonej wydajności. Ale do tego stopnia? Wolniejszy serwer typu bare-metal przewyższający virt. 8-rdzeniowy 5 razy?
- Czy to naprawdę oczekiwane zachowanie Xen?
- Czy możesz dostosować Xen, aby poprawić wydajność dla nowych połączeń TCP?
- Czy istnieją inne platformy wirtualizacji lepiej dostosowane do tego rodzaju przypadków użycia?
Odtwarzanie tego zachowania
Po dokładniejszym zbadaniu tego problemu i wskazaniu problemu dowiedziałem się, że narzędzie do testowania wydajności netperf może symulować podobny scenariusz. Za pomocą testu TCP_CRR firmy netperf zebrałem różne raporty z różnych serwerów (zarówno zwirtualizowanych, jak i innych niż virt). Jeśli chcesz przyczynić się do niektórych ustaleń lub przejrzeć moje bieżące raporty, zobacz https://gist.github.com/985475
Skąd mam wiedzieć, że ten problem nie wynika z źle napisanego oprogramowania?
- Serwer został przetestowany na czystym sprzęcie metalowym i prawie nasyca wszystkie dostępne mu rdzenie.
- Podczas korzystania z utrzymywanych połączeń TCP problem zniknął.
Dlaczego to jest ważne?
W ESN (mój pracodawca) jestem kierownikiem projektu Beaconpush , serwera Comet / Web Socket napisanego w Javie. Mimo że jest bardzo wydajny i może nasycić niemal dowolną przepustowość podaną mu w optymalnych warunkach, nadal jest ograniczony do tego, jak szybko można nawiązywać nowe połączenia TCP. To znaczy, jeśli masz dużą rezygnację użytkowników, do której użytkownicy przychodzą i odchodzą bardzo często, wiele połączeń TCP będzie musiało zostać skonfigurowanych / przerwanych. Staramy się łagodzić to utrzymywanie połączeń przy życiu tak długo, jak to możliwe. Ale w końcu wydajność accept () powstrzymuje nasze rdzenie przed obracaniem się i nam się to nie podoba.
Aktualizacja 1
Ktoś opublikował to pytanie w Hacker News , jest tam również kilka pytań / odpowiedzi. Ale postaram się aktualizować to pytanie za pomocą informacji, które znajduję w miarę upływu czasu.
Sprzęt / platformy, na których testowałem to:
- EC2 z typami instancji c1.xlarge (8 rdzeni, 7 GB pamięci RAM) i cc1.4xlarge (2x Intel Xeon X5570, 23 GB pamięci RAM). Stosowanymi AMI były odpowiednio ami-08f40561 i ami-1cad5275. Ktoś zauważył również, że „Grupy bezpieczeństwa” (tj. Zapora sieciowa EC2) również mogą mieć wpływ. Ale w tym scenariuszu testowym próbowałem tylko na localhost, aby wyeliminować takie czynniki zewnętrzne, jak ten. Kolejna plotka, jaką słyszałem, to że instancje EC2 nie mogą zepchnąć więcej niż 100k PPS.
- Dwa prywatne zwirtualizowane serwery z systemem Xen. Jeden miał zero obciążenia przed testem, ale nie zrobił różnicy.
- Prywatny dedykowany serwer Xen w Rackspace. O tych samych wynikach.
Jestem w trakcie ponownego uruchamiania tych testów i wypełniania raportów na https://gist.github.com/985475 Jeśli chcesz pomóc, podaj swoje liczby. To jest łatwe!
(Plan działania został przeniesiony do osobnej, skonsolidowanej odpowiedzi)