Piszę serwer Java, który używa zwykłych gniazd do akceptowania połączeń od klientów. Używam dość prostego modelu, w którym każde połączenie ma własny wątek odczytywany z niego w trybie blokowania. pseudokod:Jeden wątek na klienta. Wykonalny?
handshake();
while(!closed) {
length = readHeader(); // this usually blocks a few seconds
readMessage(length);
}
cleanup();
(Nici są tworzone z Executors.newCachedThreadPool()
więc nie powinno być żadnych istotnych nakładów na ich rozpoczęciem)
Wiem, że to trochę naiwne konfiguracji i to naprawdę nie będzie skalować również do wielu połączeń, jeśli wątki były dedykowanymi wątkami systemu operacyjnego. Słyszałem jednak, że wiele wątków w Javie może współużytkować jeden wątek sprzętowy. Czy to prawda?
Wiedząc, że będę używać maszyny wirtualnej Hotspot w systemie Linux, na serwerze z 8 rdzeniami i 12 GB pamięci RAM, czy uważasz, że ta konfiguracja będzie działać dobrze dla tysięcy połączeń? Jeśli nie, jakie są alternatywy?
Każdy wątek będzie trochę stosu, ale jeśli przekształcę go w model bez blokowania, każde połączenie będzie potrzebować więcej danych na stercie, takich jak "w jakiej fazie czytania wiadomości jesteśmy teraz", która jest obecnie po prostu określone przez wskaźnik instrukcji (poprawne słowo?) wątku. Jednak planowanie może być problemem. –
@Bart: dodatkowa przestrzeń na połączenie nie jest nawet tak duża jak stos; przejście na NIO poprawi skalowalność. Koszt jest taki, że większość ludzi ma trudności z grokowaniem tego, co się dzieje (a Java nie ma coroutinesów, które można wykorzystać do zrównoważenia obaw). –
Jak powiedział bluszcz, głównym założeniem, aby skalować do tysięcy, jest naprawdę stos, który zużyją. Z drugiej strony nie jestem całkowicie przekonany, że planowanie będzie głównym czynnikiem. To będzie jakiś czynnik, ale może nie tak wielki, jak by się mogło wydawać. Jeśli twoimi dominującymi działaniami są I/O, wtedy twoje wątki szybko zwrócą procesory w większości przypadków, a będą one stronicowane tylko wtedy, gdy zostaną odebrane dane. Jeśli myślisz o tym, to zdjęcie nie jest zbyt różne, nawet jeśli używasz NIO. Po prostu więcej wątków bierze udział w pytaniu o mniej więcej taką samą liczbę cykli procesora. – sjlee