Отладка Java-кода на AIX: Сбор данных для отладки зависаний, проблем с производительностью и большой загруженностью процессоров

В этой статье даются инструкции по поиску ошибок в коде Java™ для операционной системы IBM® AIX®. Представлены короткие, простые и полные инструкции по сбору данных для отладки случаев зависания, медленного реагирования или зацикливания в Java-приложениях, работающих на AIX. Эти инструкции помогут быстро собрать правильные данные и завершить требуемые шаги перед обращением за поддержкой в IBM. Эта статья не дает информации для анализа собранных данных, не дает она также и рекомендаций по операционной системе или приложениям для решения проблем. Эта статья предоставлена командой технической поддержки по AIX и Java для UNIX и других систем на серверах IBM eServer, расположенной в Остине, штат Техас.

Роджер Лейеки, экс-руководитель команды поддержки по Java для UNIX и других систем, IBM

Роджер Лейеки (Roger Leuckie) является лидером команды технической поддержки по Java для UNIX и других систем в Остине, штат Техас. С ним можно связаться по адресу *rog@us.ibm.com.



Даун Паттерсон, бывший член команды ISV and UNIX Technical Support for Java, IBM

Даун Паттерсон – бывший член команды ISV и команды технической поддержки Java для UNIX в Остине, Техас. С ней можно связаться с ней по адресу *dpatter@us.ibm.com.



Раджев Паланки, cотрудник отдела технической поддержки по Java третьего уровня, IBM

Раджев Паланки предоставляет техническую Java-поддержку третьего уровня в Индии. С ним можно связаться по адресу *rpalanki@in.ibm.com.

*Мы просим вас не обращаться к автору по вопросам, связанным напрямую с техническими проблемами, которые у вас возникают. Вместо этого направьте заявку, позвонив по 1-800-IBMSERV.



31.03.2009

Важное замечание

Эта статья ориентирована на клиентов. Информация в этой статье дается "как есть", без гарантии или поддержки. Содержание этой статьи будет периодически обновляться по мере возможности.

При необходимости можно получить подробную информацию о поддерживаемой документации и инструментах, используя следующие ссылки:


Получение нужных результатов

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 создавала полные файлы дампа, нужно сделать следующее:

  1. Снять ограничения на пользовательские процессы, выполнив команду от имени пользователя 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-приложения нужно сделать проверку изменений с помощью следующей команды:

    ulimit -a

  2. Разрешить системе делать полные дампы с помощью следующей команды, выполняемой от имени пользователя root:
    chdev -l sys0 -a fullcore=true

    Это изменение не требует перезагрузки системы. Если есть навыки работы с утилитой SMIT, эту настройку можно изменить с помощью команды smitty chgsys, а затем нужно установить значение Enable full CORE dumps равным true.

  3. Убедиться, что в текущем рабочем каталоге достаточно дискового пространства для записи файла дампа. С помощью следующей команды проверить свободное место на файловой системе:
    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

  4. Проверить владельца каталога и файла, а также права доступа для файла дампа, с помощью команды:
    aclget directory_or_file

    чтобы проверить, что пользователь, запустивший приложение, имеет права на запись в каталог назначения. Если есть какие-либо сомнения, нужно выполнить следующую команду от имени пользователя, запустившего приложение:
    touch directory/core

    С помощью команд chmod и chown можно изменить, соответственно, владельца файла или права доступа, или с помощью команды smitty user изменить параметры учетной записи пользователя. Изменения, сделанные в учетной записи пользователя, требуют выхода и повторного входа под именем этого пользователя.

  5. Убедиться, что имеется достаточно места на диске для сохранения файла дампа. Дамп может быть такого же размера, как процесс в памяти. Приближенную оценку размера файла дампа можно получить с помощью поля RSS (размер процесса) в выходных данных команды ps.
         ps avwwg java_pid

    Если требуется дополнительное место, нужно освободить его, удалив ненужные или старые файлы, или увеличить размер целевой файловой системы.

  6. Для сбора информации используется набор команд или утилит 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 )

    Чтобы убедиться, что все наборы файлов правильно установлены, нужно запустить команду:

    lslpp -l fileset_name

    Отсутствующие наборы файлов следует установить с установочного диска AIX, а затем обновить до последней версии с помощью Fix Central.


Отключение обработки сигналов Java

Как говорилось в разделе Сравнение файла Javacore и дампа AIX, файлы Javacore не всегда являются лучшим средством для отладки зависших процессов. Двоичный файл дампа AIX может дать больше полезной информации. Чтобы получить хороший файл дампа AIX, JVM должна быть настроена так, чтобы она не создавала файл Javacore, когда она получает сигнал, отправленный процессу. До запуска приложения в среде, где оно работает, должны быть сделаны следующие изменения.

В ситуациях, когда приложение запускается другим процессом, например, Websphere, настройка этой среды может повлиять на все Java-процессы. В этом случае нужно посмотреть в документации этого приложения, как сделать специфические для него настройки среды.

Нужно установить переменную окружения DISABLE_JAVADUMP с помощью команды:

export DISABLE_JAVADUMP=true

Если запустить команду:

java –fullversion


и дата сборки, выводимая в конце, окажется раньше января 2003 г. (например, caXXX-2002xxxx), необходимо еще установить и переменную IBM_NOSIGHANDLER. Например:

export DISABLE_JAVADUMP=true 
export IBM_NOSIGHANDLER=true

Для всех других сборок не нужно включать переменную IBM_NOSIGHANDLER, если об этом нет явных указаний со стороны команды поддержки, так как это может привести к сбору неточных данных.

Чтобы это изменение вступило в силу, нужно перезапустить приложение. Это предотвратит создание файлов Javacore и файлов дампа динамической памяти при выполнении команды kill -3 или при получении любого другого сигнала.


Сбор данных

Когда возникает проблемная ситуация, нужно собрать как можно больше информации, которая либо поможет понять причину проблемы, либо даст ключ к поиску причины. Проблемой может быть операционная система (ядро/библиотека), JVM (или JIT), другой платформенно-зависимый код или код Java-приложения. В этом разделе приводятся команды, которые собирают данные из каждой области. Большинство перечисленных команд должны выполняться от имени пользователя root.

Следующие команды используются для получения снимка базовых настроек операционной системы и для сбора трассировочной информации. В отличие от файла дампа AIX, дающего единый снимок, файлы трассировки обеспечивают историческую информацию, которая может показывать последовательность событий.

  1. Когда возникает проблема, необходимо выполнять следующие команды в перечисленном порядке с небольшой задержкой между ними. Если ручной запуск этих команд приведет к задержкам между их выполнением, рекомендуется сохранить команды в сценарии оболочки, а затем запустить этот сценарий, когда возникнет проблема.
    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.

  2. Нужно упаковать выходные файлы с помощью следующих команд:
    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, а не использовать второй метод, состоящий в применении сценарии от команды поддержки. Использование этого метода потребует меньшего дискового пространства, чем описанный выше метод.
  3. Существуют дополнительные данные, которые, если их собрать, помогут команде поддержки лучше понять ситуацию.
    1. В случае использования AIX 5, при возникновении проблемы необходимо запустить утилиту truss вскоре после запуска процесса:
      truss -eafo truss.out -p java_pid

      или
      truss -eafo truss.out java options ...
    2. Если используются новые версии 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:

  1. С помощью 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 и т.д.

  2. Каждый файл, отправляемый на тестовый сервер 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
  3. Только после того как данные отправлены, следует обращаться в службу поддержки IBM с помощью электронной почты или позвонив на "горячую линию" поддержки IBM.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=379555
ArticleTitle=Отладка Java-кода на AIX: Сбор данных для отладки зависаний, проблем с производительностью и большой загруженностью процессоров
publish-date=03312009