 | Уровень сложности: простой Роджер Лейеки, экс-руководитель команды поддержки по Java для UNIX и других систем, IBM Даун Паттерсон, бывший член команды ISV and UNIX Technical Support for Java, IBM Раджев Паланки, cотрудник отдела технической поддержки по Java третьего уровня, IBM
31.03.2009 В этой статье даются инструкции по поиску ошибок в коде Java™ для операционной системы IBM® AIX®. Представлены короткие, простые и полные инструкции по сбору данных для отладки случаев зависания, медленного реагирования или зацикливания в Java-приложениях, работающих на AIX. Эти инструкции помогут быстро собрать правильные данные и завершить требуемые шаги перед обращением за поддержкой в IBM. Эта статья не дает информации для анализа собранных данных, не дает она также и рекомендаций по операционной системе или приложениям для решения проблем. Эта статья предоставлена командой технической поддержки по AIX и Java для UNIX и других систем на серверах IBM eServer, расположенной в Остине, штат Техас.
Важное замечание
Эта статья ориентирована на клиентов. Информация в этой статье дается "как есть", без гарантии или поддержки. Содержание этой статьи будет периодически обновляться по мере возможности.
При необходимости можно получить подробную информацию о поддерживаемой документации и инструментах, используя следующие ссылки:
Получение нужных результатов
JVM (виртуальная Java-машина) может считаться зависшей, если процесс еще присутствует, но не отвечает, или занимает значительную часть процессорного времени. Отсутствие реагирования может быть результатом:
- зависания,
- таймаута,
- блокировки ресурса,
- потоков в состоянии ожидания,
- захвата процессора потоком, перегруженности процессора, зацикливания,
- нехватки памяти
со стороны JVM (из-за платформенно-зависимого кода JVM, GC, JIT, AIX, другого платформенно-зависимого кода и Java-приложения).
Для сбора информации может потребоваться воспроизвести ситуацию несколько раз, чтобы собрать и исключить ненужную информацию для идентификации и решения проблемы. Иногда может быть достаточно файла Javacore; иногда может понадобиться собрать трассировки ядра, файлы дампа AIX и другую информацию. Если проблема не может быть воспроизведена в тестовой среде или в среде разработки, то может потребоваться собирать данные на рабочей системе. Если данные не удается собрать на системе, на которой воспроизводится проблема, команда поддержки может не суметь решить проблему. Мы понимаем, что сбор данных на рабочей системе может привести к простою приложения, что может повлиять на доход, стабильность бизнеса и качество обслуживания клиентов вашей компании. Команда поддержки приложит все усилия к тому, чтобы свести к минимуму число шагов сбора информации и постарается решить проблему как можно быстрее.
Замечание об обслуживании
Важная информация о поддержке Java на AIX есть на странице IBM developer kits for AIX, Java technology edition. Нужно обращать внимание на даты конца обслуживания на главной странице, откуда осуществляются загрузки, а также внимательно читать условия поддержки Java на AIX и приводимые ниже таблицы со ссылками для загрузок.
Сравнение файла Javacore и дампа AIX
Файл Javacore является текстовым представлением Java-приложения в какой-то момент времени. Файл Javacore создается Java-процессом в случаях, когда пользователь запускает команду kill -3 для Java-процесса и когда процесс прерывается или заканчивается из-за внутренней исключительной ситуации. Подробную информацию по файлу Javacore можно найти на странице IBM JVM Diagnostic Guides.
В некоторых ситуациях наличие набора файлов Javacore, созданных одним и тем же процессом, может быть полезным для понимания работы приложения. Когда процесс зависает или достигает нестабильного состояния, он может быть не в состоянии создать файл Javacore.
Дамп памяти AIX является двоичным представлением процесса в памяти в некоторый момент времени. Из этого файла можно получить ту же информацию, что есть в Javacore, плюс дополнительную информацию о процессе, отсутствующую в файле Javacore. По этой причине команда поддержки в большинстве случаев запрашивает файл дампа AIX, а не файл Javacore.
В некоторых ситуациях требуется собрать и файл дампа AIX, и файл Javacore, для чего нужно воспроизвести проблему несколько раз.
Настройка операционной системы
Дамп AIX создается в текущем рабочем каталоге, из которого было запущено Java-приложение. Этот каталог может отличаться от текущего рабочего каталога командной строки, если приложение Java запущено из стартового сценария или из другого процесса. В этой статье любые упоминания о дампе относятся к файлам дампа AIX, или UNIX, или двоичному файлу дампа, а не к файлу Javacore, если не оговорено иное. Файл дампа памяти обеспечивает снимок процесса во время проблемы.
Если команды, приводимые в этой статье, незнакомы, то с их синтаксисом и дополнительной информацией можно ознакомиться на странице AIX documentation.
При выполнении команд нужно заменять текст, набранный курсивом, соответствующими значениями, в противном случае возникнут ошибки или неожиданные результаты.
Чтобы операционная система AIX создавала полные файлы дампа, нужно сделать следующее:
- Снять ограничения на пользовательские процессы, выполнив команду от имени пользователя root:
chuser fsize=-1 data=-1 core=-1 user_id_running_application |
где user_id_running_application - имя пользователя, запускающего Java-приложение. Например, chuser fsize=-1 data=-1 core=-1 root
Это сделает неограниченным размер файлов (fsize), размер файлов дампа (core) и размер памяти (data) для процессов пользователя. Эти настройки сопряжены с определенным риском, поэтому после сбора информации следует восстановить исходные значения. После того как сделаны эти изменения, нужно убрать ссылки на команду ulimit из сценария входа в систему, профиля пользователя и любых стартовых сценариев. Перед запуском приложения нужно выйти и вновь войти в систему под учетной записью пользователя. Кроме того, для любого приложения, запускающегося из /etc/inittab, может потребоваться перезагрузка системы, потому что сделанные изменения должны подействовать на процесс init. Внесение этих изменений дает возможность пользователю, для которого они сделаны, запускать процесс, который может потреблять ресурсы системы.
Перед запуском Java-приложения нужно сделать проверку изменений с помощью следующей команды:
-
Разрешить системе делать полные дампы с помощью следующей команды, выполняемой от имени пользователя root:
chdev -l sys0 -a fullcore=true |
Это изменение не требует перезагрузки системы. Если есть навыки работы с утилитой SMIT, эту настройку можно изменить с помощью команды smitty chgsys, а затем нужно установить значение Enable full CORE dumps равным true.
-
Убедиться, что в текущем рабочем каталоге достаточно дискового пространства для записи файла дампа. С помощью следующей команды проверить свободное место на файловой системе:
df -kP current_working_directory_of_application |
Файлы дампа AIX можно перенаправить в другое место, создав символическую ссылку из места, где будет создаваться файл дампа, в место, куда дамп должен быть сохранен. Чтобы сделать это, нужно создать символическую ссылку из текущего рабочего каталога, из которого запущено приложение, в дополнительный каталог, в котором должен находиться файл дампа. Этот дополнительный файл дампа может отсутствовать до запуска приложения - он будет создан автоматически. Для назначения дополнительного каталога нужно запустить следующую команду:
ln -s alternate_directory/core current_working_directory_of_application/core |
Для задания единого общесистемного каталога для дампов всех процессов можно использовать утилиту syscorepath, поставляемую с AIX v5.2 и выше. Синтаксис этой команды:
syscorepath -p alternate_directory |
-
Проверить владельца каталога и файла, а также права доступа для файла дампа, с помощью команды:
чтобы проверить, что пользователь, запустивший приложение, имеет права на запись в каталог назначения. Если есть какие-либо сомнения, нужно выполнить следующую команду от имени пользователя, запустившего приложение:
С помощью команд chmod и chown можно изменить, соответственно, владельца файла или права доступа, или с помощью команды smitty user изменить параметры учетной записи пользователя. Изменения, сделанные в учетной записи пользователя, требуют выхода и повторного входа под именем этого пользователя.
- Убедиться, что имеется достаточно места на диске для сохранения файла дампа. Дамп может быть такого же размера, как процесс в памяти. Приближенную оценку размера файла дампа можно получить с помощью поля RSS (размер процесса) в выходных данных команды
ps.
Если требуется дополнительное место, нужно освободить его, удалив ненужные или старые файлы, или увеличить размер целевой файловой системы.
-
Для сбора информации используется набор команд или утилит AIX. Перед продолжением необходимо установить следующие наборы файлов AIX:
File Fileset
----------------------------------------------------------
/usr/bin/vmstat bos.acct
/usr/bin/trace bos.sysmgt.trace
/usr/bin/gennames bos.perf.tools
/usr/bin/tprof bos.perf.tools
/usr/bin/uudecode bos.net.uucp (used by libsGrabber.sh)
/usr/bin/syscorepath bos.rte.control
/usr/sbin/snapcore bos.rte.serv_aid ( also /usr/bin/truss )
|
Чтобы убедиться, что все наборы файлов правильно установлены, нужно запустить команду:
Отсутствующие наборы файлов следует установить с установочного диска AIX, а затем обновить до последней версии с помощью Fix Central.
 |
Отключение обработки сигналов Java
Как говорилось в разделе Сравнение файла Javacore и дампа AIX, файлы Javacore не всегда являются лучшим средством для отладки зависших процессов. Двоичный файл дампа AIX может дать больше полезной информации. Чтобы получить хороший файл дампа AIX, JVM должна быть настроена так, чтобы она не создавала файл Javacore, когда она получает сигнал, отправленный процессу. До запуска приложения в среде, где оно работает, должны быть сделаны следующие изменения.
В ситуациях, когда приложение запускается другим процессом, например, Websphere, настройка этой среды может повлиять на все Java-процессы. В этом случае нужно посмотреть в документации этого приложения, как сделать специфические для него настройки среды.
Нужно установить переменную окружения DISABLE_JAVADUMP с помощью команды:
export DISABLE_JAVADUMP=true
|
Если запустить команду:
и дата сборки, выводимая в конце, окажется раньше января 2003 г. (например, caXXX-2002xxxx), необходимо еще установить и переменную IBM_NOSIGHANDLER. Например:
export DISABLE_JAVADUMP=true
export IBM_NOSIGHANDLER=true
|
Для всех других сборок не нужно включать переменную IBM_NOSIGHANDLER, если об этом нет явных указаний со стороны команды поддержки, так как это может привести к сбору неточных данных.
Чтобы это изменение вступило в силу, нужно перезапустить приложение. Это предотвратит создание файлов Javacore и файлов дампа динамической памяти при выполнении команды kill -3 или при получении любого другого сигнала.
Сбор данных
Когда возникает проблемная ситуация, нужно собрать как можно больше информации, которая либо поможет понять причину проблемы, либо даст ключ к поиску причины. Проблемой может быть операционная система (ядро/библиотека), JVM (или JIT), другой платформенно-зависимый код или код Java-приложения. В этом разделе приводятся команды, которые собирают данные из каждой области. Большинство перечисленных команд должны выполняться от имени пользователя root.
Следующие команды используются для получения снимка базовых настроек операционной системы и для сбора трассировочной информации. В отличие от файла дампа AIX, дающего единый снимок, файлы трассировки обеспечивают историческую информацию, которая может показывать последовательность событий.
- Когда возникает проблема, необходимо выполнять следующие команды в перечисленном порядке с небольшой задержкой между ними. Если ручной запуск этих команд приведет к задержкам между их выполнением, рекомендуется сохранить команды в сценарии оболочки, а затем запустить этот сценарий, когда возникнет проблема.
vmstat 1 20 > vmstat.out
trace -a -n -l -L50000000 -T25000000 -o trace.out
sleep 30
trcstop
ps -ef > ps.out
ps avwwg >> ps.out
pdump.sh java_pid (see below)
pdump.sh java_pid (see below)
pdump.sh java_pid (see below)
kill -11 java_pid
|
Чтобы собрать данные, необходимые для анализа трассировки, нужно запустить эти команды после сбора трассировочных данных:
trcnm > trcnm.out
gennames > gennames.out
gensyms > gensyms.out
(AIX v5.2 only)
cp /etc/trcfmt trcfmt.out
trcrpt -r trace.out > trcrpt.out
tprof -ske -n gennames.out -i trcrpt.out
(AIX v4.3.3 and AIX v5.1 only)
tprof -ske -r trace.out
(AIX v5.2 only)
|
Чтобы собрать информацию о системе, можно вместо этого запустить утилиту AIXsnap. Нужно запустить эти команды после сбора трассировочных данных:
errpt -a > errpt.out
lslpp -lc > lslpp.out
instfix -i > instfix.out
bootinfo -K > bootinfo.out
lsattr -El sys0 > lsattr.out
lsps -s > lsps.out
|
Необходимо загрузить утилиты libsGrabber.sh и pdump.sh.
Утилита pdump.sh является сценарием оболочки, который запускает отладчик ядра AIX kdb.
-
Нужно упаковать выходные файлы с помощью следующих команд:
tar -cf - *.out pdump.* __* | compress -c > trace-data.tar.Z
|
Для любого созданного файла дампа AIX нужно выполнять следующие команды:
-
mv core core.001
- Если использовался один из перечисленных выше методов для перенаправления файла дампа в альтернативное место, нужно выполнить эту команду для файла дампа в альтернативном каталоге, а не в символической ссылке.
- export PATH=/java_home/jre/bin:${PATH}
- И нужно заменить java_home на правильное местоположение SDK.
- which java
java –fullversion
- Если эта команда не выдает правильной версии, нужно исправить переменную PATH в предыдущем шаге и перезапустить команду. Результатом не должен быть файл оболочки Java: /java_home/bin/java.
Кроме файла дампа, командам поддержки также нужна копия исполняемого файла Java или JNI и все библиотечные (.a или .so) файлы, используемые процессом. Есть два метода сбора дополнительной информации. В первом используются команды операционной системы (считается, что все перечисленные выше наборы файлов установлены), но потребуется гораздо больше дополнительного дискового пространства, поскольку будут создаваться копии всех файлов (в том числе и файла дампа, который может быть большим).
Есть два метода сбора дополнительной информации для анализа файлов дампа; в одном используется AIX-утилита snapcore, в другом - сценарий от службы поддержки, называемый libsGrabber.sh. В настоящее время утилита snapcore не способна собирать всю требуемую информацию. В ближайшее время это ограничение будет устранено, а пока рекомендуется использовать libsGrabber.sh. Вот шаги по использованию этой утилиты:
Загрузить утилиту libsGrabber.sh .
- libsGrabber.sh core.001
- Создает core-libs.tar.Z, содержащий библиотеки и исполняемый файл.
- compress core.001
- Создает core.001.Z. Следует убедиться, что исполняемый Java-файл содержится в core-libs.tar.Z.
- uncompress -c < core-libs.tar.Z | tar -tvf -
или
- snapcore -d save_directory core.001 fullpath_executable
- Например,
snapcore -d /tmp/savedir core.001 /usr/java131/jre/bin/java. Это создаст архив (snapcore_pid.pax.Z) в каталоге /tmp/savedir. Если проблема происходит с 64-разрядной JVM, следует запускать утилиту snapcore, а не использовать второй метод, состоящий в применении сценарии от команды поддержки. Использование этого метода потребует меньшего дискового пространства, чем описанный выше метод.
- Существуют дополнительные данные, которые, если их собрать, помогут команде поддержки лучше понять ситуацию.
- В случае использования AIX 5, при возникновении проблемы необходимо запустить утилиту
truss вскоре после запуска процесса:
truss -eafo truss.out -p java_pid
|
или
truss -eafo truss.out java options ...
|
- Если используются новые версии Java 131 и 14, то нужно воспользоваться средством Java HPROF для сбора времени работы использованных методов. Поскольку это функция JVM, она предоставляет средство для сравнения JVM на разных платформах.
java -Xrunhprof:cpu=samples,monitor=y,format=a,
file=hprof_output.txt your_other_java_options
|
Это создает файл hprof_output.txt со статистической информацией.
Дополнительную документацию по использованию hprof можно найти в документации Sun по этой ссылке.
 |
Упаковка и отправка данных в IBM Support
Для упаковки и отправки данных в IBM Support:
- С помощью
tar создать архив файлов с именем xxxxx.byyy.czzz.#.tar
tar -cf xxxxx.byyy.czzz.#.tar trace-data.tar.Z core.001.Z
core-libs.tar.Z optional-files
|
или
tar -cf xxxxx.byyy.czzz.#.tar trace-data.tar.Z
snapcore_pid.pax.Z optional-files
|
где:
- xxxxx - номер PMR;
- yyy - код филиала;
- zzz - код страны;
- # - порядковый номер или дата, необходимые для гарантии уникальности каждого файла, помещаемого на тестовый сервер.
Необходимо отметить размер файла.
Перед тем как отправить файл, необходимо убедиться в правильности архивного файла и в том, что в нем содержатся следующие файлы:
- trace-data.tar.Z
- core.001.Z or core-libs.tar.Z
- snapcore_pid.pax.Z
- необязательные файлы - стандартный вывод, журналы ошибок, файлы Javacore и т.д.
- Каждый файл, отправляемый на тестовый сервер IBM, должен иметь уникальное имя. Для своевременного ответа от команды поддержки AIX важно следовать приводимым ниже инструкциям. Если возникли проблемы с соединением или отправкой данных на тестовые серверы, нужно проверить настройки межсетевого экрана и прокси-сервера в локальной сети.
ftp testcase.boulder.ibm.com
login: anonymous
password: user@host.com
> cd /aix/toibm
> bin
> put xxxxx.byyy.czzz.#.tar
> dir xxxxx.byyy.czzz.#.tar
(make sure the uploaded file size is equal to the original)
> quit
|
- Только после того как данные отправлены, следует обращаться в службу поддержки IBM с помощью электронной почты или позвонив на "горячую линию" поддержки IBM.
Ресурсы
Об авторах  | |  | Роджер Лейеки (Roger Leuckie) является лидером команды технической поддержки по Java для UNIX и других систем в Остине, штат Техас. С ним можно связаться по адресу *rog@us.ibm.com. |
 | |  | Даун Паттерсон – бывший член команды ISV и команды технической поддержки Java для UNIX в Остине, Техас. С ней можно связаться с ней по адресу *dpatter@us.ibm.com. |
 | |  | Раджев Паланки предоставляет техническую Java-поддержку третьего уровня в Индии. С ним можно связаться по адресу *rpalanki@in.ibm.com.
*Мы просим вас не обращаться к автору по вопросам, связанным напрямую с техническими проблемами, которые у вас возникают. Вместо этого направьте заявку, позвонив по 1-800-IBMSERV. |
Выскажите мнение об этой странице
|  |