Niepoprawnie założyłem, że moje wewnętrzne testy AB oznaczają, że mój serwer może obsłużyć 1k współbieżności @ 3k trafień na sekundę.
Moja teoria w tej chwili jest taka, że sieć stanowi wąskie gardło. Serwer nie może wystarczająco szybko wysłać wystarczającej ilości danych.
Testy zewnętrzne z blitz.io przy 1k współbieżności pokazują, że moje trafienia / s spadają do 180, a strony reagują coraz dłużej, ponieważ serwer jest w stanie zwracać tylko 180 na sekundę.
Podałem pusty plik z nginx i sprawdziłem: skaluje się 1: 1 z współbieżnością.
Teraz, aby wykluczyć wąskie gardła we / wy / memcached (nginx zwykle ściąga z memcached), serwuję statyczną wersję buforowanej strony z systemu plików.
Wyniki są bardzo podobne do mojego oryginalnego testu; Mam ograniczenie do około 180 RPS.
Podział strony HTML na pół daje mi podwójny RPS, więc jest zdecydowanie ograniczony rozmiarem strony.
Jeśli wewnętrznie ApacheBench z serwera lokalnego, otrzymam spójne wyniki około 4k RPS zarówno na całej stronie, jak i na pół stronie, przy wysokich prędkościach transferu. Szybkość transferu: odebrano 62586.14 [kB / s]
Jeśli korzystam z zewnętrznego serwera, otrzymuję około 180 RPS - to samo co wyniki blitz.io.
Skąd mam wiedzieć, że nie jest to celowe ograniczanie?
Jeśli przeprowadzę testy porównawcze z wielu zewnętrznych serwerów, wszystkie wyniki staną się słabe, co prowadzi mnie do przekonania, że problem dotyczy ruchu wychodzącego MOICH serwerów, a nie problemu z prędkością pobierania moich serwerów testowych / blitz.io.
Wracam więc do wniosku, że mój serwer nie może wystarczająco szybko wysłać danych.
Czy mam rację? Czy istnieją inne sposoby interpretacji tych danych? Czy rozwiązaniem / optymalizacją jest skonfigurowanie wielu serwerów + równoważenie obciążenia, z których każdy może obsłużyć 180 trafień na sekundę?
Jestem całkiem nowy w optymalizacji serwera, więc byłbym wdzięczny za wszelkie potwierdzenie interpretacji tych danych.
Ruch wychodzący
Oto więcej informacji na temat przepustowości wychodzącej: Wykres sieci pokazuje maksymalną wydajność 16 Mb / s: 16 megabitów na sekundę. W ogóle nie brzmi dużo.
Z powodu sugestii o ograniczeniu przepustowości przyjrzałem się temu i odkryłem, że linode ma ograniczenie 50 Mb / s (najwyraźniej nawet nie jestem bliski trafienia). Podniosłem go do 100 Mb / s.
Skoro linode ogranicza mój ruch i nawet go nie uderzam, czy to oznacza, że mój serwer powinien rzeczywiście być zdolny do przesyłania do 100 Mb / s, ale jest ograniczony przez inne wewnętrzne wąskie gardło? Po prostu nie rozumiem, jak działają sieci na tak dużą skalę; czy mogą dosłownie wysyłać dane tak szybko, jak potrafią czytać z dysku twardego? Czy rura sieciowa jest tak duża?
Podsumowując
1: W oparciu o powyższe, myślę, że zdecydowanie mogę podnieść mój 180RPS, dodając moduł równoważenia obciążenia nginx na szczycie konfiguracji wielu serwerów nginx z dokładnie 180RPS na serwer za LB.
2: Jeśli linode ma limit 50 / 100mbit, którego w ogóle nie uderzam, musi być coś, co mogę zrobić, aby przekroczyć ten limit dzięki konfiguracji z jednym serwerem. Jeśli potrafię odczytywać / transmitować dane wystarczająco szybko lokalnie, a linode nawet zawraca sobie głowę limitem 50 Mb / 100 Mb, musi istnieć wewnętrzne wąskie gardło, które nie pozwala mi trafić w te ograniczenia, których nie jestem pewien, jak je wykryć. Poprawny?
Zdaję sobie sprawę, że pytanie jest teraz ogromne i niejasne, ale nie jestem pewien, jak je skondensować. Wszelkie uwagi są doceniane na podstawie jakichkolwiek wniosków, które poczyniłem.