Mam stosunkowo nowy 8-rdzeniowy komputer z systemem CentOS. Chciałbym opracować serwer statystyk korzystający z protokołu TCP. To bardzo proste, akceptuje połączenie TCP, zwiększa licznik i zamyka połączenie. Chodzi o to, że musi to zrobić co najmniej 10 000 żądań na sekundę. Podejrzewam, że procesor / pamięć nie będzie problemem, ale bardziej martwię się sztucznymi limitami (np. Półotwartymi połączeniami), które być może będę musiał skonfigurować na serwerze, aby zezwolić na tego rodzaju wolumin. Czy to możliwe? Jakie ustawienia powinienem wiedzieć? Czy moja karta sieciowa nie będzie w stanie sobie z tym poradzić?
18
Odpowiedzi:
Jest to powszechnie znane jako problem z c10k . Ta strona zawiera wiele dobrych informacji na temat problemów, na które napotkasz.
źródło
powinieneś być w stanie to zrobić [chociaż to prawdopodobnie zły pomysł].
na appserv żywicy mogę uzyskać ~ 5k req / s na czterordzeniowym rdzeniu Xeon 2,6 GHz. żądania wywołują prosty serwlet, który odczytuje 1 wiersz z mysql i wysyła bardzo małą odpowiedź xml.
test został zakończony
Wyniki testu:
ale myślę, że lepiej Ci będzie korzystać z prostego programu c, na pewno bez tworzenia nowych wątków dla każdego żądania. Link od Grega Hewgilla powinien dać ci dobry pomysł na ten temat.
nawet podczas długiego testu nie mam problemów z łącznością [wspomniane półotwarte gniazda]; test przebiega między dwoma urządzeniami z linuksem podłączonymi przez gigabit Ethernet [chociaż jak widać szerokość pasma nie jest wąskim gardłem].
źródło
Możesz być zainteresowany limitem jądra Linuksa, który osiągnąłem podczas testowania ładowania Apache. W moim przypadku jądro wygenerowało kilka użytecznych komunikatów o błędach, więc radzę napisać program, a jeśli wydaje się, że osiągasz limit, zwróć uwagę na dzienniki jądra.
źródło
Jeśli to możliwe, użyłbym UDP zamiast TCP. Powinien być bardziej lekki i dlatego lepiej skalować.
źródło
Twoja nicość powinna sobie z tym poradzić, ale kwestionuję projekt posiadania 10 000 nowych połączeń TCP na sekundę; jeśli tworzysz / niszczysz połączenia tak szybko, powinieneś albo a) pozostawić je otwarte dłużej lub b) zamiast tego użyć UDP.
W przypadku klientów 1M, którzy muszą od czasu do czasu wykonywać zapytania, ale gdy obciążenie osiągnie 10 000 na sekundę, UDP jest prawdopodobnie lepszym wyborem.
W przypadku, gdy masz tylko 10 000 klientów, którzy muszą wykonywać zapytania co sekundę, mogą po prostu pozostawić otwarte istniejące połączenia i użyć ich ponownie. Byłoby to o wiele milsze dla systemu operacyjnego, a także powodowałoby znacznie mniejsze opóźnienia, ponieważ nie wymagałoby to nowego uścisku dłoni za każdym razem.
W przypadku, gdy masz 10 000 żądań na sekundę, wyobrażam sobie, że masz i tak moduł równoważenia obciążenia front-end, więc musisz to również przetestować.
(NB: Myślę, że to należało do Stack Overflow)
źródło