2016-08-28 14 views
10

My unsertandingTomcat Java NIO z jednoczesnych połączeń klienckich powolny TCP

Bez NIO:
Dla każdego keepalive serwerem połączenie nadal blokować wątku.

Z NIO:
To złącze ma kilka wątków poller używanych do utrzymania połączenia żył dla wszystkich podłączonych użytkowników podczas wątków roboczych nazywa ilekroć danych (nowe żądanie HTTP) jest dostępny

Teraz: Jeśli Mam prosty serwlet, który zwraca ciąg 100 KB do klienta (przeglądarki).

.... 
String HunderdKBString = "reallylongstring" 
PrintWriter out = response.getWriter(); 
out.println(HunderdKBString); 
.... 

Jeśli klient połączony z 1 kB łączy się, otrzymanie ciągu zajmie około 100 sekund.
Czy wątek Java zostanie zablokowany na około 100 sekund?

W jaki sposób bufor TCP, Java OutputStream lub Writer lub inne bufory wpływają na czas blokowania gwintu?

PS: za pomocą apache-tomcat-8.0.24 w centów 7 z Oracle JDK 1.7.

EDYCJA: Jak wspomniano wątku jest blokowane i bufor może zmniejszyć czas blokowania wątku .. Jak optymizm tomcat/OS, aby zmniejszyć czas blokowania wątku za pomocą tych buforów?

Jak można wykryć w środowisku produkcyjnym, czy tomcat jest głodny z powodu wielu podłączonych do niego powolnego klienta połączenia?

+0

Dyskusja na temat NIO nie ma sensu. W kontenerze Tomcat nie masz możliwości zmiany technologii IO. Musisz użyć synchronicznej instancji Writera, którą zapewnia Tomcat. Zgadzam się jednak, że wiele powolnych połączeń może być poważnym problemem w świecie rzeczywistym. Ile oczekujących połączeń oczekujesz? 100? 1000? 10000? 100000? – Codo

+0

@Codo pracujemy na stronie, która ma zachowanie obciążenia kolca. nagle 500 klientów może się połączyć, co może tłumaczyć do 500 * (4 połączenie TCP z przeglądarki) = 2000 .. i tak wiele może być powolne .. – Bhuvan

+0

Z połączeniami równoległymi 2000 najbardziej pragmatyczne rozwiązanie polega na zwiększeniu liczby wątków roboczych Tomat do 2000 (lub nawet więcej). Dzisiejsze serwery powinny z łatwością obsługiwać tak wiele wątków. Może być jednak konieczne przydzielenie wystarczającej ilości pamięci dla Tomcat. Byłoby inaczej, gdybyśmy mówili o 100 000 połączeń. – Codo

Odpowiedz

2

Czy wątek Java zostanie zablokowany na około 100 sekund?

Tak.

Jak bufor TCP, Java OutputStream lub Writer lub inne bufory wpływają na czas bloku wątku?

Jeśli bufor jest wystarczająco duży, aby pomieścić wysłane dane, wątek wysyłania nie zostanie zablokowany.

+0

Czy możesz wskazać mi zasoby na temat optymalizacji tomcat/OS, aby skrócić czas blokowania wątku przez zwiększenie tego rodzaju buforów? – Bhuvan

+0

Nie zgadzam się z drugą instrukcją @ EJP: Bufory będą pomocne tylko wtedy, gdy są na poziomie systemu operacyjnego. Bufory w klasach OutputStream lub Writer nie pomogą, ponieważ będą blokować, gdy Tomcat spróbuje usunąć wszystkie zaległe dane. – Codo

+0

Zamiast rozpocząć majstrowanie przy buforach, należy zmniejszyć limit czasu żądania do akceptowalnego poziomu. Jeśli użytkownik utrzymuje zbyt długo wątek i powoduje głód, wówczas zabicie wątków dla tych użytkowników na czas rozwiąże problem. To, czy Twój problem jest spowodowany przez użytkowników, czy pliki, które serwujesz, jest po prostu za duże. Prawdopodobnie istnieje niewielka możliwość optymalizacji po stronie systemu operacyjnego. Przyjrzyj się bliżej konfiguracji twojego serwera. – dieterh

Powiązane problemy