Hej, skoro jestem autorem tego cytatu, odpowiem :-)
W dużych witrynach występują dwa poważne problemy: jednoczesne połączenia i opóźnienia. Współbieżne połączenia są spowodowane przez powolnych klientów, których pobieranie trwa długo, oraz przez bezczynne stany połączenia. Te bezczynne stany połączenia są spowodowane ponownym użyciem połączenia w celu pobrania wielu obiektów, znanym jako utrzymywanie przy życiu, które jest dodatkowo zwiększane przez opóźnienie. Gdy klient jest bardzo blisko serwera, może intensywnie korzystać z połączenia i zapewnić, że prawie nigdy nie jest bezczynny. Jednak gdy sekwencja się kończy, nikomu nie zależy na szybkim zamknięciu kanału, a połączenie pozostaje otwarte i nieużywane przez długi czas. To jest powód, dla którego wiele osób sugeruje użycie bardzo niskiego limitu czasu utrzymywania aktywności. Na niektórych serwerach, takich jak Apache, najniższy limit czasu, jaki można ustawić, to jedna sekunda i często jest to o wiele za dużo, aby wytrzymać duże obciążenia: jeśli masz przed sobą 20000 klientów i pobierają oni średnio jeden obiekt na sekundę, to 20000 połączeń zostanie nawiązanych na stałe. 20000 jednoczesnych połączeń na serwerze ogólnego przeznaczenia, takim jak Apache, jest ogromne, będzie wymagało od 32 do 64 GB pamięci RAM w zależności od załadowanych modułów i prawdopodobnie nie można mieć nadziei na osiągnięcie znacznie wyższego poziomu nawet po dodaniu pamięci RAM. W praktyce w przypadku 20000 klientów możesz nawet zobaczyć od 40000 do 60000 równoczesnych połączeń na serwerze, ponieważ przeglądarki będą próbowały zestawić 2 do 3 połączeń, jeśli mają wiele obiektów do pobrania. i prawdopodobnie nie możesz mieć nadziei na osiągnięcie dużo wyższego poziomu nawet po dodaniu pamięci RAM. W praktyce w przypadku 20000 klientów możesz nawet zobaczyć od 40000 do 60000 równoczesnych połączeń na serwerze, ponieważ przeglądarki będą próbowały zestawić 2 do 3 połączeń, jeśli mają wiele obiektów do pobrania. i prawdopodobnie nie możesz mieć nadziei na osiągnięcie dużo wyższego poziomu nawet po dodaniu pamięci RAM. W praktyce w przypadku 20000 klientów możesz nawet zobaczyć od 40000 do 60000 jednoczesnych połączeń na serwerze, ponieważ przeglądarki będą próbowały zestawić 2 do 3 połączeń, jeśli mają wiele obiektów do pobrania.
Jeśli zamkniesz połączenie po każdym obiekcie, liczba jednoczesnych połączeń dramatycznie spadnie. Rzeczywiście, spadnie o współczynnik odpowiadający średniemu czasowi pobierania obiektu w zależności od czasu między obiektami. Jeśli potrzebujesz 50 ms, aby pobrać obiekt (miniaturowe zdjęcie, przycisk itp.), A pobierasz średnio 1 obiekt na sekundę, jak powyżej, będziesz mieć tylko 0,05 połączenia na klienta, czyli tylko 1000 jednoczesne połączenia dla 20000 klientów.
Teraz liczy się czas na nawiązanie nowych połączeń. Klienci daleko zdalni będą doświadczać nieprzyjemnych opóźnień. W przeszłości przeglądarki używały dużej liczby równoczesnych połączeń, gdy funkcja utrzymywania aktywności była wyłączona. Pamiętam cyfry 4 na MSIE i 8 na Netscape. To naprawdę podzieliłoby średnie opóźnienie na obiekt o tyle. Teraz, gdy funkcja utrzymywania aktywności jest wszędzie obecna, nie widzimy już tak wysokich liczb, ponieważ zwiększa to dodatkowo obciążenie zdalnych serwerów, a przeglądarki dbają o ochronę infrastruktury Internetu.
Oznacza to, że w dzisiejszych przeglądarkach trudniej jest sprawić, by usługi, które nie działają, są tak samo responsywne, jak te, które działają. Ponadto niektóre przeglądarki (np .: Opera) używają heurystyki, aby próbować używać potokowania. Pipelining to skuteczny sposób korzystania z funkcji utrzymywania aktywności, ponieważ prawie eliminuje opóźnienia, wysyłając wiele żądań bez czekania na odpowiedź. Wypróbowałem to na stronie ze 100 małymi zdjęciami, a pierwszy dostęp jest około dwa razy szybszy niż bez utrzymywania przy życiu, ale następny dostęp jest około 8 razy szybszy, ponieważ odpowiedzi są tak małe, że liczy się tylko opóźnienie (tylko Odpowiedzi „304”).
Powiedziałbym, że najlepiej byłoby, gdybyśmy mieli trochę przestrajalnych przeglądarek, aby utrzymać połączenia między pobranymi obiektami i natychmiast porzucić je po zakończeniu strony. Ale niestety tego nie widzimy.
Z tego powodu niektóre witryny, które muszą instalować serwery ogólnego przeznaczenia, takie jak Apache z przodu, i które muszą obsługiwać dużą liczbę klientów, generalnie muszą wyłączyć funkcję utrzymywania aktywności. Aby zmusić przeglądarki do zwiększenia liczby połączeń, używają wielu nazw domen, aby pobieranie mogło być równoległe. Jest to szczególnie problematyczne w witrynach intensywnie korzystających z SSL, ponieważ konfiguracja połączenia jest jeszcze wyższa, ponieważ istnieje jedna dodatkowa podróż w obie strony.
Obecnie częściej obserwuje się, że takie strony wolą instalować lekkie nakładki, takie jak haproxy czy nginx, które nie mają problemu z obsługą dziesiątek do setek tysięcy jednoczesnych połączeń, umożliwiają utrzymywanie aktywności po stronie klienta i wyłączają je po stronie klienta. Strona Apache. Z tej strony koszt ustanowienia połączenia jest prawie zerowy pod względem mocy obliczeniowej procesora i niezauważalny pod względem czasu. W ten sposób zapewnia to, co najlepsze z obu światów: małe opóźnienie dzięki utrzymywaniu przy życiu z bardzo niskimi limitami czasu po stronie klienta i małą liczbą połączeń po stronie serwera. Wszyscy są szczęśliwi :-)
Niektóre produkty komercyjne dodatkowo poprawiają to, wykorzystując ponownie połączenia między systemem równoważenia obciążenia z przodu a serwerem i multipleksując wszystkie połączenia klientów za ich pośrednictwem. Gdy serwery są blisko LB, zysk nie jest dużo wyższy niż w poprzednim rozwiązaniu, ale często będzie to wymagało dostosowań w aplikacji, aby zapewnić, że nie ma ryzyka przechodzenia sesji między użytkownikami z powodu nieoczekiwanego współdzielenia połączenia między wieloma użytkownikami . W teorii to nigdy nie powinno mieć miejsca. Rzeczywistość jest zupełnie inna :-)