Нужна помощь с производительностью Java ProcessBuilder под Solaris

Мой вопрос: есть ли у JVM какой-то ресурс, связанный с потоками или процессами, который может привести к скачку производительности ProcessBuilder после месяца или более нормального использования? Использование java 6 update 21 для всех приложений.

За последние несколько месяцев мы заметили, что один сервер в нашем центре обработки данных (Sparc M4000 под управлением Solaris 10) может без проблем работать около 6-8 недель. Однако быстро производительность приложения, использующего класс ProcessBuilder для запуска скриптов, резко падает, так как ProcessBuilder.start иногда требует более минуты для возврата. После перезагрузки и в течение нескольких недель нормальное время возврата составляет от 10 до 100 миллисекунд.

Я написал отдельное небольшое приложение, которое создает 5 потоков, и каждый поток запускает команду «ls» с использованием ProcessBuilder 10 раз последовательно, затем я собираю статистику, чтобы отслеживать исходную проблему. Это приложение закрывается после каждого запуска и запускается из cron только один раз в час. Обычно это занимает всего секунду или две.

Прошлой ночью время ProcessBuilder снова увеличилось до более чем минуты для каждого вызова ProcessBuilder.start после 45 дней безотказной работы и нормального поведения.

top показывает отсутствие памяти или процессора. Я попытался сделать jstack в тестовом приложении, но получил ошибку «Не удается создать агент thread_db».

Любые идеи?


person Tim Russell    schedule 27.01.2011    source источник
comment
Я предполагаю, что вы цепляетесь за что-то и заставляете GC тяжело работать. У вас есть журналы verbosegc?   -  person Amir Afghani    schedule 27.01.2011
comment
Можете ли вы сказать, является ли прогресс линейным между каждым ProcessBuilder?   -  person John Vint    schedule 27.01.2011
comment
Вы оставляете зомби-процессы? Этого не должно происходить, но стоит проверить, не висят ли в системе тысячи процессов-зомби.   -  person Jim Garrison    schedule 27.01.2011
comment
Почему бы вам не запланировать возврат приложения раз в месяц?   -  person Romain Hippeau    schedule 28.01.2011
comment
Может ли это быть связано с этим отчетом об ошибке bugs.sun.com/view_bug.do?bug_id= 5049299 ?   -  person Jörn Horstmann    schedule 28.01.2011
comment
Проблема, по-видимому, не связана напрямую с количеством вызовов ProcessBuilder.start — вполне возможно, что проблема заключается в том, что мы запускаем много потоков (гораздо больше в производстве, чем в разработке), и все они выполнение вызовов ProcessBuilder. В процессе разработки количество потоков намного меньше, и приложение работает в течение нескольких месяцев между сбоями. После прочтения всех замечательных предложений, представленных здесь, я думаю, что, наконец, смогу воспроизвести проблему в среде разработки.   -  person Tim Russell    schedule 04.02.2011


Ответы (1)


У нас была аналогичная проблема с нашим приложением, которое работает в Linux. В коде Linux JVM используется разветвление, что означает, что адресное пространство отображается и копируется каждый раз, когда вы выполняете. Мы выполняли множество небольших недолговечных процессов. Похоже, основное отличие от вашего приложения заключается в том, что у нас была относительно большая куча (около 240 ГБ), поэтому я уверен, что это оказало влияние. В итоге мы реализовали собственный код порождения с использованием JNI и posix spawn. Вот ссылка на вопрос/ответ: Замедление создания процесса в java

person babernathy    schedule 04.02.2011