Мы уже давно отлаживаем эту проблему с сервером JBoss. Примерно после 10 часов работы сервер переходит в 100% -ную панику ЦП и просто останавливается. В течение этого времени вы не можете запускать новые программы, поэтому вы даже не можете kill -quit
получить трассировку стека. Эти высокие 100% загрузки процессора SYS длятся 10-20 секунд и повторяются каждые несколько минут.
Мы работали над этим довольно долго. Мы подозреваем, что это как-то связано с GC, но не можем подтвердить это меньшей программой. Мы работаем на 32-битном i386, RHEL5 и Java 1.5.0_10, используя -client
и ParNew GC
.
Вот что мы уже пробовали:
Мы ограничили привязку ЦП, чтобы мы могли реально использовать сервер при высокой нагрузке. С strace
мы видим бесконечный цикл SIGSEGV
и затем возвращаем sig.
Мы попытались воспроизвести это с помощью программы на Java. Это правда, что SYS CPU% поднимается высоко с WeakHashMap
или при доступе к нулевым указателям. Проблема заключалась в том, что fillStackTrace
занимал много пользовательского процессора%, и поэтому мы никогда не достигали 100% SYS CPU.
Мы знаем, что после 10 часов стресса, GC сходит с ума, и полный GC иногда занимает 5 секунд. Поэтому мы предполагаем, что это как-то связано с памятью.
jstack
в течение этого периода показывал все потоки как заблокированные. pstack
в течение этого времени время от времени показывал трассировку стека MarkSweep, поэтому мы не можем быть уверены в этом. Отправка SIGQUIT
ничего не дала: Java сбросила трассировку стека ПОСЛЕ окончания периода загрузки SYS%.
Сейчас мы пытаемся воспроизвести эту проблему с помощью небольшого фрагмента кода, чтобы мы могли спросить Sun.
Если вы знаете, что является причиной этого, пожалуйста, дайте нам знать. Мы открыты для идей и не имеем понятия, любая идея приветствуется:)
Спасибо за ваше время.