Apache-2.2

不尋常的 Apache->Tomcat 記憶體問題

  • April 25, 2010

現在,我在 Tomcat 前面有一個 Apache 設置來處理記憶體。此設置已提供給外部服務進行管理,並且自從過渡以來,我注意到了奇怪的行為。具體來說,當我從 Web 伺服器請求一個swf文件時,我點擊了 Apache 記憶體(很好),但偶爾我會收到一個被截斷的文件。一旦我收到這個截斷的文件,記憶體將不會刷新,直到我手動刪除記憶體並讓 swf 再次從 tomcat 下拉。

外部服務聲稱配置很好,但除了配置不正確之外,我看不出有任何可能發生這種情況。現在,負載均衡器下有兩台 apache 和兩台 tomcat 伺服器,有時一個 apache 記憶體會中斷,而另一個不會(導致 50% 的請求得到壞的、截斷的數據)。

我應該從哪裡開始尋找調試這個問題?什麼可能導致這種奇怪的行為?

編輯:檢查日誌,tomcat 拋出這個:

java.io.IOException: Bad file number
       at java.io.FileInputStream.readBytes(Native Method)
       at java.io.FileInputStream.read(FileInputStream.java:199)
       at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
       at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
       at java.io.FilterInputStream.read(FilterInputStream.java:90)
       at org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:1968)
       at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1714)
       at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:809)
       at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:325)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
       at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
       at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:209)
       at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
       at org.terracotta.modules.tomcat.tomcat_5_5.SessionValve55.invoke(SessionValve55.java:57)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
       at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
       at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
       at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
       at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
       at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
       at java.lang.Thread.run(Thread.java:619)

followed by 

access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:00:27:32 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:27:33 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:39:53 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:02:27:38 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -

所以 apache 正在記憶體錯誤的文件大小。什麼可能導致這種情況,並且可能是單獨的,我如何確保這個異常不會被寫入記憶體?

wget、curl 或文件另存為這個文件?

其他大文件有用嗎?

如果有支持契約,我會考慮要求供應商協作調試。

Tomcat 無法提供大文件的問題已在trunk 5.5.x 中得到修復,修復該錯誤的修復已送出至6.0.27。

引用自:https://serverfault.com/questions/95822