Powiedzmy, że gdybym miał uzyskać hosting współdzielony, wirtualny lub dedykowany, czytałem gdzieś, że serwer / maszyna może obsłużyć tylko 64 000 połączeń TCP jednocześnie, czy to prawda? Ile może obsłużyć dowolny typ hostingu niezależnie od przepustowości? Zakładam, że HTTP działa przez TCP.
Czy oznaczałoby to, że tylko 64 000 użytkowników mogłoby połączyć się z witryną, a gdybym chciał obsługiwać więcej, musiałbym przenieść się na farmę internetową?
Odpowiedzi:
Krótko mówiąc: powinieneś być w stanie osiągnąć w liczbę milionów jednoczesnych aktywnych połączeń TCP i przez rozszerzenie żądania HTTP. Dzięki temu uzyskasz maksymalną wydajność, jakiej możesz oczekiwać dzięki odpowiedniej platformie i odpowiedniej konfiguracji.
Dzisiaj martwiłem się, czy IIS z ASP.NET będzie obsługiwał w kolejności 100 jednoczesnych połączeń (spójrz na moją aktualizację, oczekuj ~ 10 tys. Odpowiedzi na sekundę w starszych wersjach ASP.Net Mono). Kiedy zobaczyłem to pytanie / odpowiedzi, nie mogłem się powstrzymać od odpowiedzi, wiele odpowiedzi na to pytanie jest całkowicie błędnych.
Najlepszy przypadek
Odpowiedź na to pytanie musi dotyczyć tylko najprostszej konfiguracji serwera, aby oddzielić ją od niezliczonych zmiennych i konfiguracji możliwych do wykonania na dalszych etapach.
Rozważ więc następujący scenariusz mojej odpowiedzi:
Szczegółowa odpowiedź
Synchroniczne projekty powiązane z wątkami mają zwykle najgorszą wydajność w porównaniu z implementacjami asynchronicznych operacji we / wy.
WhatsApp uzyskuje milion z ruchem na pojedynczym systemie operacyjnym o smaku Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
I wreszcie ten, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , zawiera wiele szczegółów , badając, jak można osiągnąć nawet 10 milionów. Serwery często mają sprzętowe silniki odciążania TCP, układy ASIC zaprojektowane do tej konkretnej roli wydajniej niż procesory ogólnego przeznaczenia.
Dobre możliwości projektowania oprogramowania
Projektowanie asynchronicznych operacji we / wy będzie się różnić w zależności od systemów operacyjnych i platform programowania. Node.js został zaprojektowany z myślą o asynchroniczności . Powinieneś przynajmniej użyć Promises, a kiedy pojawi się ECMAScript 7,
async
/await
. C # / .Net ma już pełną obsługę asynchroniczną, taką jak node.js. Niezależnie od systemu operacyjnego i platformy, asynchroniczne powinny działać bardzo dobrze. Niezależnie od wybranego języka poszukaj słowa kluczowego „asynchroniczny”. Większość współczesnych języków będzie miała pewne wsparcie, nawet jeśli jest to jakiś dodatek.Do WebFarm?
Bez względu na ograniczenia w twojej konkretnej sytuacji, tak, farma internetowa to dobre rozwiązanie do skalowania. Istnieje wiele architektur, które to umożliwiają. Jednym z nich jest równoważenie obciążenia (dostawcy hostingu mogą je oferować, ale nawet oni mają limit wraz z limitem przepustowości), ale nie preferuję tej opcji. W przypadku aplikacji jednostronicowych z długotrwałymi połączeniami wolę zamiast tego mieć otwartą listę serwerów, z których aplikacja kliencka będzie wybierać losowo podczas uruchamiania i ponownie używać przez cały okres istnienia aplikacji. Eliminuje to pojedynczy punkt awarii (moduł równoważenia obciążenia) i umożliwia skalowanie w wielu centrach danych, a tym samym znacznie większą przepustowość.
Obalamy mit - porty 64K
Aby odpowiedzieć na pytanie dotyczące „64 000”, jest to błędne przekonanie. Serwer może łączyć się z wieloma ponad 65535 klientami. Zobacz /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
Nawiasem mówiąc, Http.sys w systemie Windows umożliwia wielu aplikacjom współużytkowanie tego samego portu serwera w ramach schematu adresu URL HTTP. Każdy z nich rejestruje oddzielne powiązanie domeny, ale ostatecznie istnieje jedna aplikacja serwerowa, która przekazuje żądania do odpowiednich aplikacji.
Aktualizacja 2019-05-30
Oto aktualne porównanie najszybszych bibliotek HTTP - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
źródło
To dość trudne pytanie. Nie ma rzeczywistego ograniczenia oprogramowania co do liczby aktywnych połączeń, które może mieć komputer, chociaż niektóre systemy operacyjne są bardziej ograniczone niż inne. Problem staje się jednym z zasobów. Na przykład, powiedzmy, że pojedynczy komputer chce obsługiwać 64 000 jednoczesnych połączeń. Jeśli serwer używa 1 MB pamięci RAM na połączenie, potrzebuje 64 GB pamięci RAM. Jeśli każdy klient musi odczytać plik, obciążenie dostępu do dysku lub macierzy pamięci staje się znacznie większe niż te urządzenia mogą obsłużyć. Jeśli serwer musi rozwidlać jeden proces na połączenie, system operacyjny będzie spędzał większość czasu na przełączaniu kontekstu lub ograniczaniu czasu procesora.
Strona z problemem C10K zawiera bardzo dobre omówienie tego zagadnienia.
źródło
Aby dodać moje dwa centy do konwersacji, proces może mieć jednocześnie otwartą liczbę podłączonych gniazd równą tej liczbie (w systemach typu Linux) / proc / sys / net / core / somaxconn
cat / proc / sys / net / core / somaxconn
Ta liczba może być modyfikowana w locie (oczywiście tylko przez użytkownika root)
echo 1024> / proc / sys / net / core / somaxconn
Ale całkowicie zależy od procesu serwera, sprzętu maszyny i sieci, rzeczywistej liczby gniazd, które można podłączyć przed awarią systemu
źródło
listen(int socket, int backlog)
. Nie jest związana z liczbą gniazd, które proces może mieć otwarte.Wygląda na to, że odpowiedź brzmi co najmniej 12 milionów, jeśli masz mocny serwer, oprogramowanie serwera jest do tego zoptymalizowane, masz wystarczającą liczbę klientów. Jeśli testujesz od jednego klienta do jednego serwera, liczba numerów portów na kliencie będzie jednym z oczywistych ograniczeń zasobów (każde połączenie TCP jest definiowane przez unikalną kombinację adresu IP i numeru portu u źródła i miejsca docelowego).
(Musisz uruchomić wielu klientów, ponieważ w przeciwnym razie najpierw osiągniesz limit 64K numerów portów)
Sprowadzając do tego, jest to klasyczny przykład dowcipu, że „różnica między teorią a praktyką jest znacznie większa w praktyce niż w teorii” - w praktyce osiągnięcie wyższych liczb wydaje się być cyklem a. zaproponować określoną konfigurację / architekturę / zmiany w kodzie, b. testuj, aż osiągniesz limit, c. Skończyłem? Jeśli nie, to d. ustal, co było czynnikiem ograniczającym, np. wróć do kroku a (przepłucz i powtórz).
Oto przykład z 2 milionami połączeń TCP na potężnym pudełku (128 GB pamięci RAM i 40 rdzeni) z oprogramowaniem Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections - zakończyły się potrzebujących około 50 rozsądnie ważnych serwerów tylko po to, aby zapewnić obciążenie klienta (ich początkowi mniejsi klienci osiągnęli maksymalny poziom za wcześnie, np. „maksymalizowali nasze 4-rdzeniowe / 15 gb box przy 450 tys. klientów”).
Oto kolejna referencja dla go tym razem na 10 milionów: http://goroutines.com/10m .
Wygląda na to, że jest oparty na Javie i ma 12 milionów połączeń: https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/
źródło
Zwróć uwagę, że HTTP zazwyczaj nie utrzymuje otwartych połączeń TCP dłużej niż jest to potrzebne do przesłania strony do klienta; i zazwyczaj przeczytanie strony internetowej zajmuje użytkownikowi znacznie więcej czasu niż jej pobranie ... gdy użytkownik przegląda stronę, nie dodaje żadnego obciążenia do serwera.
Zatem liczba osób, które mogą jednocześnie przeglądać Twoją witrynę internetową, jest znacznie większa niż liczba połączeń TCP, które może ona jednocześnie obsługiwać.
źródło
w przypadku protokołu IPv4, serwer z jednym adresem IP, który nasłuchuje tylko na jednym porcie, może obsłużyć 2 ^ 32 adresy IP x 2 ^ 16 portów, czyli 2 ^ 48 unikalnych gniazd. Jeśli mówisz o serwerze jako o maszynie fizycznej i jesteś w stanie wykorzystać wszystkie 2 ^ 16 portów, to może istnieć maksymalnie 2 ^ 48 x 2 ^ 16 = 2 ^ 64 unikalnych gniazd TCP / IP dla jednego adresu IP. Należy pamiętać, że niektóre porty są zarezerwowane dla systemu operacyjnego, więc ta liczba będzie niższa. Podsumowując:
1 IP i 1 port -> 2 ^ 48 gniazd
1 IP i wszystkie porty -> 2 ^ 64 gniazda
wszystkie unikalne gniazda IPv4 we wszechświecie -> 2 ^ 96 gniazd
źródło
Są tutaj dwie różne dyskusje: Pierwsza dotyczy tego, ile osób może połączyć się z Twoim serwerem. Inni odpowiedzieli odpowiednio na to pytanie, więc nie będę się w to rozwodził.
Inne jest to, na ilu portach Twój serwer może nasłuchiwać? Myślę, że stąd pochodzi liczba 64K. W rzeczywistości protokół TCP używa 16-bitowego identyfikatora portu, co przekłada się na 65536 (nieco więcej niż 64 KB). Oznacza to, że możesz mieć na serwerze tyle różnych „nasłuchiwaczy” na jeden adres IP.
źródło
Myślę, że liczba równoczesnych połączeń przez gniazdo, które może obsłużyć jeden serwer WWW, w dużej mierze zależy od ilości zasobów zużytych przez każde połączenie i całkowitej ilości zasobów dostępnych na serwerze, z wyjątkiem konfiguracji ograniczającej inne zasoby serwera WWW.
Aby to zilustrować, jeśli każde połączenie przez gniazdo zużywa 1 MB zasobów serwera, a serwer ma 16 GB dostępnej pamięci RAM (teoretycznie), oznaczałoby to, że byłby w stanie obsłużyć tylko (16 GB / 1 MB) jednoczesnych połączeń. Myślę, że to takie proste ... NAPRAWDĘ!
Zatem niezależnie od tego, jak serwer WWW obsługuje połączenia, każde połączenie ostatecznie zużyje trochę zasobów.
źródło