Buduję pakiet analityczny, a wymagania projektu mówią, że muszę obsługiwać 1 miliard trafień dziennie. Tak, „miliard”. Innymi słowy, nie mniej niż 12 000 trafień na sekundę zostało utrzymanych, a najlepiej trochę miejsca na wybuch. Wiem, że potrzebuję do tego wielu serwerów, ale staram się uzyskać maksymalną wydajność z każdego węzła, zanim „wrzucę w to więcej sprzętu”.
W tej chwili mam ukończoną część śledzenia trafień i dobrze zoptymalizowaną. Praktycznie zapisuję żądania bezpośrednio w Redis (do późniejszego przetworzenia za pomocą Hadoop). Aplikacja to Python / Django z gunicorn dla bramy.
Mój serwer Rackspace 2 GB Ubuntu 10.04 (nie maszyna produkcyjna) może obsługiwać około 1200 plików statycznych na sekundę (testowany przy użyciu Apache AB względem pojedynczego zasobu statycznego). Dla porównania, jeśli zamienię link do pliku statycznego za pomocą linku śledzącego, nadal otrzymuję około 600 żądań na sekundę - myślę, że to oznacza, że mój moduł śledzący jest dobrze zoptymalizowany, ponieważ jest tylko 2 razy wolniejszy niż ten sam zasób statyczny wielokrotnie.
Jednak gdy porównuję miliony hitów, zauważam kilka rzeczy -
- Brak użycia dysku - jest to oczekiwane, ponieważ wyłączyłem wszystkie dzienniki Nginx, a mój niestandardowy kod nic nie robi, tylko zapisuje szczegóły żądania w Redis.
- Niestałe użycie pamięci - prawdopodobnie ze względu na zarządzanie pamięcią przez Redis, moje użycie pamięci będzie stopniowo rosło, a następnie spadało, ale nigdy nie było to moim wąskim gardłem.
- Obciążenie systemu oscyluje wokół 2-4, system nadal reaguje nawet podczas moich najcięższych testów i wciąż mogę ręcznie przeglądać http://mysite.com/tracking/pixel z niewielkim widocznym opóźnieniem, podczas gdy mój (inny) serwer wykonuje 600 żądań na druga.
- Jeśli przeprowadzę krótki test, powiedzmy 50 000 trafień (zajmuje około 2 m), otrzymam stałe, niezawodne 600 żądań na sekundę. Jeśli przeprowadzę dłuższy test (do tej pory próbowałem do 3,5 m), mój r / s obniży się do około 250.
Moje pytania --
za. Czy wygląda na to, że maksymalnie wykorzystuję ten serwer? Czy wydajność plików statycznych 1200 Ns / s jest porównywalna z wydajnością innych?
b. Czy istnieją wspólne strojenie Nginx dla takich aplikacji o dużej głośności? Mam wątki robocze ustawione na 64, a wątki robocze gunicorn ustawione na 8, ale poprawianie tych wartości nie pomaga mi ani nie szkodzi.
do. Czy są jakieś ustawienia na poziomie linuksa, które mogłyby ograniczać moje połączenia przychodzące?
re. Co może spowodować spadek wydajności do 250r / s podczas długotrwałych testów? Ponownie pamięć nie wyczerpuje się podczas tych testów, a użycie dysku twardego jest zerowe.
Z góry dziękuję wszystkim :)
EDYCJA Oto moja konfiguracja nginx - http://pastie.org/1450749 - jest to głównie wanilia, z oczywistym tłuszczem odciętym.