2012-04-13 13 views
5

Zbudowałem niestandardowy serwer komunikatów w Javie, który pobiera strumień wiadomości i dostarcza każdą wiadomość do swojego klienta (1: 1, drop msg, jeśli nie jest podłączony - bardzo prosty). Używam Tomcat 7 na Win7x64 & Java 7 i korzystam ze złącza NIO (zaimplementowałem serwlet Comet). Działa wspaniale, ale teraz szukam skalowania tej bestii i obecnie widzę około 85kb pamięci RAM przydzielonej dla każdego podłączonego klienta. 10.000 klientów przy 900 MB i skalowanie liniowe. (Nie robię nic innego poza utrzymywaniem połączenia) To jest całkiem sporo według mojej opinii, więc zastanawiam się, czy są jakieś poprawki, które sprawiają, że Tomcat lub Java zapisują więcej pamięci z impulsem NIO. Wszystkie ustawienia Tomcat, które próbowałem do tej pory, nie miały na to wpływu.zminimalizować pamięć Tomcat "na połączenie"

Czy ktoś ma doświadczenie, jak umieścić Java lub Tomcat na diecie pamięci związanej z połączeniami gniazd?

AKTUALIZACJA: Jestem teraz w dół pod 70kb/połączenia przez przycinanie buforów gniazda i niektóre inne elementy wewnętrzne tomcat. Nie wiem, jak to teraz wpływa na przepustowość. Próbowałem również na 32-bitowym/64-bitowym Linuxie z tym samym wynikiem.

+0

Jak zmierzyłeś 85kb na klienta? – dash1e

+0

Zrobiłem mały test obciążenia i połączyłem 10.000 klientów. W kodzie serwera zrobiłem po każdych 100 klientach System.gc(), a następnie wydrukowałem Runtime.totalMemory() - Runtime.freeMemory() do konsoli. – Daniel

+0

Witam. Czy możesz dzielić się najlepszymi ustawieniami Tomcat/JVM? Czy używałeś też złącza NIO? 10x – JRun

Odpowiedz

1

Po wielu badaniach i zabawie doszedłem do wniosku, że Tomcat nie jest w stanie obsłużyć dużej ilości współbieżnych połączeń z rozsądną ilością pamięci. (Ja wciąż chętnie do udowodnienia źle tutaj btw)

Istnieje jednak zbawcą:

Netty: http://www.jboss.org/netty/downloads

Jest to framework Java IO, który opiera się na nowym NIO architekturze Java i wydaje bardzo dobrze zaprojektowany i napisany. Możesz połączyć kilka lekkich modułów razem i utworzyć miniserwer lub po prostu samodzielnie poradzić sobie z połączeniami TCP w sposób asynchroniczny.

Uruchomiłem test obciążenia na EC2 i przerzuciłem go na oszałamiającą 7 MILIONÓW połączeń @ tylko 1,5 GB pamięci RAM! (podobnie jak przy teście tomcat nie robiłem nic poza przechowywaniem połączeń, więc prawdziwa aplikacja zużyje oczywiście więcej pamięci, ale 200 bajtów/połączenie "narzut" jest niczym!) A to zatrzymało się tylko dlatego, że ograniczyłem maszynę Java VM do 1,5 GB, jestem pewien, że test C10M byłby łatwy do wykonania.

Big kudos dla Netty i Java VM guys! Jestem pod wrażeniem.

Powiązane problemy