2012-09-07 56 views
6

我遇到了一個問題,這個服務器在過去幾天剛剛啓動。 我正在運行apache httpd-2.2.3和tomcat-5.5.20,與mod_jk v1.3相關,並且在tomcat上有一個Spring MVC站點。 正在發生的事情是,約12小時後,網站掛起爲我們的用戶。當這發生了第一次我可以看到以下幾個錯誤的catalina.out的mod_jk失去與tomcat的連接

WARN [org.apache.jk.core.MsgContext] Error sending end packet 
java.net.SocketException: Broken pipe 

看這件事後,我才明白,這意味着用戶已經取消的請求已經完成之前,這樣的回報路徑被關閉,因此數據無法返回。從搜索網頁看來,這可能會導致線程在tomcat中保持打開狀態,直到它超時。這似乎是有道理的,因爲我在catalina.out的日誌的時候買的時候tomcat的下跌逾

All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status 

的建議是要在Apache的httpd.conf以下更改到JkModule設置

JkOptions +DisableReuse 

在確保它對我們的網站沒有任何副作用後,我做了這件事,第二天它運行良好,但昨天在網站凍結後出現了相同的症狀。但是這次在catalina.out中沒有任何錯誤,我們只是停止向tomcat發送請求。我可以從應用程序日誌中看到,它在17點31分收到的最後一個請求,然後在mod_jk.log我可以看到下面的

[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_connection_tcp_get_message::jk_ajp_common.c (947): (worker1) can't receive the response message from tomcat, network problems or tomcat is down (127.0.0.1:8009), err=-104 
[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_get_reply::jk_ajp_common.c (1536): (worker1) Tomcat is down or refused connection. No response has been sent to the client (yet) 

,然後在我的httpd error_log中

[Thu Sep 06 17:38:39 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting 

因此,在我出現任何錯誤之前6分鐘,然後在最大客戶端錯誤發生前1分鐘。重新啓動tomcat也解決了這個問題。

我們的apache,tomcat或連接器配置沒有改變,除了我提到的(當前配置如下),但我們已經對我們的網站進行了更改,以便爲每個用戶執行更多的Ajax請求。所以我想了解的是,如何才能最好地分析我們的系統,以瞭解我能做出的正確設置更改是確保我不會超載我們的服務器,但會阻止此問題的發生。

感謝 伊恩

當前設置

的httpd.conf

Timeout 300 
KeepAlive on 
MaxKeepAliveRequests 100 
KeepAliveTimeout 15 

LoadModule jk_module modules/mod_jk.so 
JkLogLevel error 
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " 
JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories +DisableReuse 

workers.properties

# Define 1 real worker using ajp13 
worker.list=worker1 
# Set properties for worker1 (ajp13) 
worker.worker1.type=ajp13 
worker.worker1.host=localhost 
worker.worker1.port=8009 
worker.worker1.lbfactor=50 
worker.worker1.cachesize=10 
worker.worker1.cache_timeout=600 
worker.worker1.socket_keepalive=1 
worker.worker1.recycle_timeout=300 

的httpd-mpm.conf

StartServers   5 
MinSpareServers  5 
MaxSpareServers  10 
MaxClients   150 
MaxRequestsPerChild 0 

Tomcat的設置只是標準tomcat的設置

+0

您是否考慮升級到Tomcat 6/7? –

+0

我沒有設置技術堆棧,我希望不必升級。如果涉及到它,那麼可能是一些嘗試,但我有一種感覺,這可以通過正確的配置修復 – sparkdoo

回答

2

原來答案是改變keepalive超時。我需要阻止這種情況的發生是將KeepAliveTimeout從15更改爲2,並添加5000的MaxRequestsPerChild。我發現這可以阻止這個問題的復發