簡體   English   中英

Tomcat自行關閉

[英]Tomcat shutting down by itself

我在 CentOS 6.5 64 位和 OpenJDK 1.7 64 上運行 Tomcat 7.0.53。

我有幾台服務器,偶爾 - 就像每周隨機一次 - Tomcat 會優雅地關閉自己。 我已經研究了幾個月,但找不到原因。 唯一的模式似乎是很長一段時間沒有任何事情發生,然后關閉。

  • 我已升級到最新版本的底層工具(Tomcat、Java 等)
  • 我正在使用默認內存設置運行
  • 我在 server.xml 中禁用了 SHUTDOWN
  • 我已將 MySQL 移至另一個框以確保 Tomcat 是唯一的實質性應用程序(服務器也運行 nginx)
  • 我已經確認我的任何代碼中都沒有 System.exit()。 我沒有掃描庫,因為我不知道如何做到這一點。 我也不指望我會在那里找到任何東西。 為什么圖書館會退出?
  • 我已啟用垃圾收集的日志記錄。 但它們看起來很快——就像 0.15 秒內的完整 GC

這是其中一台服務器的內存使用情況。 大量的免費內存。

                 total       used       free     shared    buffers     cached
    Mem:          2006        771       1234          0        176        281
    -/+ buffers/cache:        313       1692
    Swap:         2047          0       2047

以下是 Catalina.out 中的事件之一。 你可以看到它開始然后幾個小時沒有任何令人興奮的事情。 然后像被告知一樣優雅地關閉自己。

我已經對此進行了研究,但一直無法解決這個問題。

有人可以為我提出一個行動計划嗎?

謝謝

從 Server.xml:

    <Server port="-1" shutdown="__SHUTDOWN__">

來自 Catalina.out:

Apr 28, 2014 5:34:50 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Valve} Setting property 'remoteIpProxiesHeader' to 'x-forwarded-by' did not find a matching property.
Apr 28, 2014 5:34:50 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-apr-8080"]
Apr 28, 2014 5:34:50 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
Apr 28, 2014 5:34:50 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3247 ms
Apr 28, 2014 5:34:50 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Apr 28, 2014 5:34:50 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.53
Apr 28, 2014 5:34:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8080"]
Apr 28, 2014 5:34:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8009"]
Apr 28, 2014 5:34:59 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 8278 ms
Apr 28, 2014 5:41:53 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-apr-8080"]
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-apr-8009"]
Apr 28, 2014 10:32:32 PM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-apr-8080"]
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["ajp-apr-8009"]
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-apr-8080"]
Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-apr-8009"]
May 05, 2014 8:10:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.3.9.
May 05, 2014 8:10:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
May 05, 2014 8:10:32 PM org.apache.tomcat.util.digester.SetPropertiesRule begin

有事告訴Tomcat關閉。

當Tomcat“陷入困境”(內存不足或其他任何問題)時,Tomcat不會正常關閉。 當Linux內存不足時,Linux不能正常關閉進程,它會使用kill -9來阻止它們,這樣就不會在Tomcat日志中留下任何痕跡。

  • kill -15將通過關閉鈎優雅地關閉tomcat。 (之前的答案是kill -3 ,這只是導致線程轉儲。)

  • 內部退出()也將通過關閉掛鈎正常關閉它。

  • 它可以通過JMX關閉,當然還有來自Catalina的關閉命令。

所以,有人在某處告訴Tomcat這樣做。 這不是一些未知的內部“問題”。 那些東西只是徹底殺死了tomcat,他們不禮貌地問。

您可能嘗試的一件事是啟用DEBUG進行日志記錄,以查看您獲得的聊天內容。 如果你得到太多,你可以嘗試專門查看org.apache.catalina.core.StandardContext 這可能不會比你已經記錄的更多,但它可能會告訴你一些事情。

在那之后,如果有這樣的動機,並且它繼續,我建議你自己構建Tomcat,並插入一些堆棧跟蹤轉儲。

例如,在org.apache.coyote.AbstractProtcol ,您可以添加:

Exception e = new Exception("Shut down trace");
getLog().info("Shutting down protocol", e);

stop()方法。

這將為您提供堅實的堆棧跟蹤,以便從中學習。 Tomcat並不是一個令人討厭的事件風暴,只是隨機消息四處飄盪。 關閉是非常同步的。 因此,該堆棧跟蹤將為您提供關於誰開始參加聚會的堅實領導。 然后你可以從那里看看它是如何發生的。

Tomcat中有很多接口和抽象,但實際上只有少數幾個實現,所以它並不是難以理解的。 吸煙堆棧的痕跡將極大地幫助將其固定下來。

你的Tomcat是如何開始的? 如果存在父進程,則發送給父進程的信號可能是干凈關閉的原因。

在v7.0.55之前的Tomcat版本中有一個已知的(並且已修復的bug):

https://bz.apache.org/bugzilla/show_bug.cgi?id=56684

這個帖子非常好讀,但我可以為你總結一下。 啟動Tomcat時,會出現等待shutdown命令的等待狀態。 這是正常的,但這些版本中的錯誤是這個等待大約50天的隱式超時。 當等待狀態超時時,Tomcat將關閉。

因此,有些奇怪的事情發生在Tomcat和NO,你並不瘋狂。 這種情況發生在SOLR集群中,在我發現此錯誤並通過升級修復之前,我維護了一年多。 沒有人注意到,因為崩潰需要很長時間才能完成所有這一切,因此很容易找到根本原因。 最簡單的事情就是重新啟動Tomcat並忘記它曾經發生過。

我希望這個答案可以幫到你。 我看到你正在運行一個有這個bug的版本。

祝好運!

DC / OS中的一個案例

最近我們發生了類似事件。 我們的tomcat作為DC/OS環境中的服務在docker中運行。 stderr剛剛說tomcat被殺了,tomcat的任何日志文件都沒有有用的痕跡。

事實證明,原因很簡單,我們沒有為服務分配足夠的內存。 這里有更多調試建議,但我們使用的關鍵技術是檢查內核日志:

# journalctl -f _TRANSPORT=kernel
...
Mar 29 15:09:09 host-17 kernel: Memory cgroup out of memory: Kill process 7935 (java) score 1021 or sacrifice child
Mar 29 15:09:09 host-17 kernel: Killed process 7906 (java) total-vm:11583840kB, anon-rss:1032860kB, file-rss:30924kB, shmem-rss:0kB
...

一旦我們發現了,我們增加了DC / OS中服務的內存分配,問題就解決了。

你的Tomcat是如何開始的? 如果存在父進程,則發送給父進程的信號可能是干凈關閉的原因。 我建議在start_script.sh添加set -m選項。

我在 Jasperserver 和包含的 apache-tomcat 上發生過這種情況。 設置export USE_NOHUP=truesetenv.sh固定它。

暫無
暫無

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

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