2016-08-28 23 views
10

我unsertanding的Tomcat的Java NIO併發TCP慢客戶端連接

沒有NIO:
對於每一個的keepAlive連接服務器繼續阻塞線程。

隨着NIO:
這個連接器有幾個用來保持連接的所有連接的用戶同時工作線程被稱爲每當數據(新的HTTP請求)輪詢線程可現在

: 如果我有一個簡單的servlet,它返回一個100 KB的字符串到客戶端(瀏覽器)。

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

如果有1 KB連接的客戶端連接,則需要大約100秒才能接收字符串。
那麼java線程會被阻塞大約100秒?

如何TCP緩衝,Java的OutputStreamWriter或其他緩衝區影響線程塊的時間?

PS:在oracle7和oracle JDK 1.7中使用apache-tomcat-8.0.24。

編輯:如前所述線程也被阻塞器和緩衝器可減少線程塊的時間。如何樂觀的tomcat/OS通過使用這些緩衝減少線程塊的時間?

如何在生產環境中檢測到tomcat是否因多個連接緩慢的客戶端連接而導致線程中斷?

+0

關於NIO的討論沒有意義。在Tomcat容器中,您不會選擇切換IO技術。您必須使用Tomcat爲您提供的同步Writer實例。但我同意,許多緩慢的連接可能是一個嚴重的現實世界問題。你期望有多少個併發連接? 100? 1000? 10000? 100000? – Codo

+0

@Codo我們在有尖峯負載行爲的網站上工作。突然500客戶端可以connect.which可能會轉換爲500 *(從瀏覽器4 TCP連接)= 2000 ..是的,許多可以慢.. – Bhuvan

+0

與2000並行連接,最實用的解決方案是增加Tomat工作線程的數量到2000年(甚至更多)。今天的服務器應該很容易處理這麼多的線程。儘管如此,您可能需要爲Tomcat分配足夠的內存。如果我們談論的是100,000個連接,情況會有所不同。 – Codo

回答

2

因此,它是在Java線程將被阻止大約100秒?

是的。

TCP緩衝區,Java OutputStream或Writer或其他緩衝區如何影響線程塊時間?

如果緩衝區足夠大以容納發送的數據,發送線程將不會阻塞。

+0

你能指點我如何樂觀的tomcat/OS,通過增加這些不同種類的緩衝區來減少線程阻塞時間 – Bhuvan

+0

我不同意@ EJP的第二種說法:緩衝區只會幫助他們,如果他們在操作系統級別。 OutputStream或Writer類中的緩衝區將無濟於事,因爲一旦Tomcat嘗試刷新所有未完成的數據,它們仍會阻塞。 – Codo

+0

而不是開始修補你的緩衝區,你應該減少請求超時到可接受的水平。如果用戶將線程佔用時間過長並導致飢餓,那麼及時爲這些用戶查殺線程將解決您的問題。無論您的問題是由用戶還是由您提供的文件造成的,都太大,在操作系統方面可能會有少許優化。仔細查看服務器的配置。 – dieterh