Я пытаюсь отладить JBoss из-за проблемы с памятью.Когда JBoss запускается и работает какое-то время, кажется, что он использует память в соответствии с конфигурацией запуска.Однако кажется, что когда предпринимаются какие-то неизвестные действия пользователя (или размер файла журнала увеличивается до определенного размера) с использованием единственного веб-приложения, которое обслуживает JBoss, объем памяти резко увеличивается, а JBoss зависает.Когда JBoss зависает, трудно остановить процесс или что-либо сделать из-за нехватки памяти.
Когда процесс окончательно завершается с помощью аргумента -9 и сервер перезапускается, файл журнала очень мал и содержит только выходные данные при запуске недавно запущенного процесса, а не информацию о том, почему объем памяти увеличилсятак много.Вот почему так сложно отлаживать: server.log не содержит информации о прерванном процессе.Размер журнала увеличивается до 2 ГБ, а размер файла журнала для нового процесса составляет всего около 300 КБ, хотя при нормальных условиях памяти он растет должным образом.
Это информация о конфигурации JBoss:JBoss (MX MicroKernel) 4.0.3JDK 1.6.0 обновление 22PermSize = 512mMaxPermSize = 512mXms = 1024MXmx = 6144mЭто основная информация о системе:Операционная система: CentOS Linux 5.5Ядро и процессор: Linux 2.6.18-194.26.1.el5 на x86_64Информация о процессоре: Intel (R) Xeon (R) CPU E5420 @ 2,50 ГГц, 8 ядерЭто хороший пример информации о системе в обычных условиях предварительного замораживания через несколько минут после запуска службы jboss:Запущенные процессы: 183Средняя загрузка процессора: 0,16 (1 мин) 0,06 (5 мин) 0,09 (15 мин)Загрузка процессора: 0% пользователь, 0% ядро, 1% ввода-вывода, 99% простояРеальная память: 17,38 ГБ, 2,46 ГБВиртуальная память: всего 19,59 ГБ, использовано 0 байтМестное дисковое пространство: всего 113,37 ГБ, использовано 11,89 ГБКогда JBoss зависает, системная информация выглядит так:Запущенные процессы: 225Средняя загрузка процессора: 4,66 (1 мин), 1,84 (5 мин), 0,93 (15 мин).Загрузка процессора: 0% пользователь, 12% ядро, 73% ввода-вывода, 15% простояРеальная память: 17,38 ГБ, 17,18 ГБ использованоВиртуальная память: всего 19,59 ГБ, 706,29 МБ использованоМестное дисковое пространство: всего 113,37 ГБ, использовано 11,89 ГБ
================================================================
ОБНОВЛЕНИЕ К ЭТОМУ ВОПРОСУ ДОБАВЛЕНО НИЖЕ
Большое спасибо за ваши комментарии.Мы публикуем обновление этого вопроса, которое, скорее всего, будет полезно.
В 3 других случаях проблемы с памятью использование утилиты unix top указывает на то, что процесс JBoss - это процесс, который потребляет всю память.Когда проблема возникает, кажется, это происходит очень быстро.Например, после того, как JBoss в течение некоторого времени работает нормально (например, несколько дней), в какой-то момент пользователи предпринимают определенные таинственные действия, после которых может потребоваться 1-3 минуты для увеличения потребления памяти до уровня, который вызывает значительное снижение производительностии еще 5-10 минут для того, чтобы это ухудшение стало серьезным (например, трудно выполнить простые команды bash через ssh).Конечно, этот шаблон немного различается в зависимости от того, что пользователи делают в веб-приложении.
Например, при сортировке по памяти в одном случае процесс JBoss имеет следующую статистику (обратите внимание, чтореальная память - 17,38 ГБ, а JBoss - всего 6 ГБ):VIRT (общая виртуальная память): 23,1 гRES (резидентный размер набора): 15 г% ЦП: 111,3%% MEM: 97,6%
В этом же примере через 9 минут процесс JBoss имеет следующую статистику:VIRT (общая виртуальная память): 39,1 гRES (резидентный размер набора): 17 г% ЦП: 415,6%% MEM: 98,4%
После завершения процесса JBoss с помощью сигнала SIGKILL (-9) новый процесс JBoss имеет статистику, подобную следующей:VIRT (общая виртуальная память): 7147 мRES (резидентный размер набора): 1,3 г% ЦП: 11,6%% MEM: 7,3%
Теперь, когда мы знаем, что процесс JBoss потребляет всю память, мы хотим выяснить, куда он движется.Мы пробовали jmap с помощью команды, такой как jmap -dump: file = / home / dump.txt 16054 , однако это, кажется, делает сервер намного менее отзывчивым, и через некоторое время кажется, что ничего не происходит (например, подсказкане возвращается).Мы предполагаем, что так мало памяти доступно и куча настолько велика, что-то зависает.
Кроме того, мы устанавливаем параметры JVM -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath = / path / to / dumps при запуске JVM, но, кажется, ничего не записывается в путь при возникновении проблемы с памятью.
Эти другие варианты были предложены:[1] используйте pmap для составления списка адресного пространства процесса и поиска больших кусков (особенно больших кусков, имеющих имя [anon])[2] отправлять SIGQUIT (kill -QUIT) процессу несколько раз подряд и искать общие следы стека[3] используйте jstack для получения дампа потока с помощью команды, такой как jstack> tdump.out [4] возитесь с JBoss Management Tools / Console, входящим в комплект JBoss, и смотрите, какие объекты остаются, когда объект начинает поглощать память.[5] исследовать Nagios как еще одно решение для мониторинга
Вот несколько дополнительных вопросов:
* Из приведенной выше информации в отчете есть какие-либо новые идеи или мысли по поводу проблемы?* Для вышеуказанных опций 1-5, которые наиболее вероятно будут работать в условиях крайне низкого объема памяти, которые создает проблема?* Для указанных выше вариантов 1-5, которые наиболее вероятно будут работать в течение очень короткого периода времени, который проблема позволяет диагностировать (например, 1-3 минуты)?* Есть ли способ автоматически записать в текстовый файл отметку времени, когда использование памяти конкретным процессом достигает нескольких определенных процентных пороговых значений, чтобы эту отметку времени можно было использовать при просмотре файлов журнала JBoss?* Есть ли способ автоматически отправлять электронное письмо с отметкой времени, когда использование памяти определенным процессом достигает нескольких определенных процентных порогов, чтобы мы могли использовать его для более целенаправленного мониторинга?