Tomcat

Tomcat CPU 和 GC 瘋了

  • April 4, 2015

我們的 Tomcat 7 安裝存在一些重大問題。它曾經執行良好一年多,但現在 CPU 主要在 400% - 700%(8 核機器),在日誌中我看到了這些音調:

2015-04-01T23:05:13.046+0200: 5177.229: [GC2015-04-01T23:05:13.046+0200:
5177.229: [ParNew: 1398632K->345K(1747648K), 0.0062240 secs]
3439622K->2041335K(5941952K) icms_dc=0 , 0.0063310 secs] [Times: user=0.04
sys=0.00, real=0.00 secs]

我的 Tomcat 啟動設置(在 setenv.sh 中)是:

CATALINA_OPTS="$CATALINA_OPTS -server -Xms6G -Xmx6G -XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode -XX:NewRatio=2 -XX:SurvivorRatio=4
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
-Djava.awt.headless=true
-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true
-Dmail.mime.decodeparameters=true -Djava.security.egd=file:/dev/./urandom"

這種行為通常是機器執行一個小時左右,我看到它消耗記憶體,然後它開始嘗試 GC,我每秒都會收到這些日誌條目。

我嘗試了不同的 GC 設置,但沒有成功。由於最近才發生這種情況,我想知道這可能是什麼原因,或者是否有人在這裡有解決方案?

我的伺服器有 32GB RAM,帶有 Ubuntu LTS 14.04.2 和 Oracle Java 7。

您打開了 GC 日誌記錄,看起來 GC 執行良好。

[ParNew: 1398632K->345K(1747648K), 0.0062240 secs]

表示在不到 1/100 秒的時間內清理了大約 1.2 GB 的新對象。如果這種情況每秒發生一次,則應用程序正在創建許多短期對象。檢查時間戳,看看這種情況發生的頻率。我通常的目標是幾秒鐘(新一代 GC 週期之間的 10 或更多。您沒有提供足夠的數據來進行大量分析。並發 GC 週期每隔一小時左右發生一次是很常見的。這些有一組不同的記錄消息。

為 GC 數據指定單獨的日誌文件通常很有幫助。這使得審查更容易。您可以指定此日誌在達到一定大小後進行輪換。嘗試這些選項-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=100M,如果您沒有單獨的日誌,請添加-Xloggc:logs/gc.log.

有了這麼大的新一代,並發 GC 可能需要很長時間才能執行。添加-XX:+ScavengeBeforeFullGC將導致在開始時清理新的一代,並應改進 GC 調整。

查看有關垃圾收集的文件,以更好地了解正在發生的事情。

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