簡體   English   中英

Tomcat停止響應JK請求

[英]Tomcat stops responding to JK requests

我對掛起的負載平衡Tomcat服務器有一個討厭的問題。 任何幫助將不勝感激。

系統

我在位於另一台充當負載平衡器的服務器后面的三台服務器上的HotSpot Server 14.3-b01(Java 1.6.0_17-b04)上運行Tomcat 6.0.26。 負載平衡器運行Apache(2.2.8-1)+ MOD_JK(1.2.25)。 所有服務器都在運行Ubuntu 8.04。

Tomcat的配置有2個連接器:一個AJP和一個HTTP。 AJP將與負載均衡器一起使用,而HTTP由開發團隊使用以直接連接到選定的服務器(如果有理由的話)。

我在Tomcat服務器上安裝了Lambda Probe 1.7b,可以幫助我診斷和解決即將描述的問題。

問題

問題出在這里:應用服務器啟動大約1天后,JK Status Manager開始報告Tomcat2的狀態ERR 它只會卡在這種狀態,到目前為止,我發現的唯一解決方法是ssh並重新啟動Tomcat。

我還必須提到,當有Tomcat服務器處於這種狀態時,JK狀態管理器需要花費很多時間來刷新。

最后,在JK Status Manager上卡住的Tomcat的“忙碌”計數始終很高,並且本身不會下降-我必須重新啟動Tomcat服務器,等待,然后在JK上重置工作服務器。

分析

由於每個Tomcat(AJP和HTTP)上都有2個連接器,因此我仍然可以通過HTTP連接到應用程序。 這樣的應用程序運行得很好,非常非常快。 這是完全正常的,因為我是唯一使用此服務器的服務器(因為JK停止將請求委派給該Tomcat)。

為了更好地理解問題,我從不再響應的Tomcat和最近重新啟動的另一個(例如1小時前)重新啟動的Tomcat中提取了一個線程轉儲。

正常響應JK的實例顯示大多數TP-ProcessorXXX線程處於“可運行”狀態,並具有以下堆棧跟蹤:

java.net.SocketInputStream.socketRead0 ( native code )
java.net.SocketInputStream.read ( SocketInputStream.java:129 )
java.io.BufferedInputStream.fill ( BufferedInputStream.java:218 )
java.io.BufferedInputStream.read1 ( BufferedInputStream.java:258 )
java.io.BufferedInputStream.read ( BufferedInputStream.java:317 )
org.apache.jk.common.ChannelSocket.read ( ChannelSocket.java:621 )
org.apache.jk.common.ChannelSocket.receive ( ChannelSocket.java:559 )
org.apache.jk.common.ChannelSocket.processConnection ( ChannelSocket.java:686 )
org.apache.jk.common.ChannelSocket$SocketConnection.runIt ( ChannelSocket.java:891 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:690 )
java.lang.Thread.run ( Thread.java:619 )

卡住的實例顯示大多數(全部?)TP-ProcessorXXX線程處於“等待”狀態。 這些具有以下堆棧跟蹤:

java.lang.Object.wait ( native code )
java.lang.Object.wait ( Object.java:485 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:662 )
java.lang.Thread.run ( Thread.java:619 ) 

我不了解Tomcat的內部原理,但我可以推斷出“等待”線程只是位於線程池上的線程。 因此,如果它們是在線程池中等待的線程,那么Tomcat為什么不將其用於處理來自JK的請求?

編輯:我不知道這是否正常,但是Lambda探針在狀態部分向我顯示,有許多線程處於KeepAlive狀態。 這與我遇到的問題有某種關系嗎?

解?

因此,正如我之前所說的,我發現的唯一解決方法是停止Tomcat實例,停止JK worker,等待后者的忙碌計數逐漸下降,再次啟動Tomcat,然后再次啟用JK worker。

是什么導致此問題? 我應該如何進一步調查? 我該怎么解決?

提前致謝。

您是否配置了JVM內存設置和垃圾回收? 您可以在設置CATALINA_OPTS的位置執行此操作

例子:

CATALINA_OPTS="$CATALINA_OPTS -server -Xnoclassgc -Djava.awt.headless=true"
CATALINA_OPTS="$CATALINA_OPTS -Xms1024M -Xmx5120M -XX:MaxPermSize=256m"
CATALINA_OPTS="$CATALINA_OPTS -XX:-UseParallelGC"
CATALINA_OPTS="$CATALINA_OPTS -Xnoclassgc"

GC設置是最佳的多種哲學。 這取決於您正在執行的代碼類型。 上面的配置最適合JSP密集型環境(使用標記庫而不是MVC框架)。

檢查您的Keepalive時間設置。 看來您正在使線程進入保持活動狀態,並且它們不會超時。 看來您的服務器沒有在合理的時間內檢測到客戶端斷開連接。 有幾個超時和計數變量。

首先檢查您的日志文件。

我認為默認日志文件位於/var/log/daemon.log中。 (此文件不只包含來自tomcat的日志)

Weblogic也有類似的問題。 原因是太多的線程正在等待網絡響應,而Weblogic的內存不足。 Tomcat的行為可能與此相同。 您可以嘗試的操作有:

  • 減少連接的超時值。
  • 減少同時連接的總數,以使tomcat在達到該數量時不會啟動新線程。
  • 易於修復,但不能糾正根本原因:可能是tomcat處於內存不足狀態,即使它尚未顯示在日志中也是如此。 如前所述增加tomcat的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM