Назад | Перейти на главную страницу

ЦП и сборщик мусора Tomcat сходят с ума

Возникли серьезные проблемы с нашей установкой Tomcat 7. Раньше он работал нормально более года, но теперь процессор в основном на 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 и не добился успеха. Поскольку это произошло недавно, мне интересно, что может быть причиной этого или есть ли здесь решение?

На моем сервере 32 ГБ ОЗУ с Ubuntu LTS 14.04.2 и Oracle Java 7.

У вас включено ведение журнала GC, и похоже, что GC работает нормально.

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

Указывает, что около 1,2 ГБ новых объектов было очищено менее чем за 1/100 секунды. Если это происходит раз в секунду, приложение создает много недолговечных объектов. Проверьте отметки времени и посмотрите, как часто это происходит. Обычно я стремлюсь к нескольким секундам (10 или более между циклами GC нового поколения. Вы не предоставили достаточно данных для выполнения большей части анализа. Параллельные циклы GC обычно происходят каждый час или около того. У них другой набор сообщения журнала.

Часто бывает полезно указать отдельный файл журнала для данных GC. Это упрощает просмотр. Вы можете указать, что этот журнал будет вращаться после достижения определенного размера. Попробуйте эти варианты -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=100M и если у вас нет отдельного журнала, добавьте -Xloggc:logs/gc.log.

С таким большим новым поколением одновременная работа сборщиков мусора может занять много времени. Добавление -XX:+ScavengeBeforeFullGC приведет к очистке нового поколения в начале и улучшит настройку ГХ.

Изучите документацию по вывоз мусора чтобы лучше понять, что происходит.