Java I / O vs. Java new i / O (NIO) with Linux NPTL

Moje webserwery używają zwykłego We / Wy Java z mechanizmem thread per connection. Obecnie padają na kolana ze zwiększonym użytkownikiem (długie połączenie sondażowe). Jednak połączenia są w większości bezczynne. Chociaż można to rozwiązać dodając więcej webserverów, starałem się przeprowadzić pewne badania nad implementacją NIO.

Mam mieszane wrażenie na ten temat. Czytałem o benchmarkach, gdzie zwykłe I / O z nową biblioteką nptl w Linuksie przewyższa NIO.

Jakie jest prawdziwe doświadczenie podczas konfigurowania i używania najnowszego NPTL dla Linuksa z Java I/O? Czy jest jakaś zwiększona wydajność?

i na pytanie o większy zakres:

Jaka jest maksymalna liczba wątków We / Wy i blokujących (które konfigurujemy w puli wątków Tomcat ) w standardowej maszynie klasy serwerowej (Dell z czterordzeniowym procesorem), która ma działać normalnie (z biblioteką Nptl Linuksa?). Jaki jest wpływ jeśli threadpool zrobi się naprawdę duży, powiedzmy ponad 1000 wątków?

Wszelkie odniesienia i wskaźniki będą bardzo mile widziane.

Author: Jonas, 2010-10-30

3 answers

Prowokacyjny wpis na blogu, "unikaj NIO, uzyskaj lepszą przepustowość." Paul Tyma ' s(2008) blog twierdzi ~5000 wątków bez żadnych problemów; słyszałem, że ludzie twierdzą więcej:

  1. z włączonym NPTL, Sun i Blackwidow JVM 1.4.2 skalowane łatwo do 5000+ nici. Model blokujący był konsekwentnie 25-35% szybciej niż przy użyciu Selektory NIO. Wiele technik zasugerował: EmberIO employed-korzystanie z wielu selektorów, wykonywanie wielokrotnych (2) odczytów, jeśli pierwszy read returned EAGAIN equivalent in Java. Jednak nie mogliśmy pokonać równiny wątek na model połączenia z Linuksem NPTL.

Myślę, że kluczem jest Zmierz napowietrzność i wydajność, i przejdź do nieblokujących we / wy tylko wtedy, gdy wiesz, że musisz i możesz wykazać poprawę. Dodatkowy wysiłek w pisaniu i utrzymywaniu kodu nieblokującego powinien być uwzględniony w twojej decyzji. Moim zdaniem, Jeśli Twoje podanie może być czysto wyrażone za pomocą synchronicznych / blokujących we / wy, zrób to . Jeśli Twoja aplikacja jest podatna na nieblokujące We/Wy i nie będziesz ponownie wymyślać blokujących We/Wy źle w przestrzeni aplikacji, rozważ przejście do nio w oparciu o zmierzone potrzeby wydajności. jestem zdumiony, gdy przeglądam wyniki google dla tego, jak niewiele zasobów faktycznie cytuje jakiekolwiek (ostatnie) numery!

Zobacz również slajdy prezentacyjne Paula Tymy : stary sposób jest znowu nowy. Na podstawie jego praca w Google, konkretne liczby sugerują, że synchroniczne gwintowane I/O jest dość skalowalne na Linuksie, i uważają" NIO jest szybsze " mitem, który był prawdziwy przez chwilę, ale już nie. Dobry dodatkowy komentarz tutaj na Comet Daily . Przytacza następujące (anegdotyczne, nadal brak solidnego linku do benchmarków itp...) wynik na NPTL:

W testach NPTL udało się uruchomić 100 000 wątków na IA - 32 w dwóch sekund. Dla porównania ten test pod jądrem bez NPTL would have podjęte około 15 minut

Jeśli naprawdę masz problemy ze skalowalnością, możesz chcieć dostroić rozmiar stosu wątków za pomocą XX:ThreadStackSize. Ponieważ wspominasz Tomcat zobacz tutaj .

Wreszcie, jeśli jesteś zdecydowany i zdecydowany używać nieblokujących We/Wy, dołożyć wszelkich starań, aby budować na istniejącym frameworku przez ludzi, którzy wiedzą, co robią . Zmarnowałem zbyt wiele własnego czasu, próbując uzyskać skomplikowane nieblokujące I / O rozwiązanie właściwe (z niewłaściwych powodów).

Zobacz także powiązane NA SO .

 17
Author: andersoj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:39

Linki, które mogą okazać się przydatne:

Możesz też rzucić okiem na http://nodejs.org/ która nie jest technologią JVM, ale doskonale obsługuje tysiące połączeń (i, jeśli się nie mylę, używa NPTL za kulisami)

Kilka dobrych sprawdzonych frameworków internetowych NIO pod JVM:

 4
Author: Vasil Remeniuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-30 09:02:23

Sajid, widzę, że robisz kometę (długie sondaże).

Prawie nikt nie mówi o problemie wykonywania kodu użytkownika dla zdarzeń komety w NIO. NIO thread dispatching Comet events wywołuje twój kod, jeśli twój kod nie jest wystarczająco dobry, blokujesz ten krytyczny wątek i inne połączenia Comet muszą czekać, ponieważ NIO thread wykonuje podobną pracę do harmonogramu wątków S. O.. To nie jest problem w komecie z IO bo wątek jest tylko dla Twojej komety event / task i scheduler mogą zrezygnować z wątku, kiedy chcą (nie tak łatwo z podejściem NIO).

Jedyny problem jaki widzę z "kometą synchroniczną" (opartą na IO) to zużycie pamięci stosów wątków.

 2
Author: jmarranz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-23 08:09:05