У меня есть (в настоящее время последний) jdk 1.6.0.18 катастрофических отказа при работе веб-приложения (в настоящее время последний) кот 6.0.24 неожиданно после 4 - 24 часов 4 часа к 8 дням стресс-тестирования (30 потоков, поражающих приложение на уровне 6 миллиметров. просмотры страниц/день). Это находится на RHEL 5.2 (Tikanga).
Отчет о катастрофическом отказе по http://pastebin.com/f639a6cf1, и последовательные части катастрофического отказа:
JVM работает со следующими опциями:
CATALINA_OPTS="-server -Xms512m -Xmx1024m -Djava.awt.headless=true"
Я также тестировал память на аппаратные проблемы с помощью http://memtest.org/ в течение 48 часов (14 передач целой памяти) без любой ошибки.
Я включил -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
для осмотра для любых тенденций GC или исчерпания пространства, но там нет ничего подозрительного. GC и полный GC происходят в предикабельных интервалах, почти всегда освобождая те же мощности объема памяти.
Мое приложение, непосредственно, не использует собственного кода.
Какие-либо идеи того, где я должен посмотреть затем?
Редактирование - больше информации:
1) Нет никакого клиента vm в этом JDK:
[foo@localhost ~]$ java -version -server
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
[foo@localhost ~]$ java -version -client
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
2) Изменение O/S не возможно.
3) Я не хочу заменять переменные стресс-теста JMeter, так как это могло скрыть проблему. Так как у меня есть вариант использования (текущий сценарий стресс-теста), который разрушает JVM, я хотел бы зафиксировать катастрофический отказ и не изменить тест.
4) Я сделал статический анализ своего приложения, но ничто серьезное не прибыло.
5) Память не растет со временем. Использование памяти уравновешивается очень быстро (после того, как запуск) в очень устойчивой тенденции, которая не кажется подозрительной.
6)/var/log/messages не содержит полезной информации прежде или во время катастрофического отказа
Подробнее: Забыл упоминать, что был апач (2.2.14) кот противостояния с помощью mod_jk 1.2.28. Прямо сейчас я запускаю тест без апача на всякий случай, катастрофический отказ JVM касается mod_jk собственного кода, который соединяется с JVM (коннектор кота).
После этого (если JVM отказывает снова) я попытаюсь удалить некоторые компоненты из своего приложения (кэширование, lucene, кварц) и позже попытаюсь использовать причал. Так как катастрофический отказ в настоящее время происходит в любое время между 4 часами к 8 дням, может потребоваться много времени для обнаружения то, что продолжается.
Есть ли у вас вывод компилятора? то есть PrintCompilation
(и, если вы чувствуете себя особенно смелым, LogCompilation).
Я отлаживал подобный случай в этой части, наблюдая, что делает компилятор, и, в конце концов (это заняло много времени, пока не загорелась лампочка), я понял, что мой сбой был вызван компиляцией определенного метода в драйвер oracle jdbc.
В основном я бы сделал следующее:
Если есть является заметным шаблоном, тогда используйте .hotspot_compiler (или .hotspotrc), чтобы он прекратил компилировать вызывающие ошибку методы, повторите тест и посмотрите, не взорвется ли он. Очевидно, в вашем случае, боюсь, теоретически этот процесс может занять месяцы.
некоторые ссылки
Другое, что я бы сделал систематически изменять алгоритм gc, который вы используете и , проверять время сбоя по активности gc (например, коррелирует ли он с молодым или старым gc, как насчет TLAB?). Ваш дамп указывает на то, что вы используете параллельную очистку, поэтому попробуйте
, если он не повторяется с различными алгоритмами GC, тогда вы знаете, что дело в этом (и у вас нет исправления, кроме как изменить алгоритм GC и / или вернуться через старые JVM, пока вы не найдете версию этого алгоритма, которая не работает).
Несколько идей:
Вы пробовали другое оборудование? Похоже, вы используете 64-битную архитектуру. По моему собственному опыту, 32-разрядная версия работает быстрее и стабильнее. Возможно, где-то тоже есть проблема с оборудованием. Время «от 4 до 24 часов» довольно распространено, чтобы быть просто проблемой программного обеспечения. Хотя вы говорите, что в системном журнале нет ошибок, я могу уйти. Тем не менее думаю, что стоит попробовать.
Попробуйте переключить контейнер сервлетов с Tomcat на Jetty http://jetty.codehaus.org/jetty/ .
Если бы я был на вашем месте, я бы сделал следующее:
Сообщите нам, как это было решено!
Можно ли вместо этого перейти на 32-битную JVM? Я считаю, что это наиболее зрелое предложение от Sun.
Увеличивается ли объем вашей памяти со временем? Если это так, я предлагаю снизить пределы памяти, чтобы увидеть, не дает ли система более частых сбоев при исчерпании памяти.
Сможете ли вы воспроизвести проблему быстрее, если:
Одна из основных стратегий, которые я использовал, - определить, какой вариант использования вызывает проблему. Это может быть общая проблема или конкретный вариант использования. Попробуйте зарегистрировать начало и остановку вариантов использования, чтобы узнать, сможете ли вы определить, какие варианты использования с большей вероятностью вызовут проблему. Если вы разделите свои варианты использования пополам, посмотрите, какая из них не работает быстрее всего. Это может быть более частой причиной сбоя. Естественно, выполнение нескольких испытаний каждой конфигурации повысит точность ваших измерений.
Известно, что я либо менял сервер, чтобы выполнять небольшую работу, либо зацикливался на работе, которую выполняет сервер. Один заставляет код вашего приложения работать намного сложнее, другой заставляет веб-сервер и сервер приложений работать намного тяжелее.
Удачи, Джейкоб