Оптимизация производительности Java в AIX: Часть 1. Основы

Эта серия из пяти статей содержит общие советы и рекомендации, которые могут использоваться для повышения производительности Java™-приложений в AIX®. Рассказывается также о применимости каждого из советов. Следуя советам из этой серии статей, можно быстро оптимизировать окружение Java для конкретных приложений.

Сумит Чаула, сертифицированный IT-архитектор IBM и руководитель технической группы, Java Enablement, IBM

Самит Чаула (Sumit Chawla) руководит инициативной группой Java Enablement для IBM eServer (для AIX, Windows и Linux), а также работает консультантом в организации Independent Software Vendors по направлению серверов IBM. Самит имеет степень магистра в области вычислительной техники, обладает более чем 10-летним опытом работы в IT-индустрии, сертифицирован IBM по курсу Application Architect. Он часто пишет статьи для раздела developerWorks eServer. С ним можно связаться по адресу sumitc@us.ibm.com.



Амит Матюр, ведущий технический консультант и менеджер по реализации решений, IBM

Амит Матюр (Amit Mathur) работает в группе IBM Solutions Development, занимаясь в основном IBM ISV и возможностями/производительностью приложений на платформе IBM eServer, а также оказывая поддержку пользователям ISV. Пишет статьи и учебные пособия для developerWorks. Амит имеет более чем 14-летний опыт по поддержке разработчиков программного обеспечения и программирования на C/C++, Java, а также баз данных в UNIX и Linux. Он получил степень бакалавра технических наук в области электроники и телекомунникаций в Индии. Связаться с ним можно по адресу amitmat@us.ibm.com.



09.10.2008

Введение

Существует несколько средств настройки производительности для платформы IBM eServer pSeries, использующих ОС AIX. Реализация Java от IBM, работающая на AIX, также имеет несколько опций, большая часть которых хорошо документирована. Несмотря на это, команда технической поддержки из IBM регистрирует большое количество случаев, когда усилия, затраченные на настройку производительности, тратятся впустую из-за отсутствия связи между двумя этими наборами инструментов.

В этой серии статей рассказывается о том, как использовать вместе средства AIX и Java, чтобы увеличить производительность Java-приложений, работающих в AIX. Первая часть, "Основы", рассказывает о предпосылках для успешного проведения настройки и предоставляет обзор средств, которые способны помочь в решении этой задачи. Очень рекомендуется полностью прочесть эту статью, так как содержащиеся в ней советы помогают существенно упростить настройку производительности.

Следующие три статьи из этой серии концентрируются на специальных темах настройки производительности. Часть 2, "Жажда скорости", рассказывает об увеличении скорости выполнения и пропускной способности. В части 3, "Больше - лучше", описаны способы измерения и рассказывается, какие манипуляции с оперативной памятью могут быть полезны. В части 4, "Из чего состоит", в качестве цели для оптимизации производительности выбраны сетевая и дисковая подсистемы. Эти три статьи написаны для того чтобы упростить быстрый поиск узких мест производительности, поэтому читать эти статьи от начала до конца необязательно. В каждой из статей даются общие советы и способы, которые могут быть полезны в рассматриваемой области.

Часть 5, "Ссылки и итоги", завершает серию статей обсуждением других источников информации по данной теме.

Необходимо отметить, что в статьях рассматривается только информация, связанная с J2SE; для получения информации о специфичной для J2EE настройке лучше обратиться к документации по компонентам J2EE. При использовании приложения, связанного с Java, необходимо прочесть документацию по приложению, чтобы быть уверенным, что вносимые изменения не ограничат его функциональность.


Предисловие

Любые усилия по настройке системы должны принимать во внимание несколько тонкостей, часть из которых противоречивы по своей природе. Хотя каждая настройка уникальна, существует несколько общих шагов, которые всегда будут полезны. В этой статье содержится быстрый обзор тех шагов, которые необходимо сделать перед настройкой производительности. Если какой-то из этих шагов не был завершен до начала настройки, на это должна быть существенная причина.

Установка новейшей версии

На странице IBM developer kits for AIX, Java technology edition можно узнать список новейших доступных версий Java для AIX. Более новые версии Java содержат способы повышения производительности, которые обычно могут сыграть большую роль в общей производительности. Например, Java 1.4 имеет значительно улучшенный сборщик мусора (Garbage Collection), чем ее предшественники.

Даже если есть необходимость использовать конкретную версию Java, можно установить новейший пакет обновления Service Refresh (SR). Это самый быстрый способ получения преимуществ в функциональности и производительности. Кроме того, если наблюдаются какие-либо проблемы, необходимо установить новейший пакет обновления SR до обращения в службу поддержки. Другой пример преимуществ новейшего пакета обновления SR - это выключатели типа -Xdisableexplicitgc, который был добавлен в Java 1.3.1 после выхода официальной версии, поэтому для работы с ним нужно установить последнюю версию Java.

В этой статье рассматриваются Java 1.4 и Java 1.3.1, так как более старые версии либо уже не поддерживаются, либо перестанут поддерживаться вскоре. По той же причине в статье рассматривается AIX версии 5L (а именно AIX 5.1 и AIX 5.2), а не AIX 4.3.3 или более ранняя.

Возможно, следует обратить внимание на 64-битные версии Java, если для них есть соответствующие приложения. Эта тема выходит за рамки вопросов, рассматриваемых в данной статье; здесь обсуждаются только 32-битные версии Java. Статью по настройке 64-битных версий Java в ESDD можно ожидать в ближайшем будущем.

Устранение ошибок перед настройкой

Если существуют проблемы, связанные с падениями, утечками памяти или зависанием приложений, то не нужно пытаться проводить настройку. Этот совет включает в себя случаи, когда частично или полностью отключается компилятор Just-In-Time (JIT). Если определена переменная окружения JAVA_COMPILER или JITC_COMPILEOPT, то приложение уже может иметь потери в производительности (заметим, что можно использовать JITC_COMPILEOPT также для оптимизации производительности приложения; во второй части этот вопрос освещен более подробно). Перед началом настройки производительности должны быть устранены все проблемы либо установкой новейшего пакета обновлений Service Refresh, либо обращением к команде IBM Java Service. В Java Diagnostics Guide на IBM developer kits - diagnosis documentation представлены превосходные советы по устранению любых проблем, связанных с IBM Java.

Проверка окружения

Обычно не требуется беспокоиться о специальных установках окружения (настройка JIT, упоминавшаяся в предыдущем разделе, а также установка значения LDR_CNTRL, требующаяся для изменения размера "кучи" - это некоторые заметные исключения), так как при запуске Java окружение устанавливается автоматически. Однако если приложение использует JNI, важно создать правильное окружение для компонента JNI. SDK Guide или README, сопровождающие каждую версию Java, предоставляют список переменных, которые должны быть установлены в конкретные значения, и ошибки при определении переменных влекут за собой проблемы с производительностью и/или функциональностью.

Действительно ли Java требует настройки?

Хотя это и является хорошей идеей - получить различные советы и установить окружение Java-приложения, улучшение производительности может быть заметно только в том случае, если устранены другие узкие места производительности. Например, если Java не находится среди 5 процессов, поглощающих большую часть времени CPU, если другие процессы системы используют 100% CPU, любые изменения в Java ни к чему не приведут.


Работает ли оно быстрее?

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

Знание характеристик приложения

Перед запуском приложения необходимо понимать, какое поведение приложения ожидается. Не проводя широкой классификации, такой как "клиент-серверная технология" или "приложение с графическим интерфейсом", необходимо понимать внутреннюю работу кода, которая обеспечит достижение требуемых целей. В качестве примера можно посмотреть, какой процент времени CPU тратится при работе, но интерпретация полученного значения уникальна для каждого приложения. Необходимо иметь возможность различить "нормальное" и "аномальное" поведение, чтобы определить цель настройки.

Заметим, что нет необходимости иметь доступ к исходному коду Java-приложения, чтобы выполнить большую часть настройки, описанной в этих статьях. Это не значит, что приложение должно рассматриваться как "черный ящик". Должно ли приложение быстро отработать и завершиться или оно должно работать в течение долгого времени (например, как сервер)? Агрессивно ли потребляет оно память при загрузке или довольствуется малым объемом ОЗУ? Возвращает ли приложение много памяти в "кучу" или удерживает выделенные объекты? Ответы на эти вопросы создают основу действий по настройке.

Выбор хорошего средства для тестирования

Очень рекомендуется иметь метод оценки достигнутых результатов. Предпосылками для использования любых инструментов являются гарантия достоверности, возможность повторять и оценивать тесты, которые позволят проверить максимальный объем функциональности приложения. Необходимо помнить, что улучшение работы в одном аспекте может привести к ухудшению в других. Только хороший набор тестов позволит установить баланс между, например, производительностью при работе и потреблением памяти.

Фундамент настройки

Перед внесением изменений в систему необходимо потратить время на создание ясного и недвусмысленного метода измерения эффекта вносимых изменений. Может использоваться простая команда time или более сложная система, например, измерение времени отклика с использованием сценария имитации обращения тысячи пользователей. В любом случае рабочая нагрузка, используемая для оценки эффекта настройки производительности, должна быть достаточно разнообразна для проверки настолько большого количества сценариев, насколько это возможно. Вдобавок к любому способу внешних измерений, рекомендуется использовать инструменты сбора данных о производительности AIX (AIX Performance PMR Data Collection Tools (PerfPMR)).

PerfPMR - это средство сбора данных, используемое в AIX. PerfPMR делает снимок системы за определенный промежуток времени, отчетливо показывая, что происходит в системе в этот период времени. Вместо запуска каждого инструмента AIX по отдельности, можно просто указать PerfPMR запускать нужные средства автоматически. Так как такой метод получения снимков системы хорошо определен, можно сделать несколько снимков в различные моменты цикла настройки для отслеживания процесса оптимизации. Необходимо отметить, что в этой серии статей представлены примеры использования специальных средств, а не PerfPMR.


Средства оценки

Существует богатый набор средств для мониторинга всех аспектов работы системы AIX. В таблице 1 представлен краткий список таких средств. Эти программы могут применяться для мониторинга одного процессора или всей системы. AIX 5L Performance Tools Handbook и Understanding IBM eServer pSeries Performance and Sizing, а также ссылки на ресурсы, имеющиеся в этих документах - хорошее начало для изучения перечисленных средств.

Таблица 1. Средства системного мониторинга в AIX

CPUОперативная памятьПодсистема ввода-выводаСетевая подсистема
vmstat
iostat
ps
sar
tprof
vmstat
lsps
svmon
filemon
iostat
vmstat
lsps
filemon
lvmstat
netstat
ifconfig
tcpdump

Каждый из этих инструментов кратко описывается в последующих статьях. Существуют средства, которые не попадают ни в одну из этих категорий, о них кратко рассказывается ниже.

topas

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

Topas Monitor for host:    aix4prt              EVENTS/QUEUES    FILE/TTY
Mon Apr 16 16:16:50 2001   Interval:  2         Cswitch    5984  Readch     4864
                                                Syscall   15776  Writech   34280
Kernel   63.1   |##################          |  Reads         8  Rawin         0
User     36.8   |##########                  |  Writes     2469  Ttyout        0
Wait      0.0   |                            |  Forks         0  Igets         0
Idle      0.0   |                            |  Execs         0  Namei         4
                                                Runqueue   11.5  Dirblk        0
Network  KBPS   I-Pack  O-Pack   KB-In  KB-Out  Waitqueue   0.0
lo0     213.9   2154.2  2153.7   107.0   106.9
tr0      34.7     16.9    34.4     0.9    33.8  PAGING           MEMORY
                                                Faults     3862  Real,MB    1023
Disk    Busy%     KBPS     TPS KB-Read KB-Writ  Steals     1580  % Comp     27.0
hdisk0    0.0      0.0     0.0     0.0     0.0  PgspIn        0  % Noncomp  73.9
                                                PgspOut       0  % Client    0.5
Name         PID CPU% PgSp Owner                PageIn        0
java       16684 83.6 35.1 root                 PageOut       0  PAGING SPACE
java       12192 12.7 86.2 root                 Sios          0  Size,MB     512
lrud        1032  2.7  0.0 root                                  % Used      1.2
aixterm    19502  0.5  0.7 root                 NFS (calls/sec)  % Free     98.7
topas       6908  0.5  0.8 root                 ServerV2       0
ksh        18148  0.0  0.7 root                 ClientV2       0   Press:
gil         1806  0.0  0.0 root                 ServerV3       0   "h" for help

В левом нижнем углу экрана дается список наиболее активных процессов; в этом примере java потребляет 83.6% времени работы CPU. Справа посередине показан общий объем оперативной памяти (1 ГБ в этом примере) и файла подкачки (512 MБ), а также объем используемой памяти. Таким образом, на одном экране представлен подробный обзор того, что происходит в системе. Проанализировав эту информацию, можно выбрать область для оптимизации производительности.

trace

trace собирает последовательный поток системных событий, отмеченных временными метками. trace - это ценный инструмент для обзора работы системы и приложений. В то время как многие другие средства предоставляют высокоуровневую статистику, такую как загрузка процессора и количество операций ввода-вывода, trace помогает получить более подробную информацию о том, какие события произошли, какие процессы работали, когда произошло системное событие и как эти процессы повлияли на систему. Две утилиты, которые могут получать информацию от trace - это utld (в AIX 4) и curt (в AIX 5). Они предоставляют статистику использования CPU и активности процесса/потока. Третья утилита обработки информации trace - это splat, которая является средством анализа простых блокировок. Эта утилита используется для анализа активности блокировок в ядре AIX и расширениях ядра для простых блокировок.

nmon

nmon - это бесплатная утилита, которая дает во многом ту же информацию, что и topas, но сохраняет данные в файл в форматах Lotus 123 и Excel. Эту утилиту можно скачать по этой ссылке. Информация, собираемая nmon, включает в себя информацию о CPU, диске, сети, счетчиках ядра, оперативной памяти, статистику адаптеров и информацию о процессах, которые потребляют большую часть системных ресурсов.

Платформо-независимый мониторинг производительности Java

Интерфейс профилировки [Java Virtual Machine Profiling Interface (JVMPI)] поддерживается в реализации Java от IBM и является полезным средством для мониторинга всех аспектов производительности. Для выполнения мониторинга производительности Java можно использовать либо сторонний профилировщик, либо JVMPI. За более подробной информацией можно обратиться к описанию -Xhprof в Java Diagnostics Guide в IBM developer kits - diagnosis documentation . Можно также прочесть README/SDK Guides, представленные в IBM developer kits for AIX, Java technology edition, для получения информации о специализированном профилировании в AIX. В качестве примера можно отметить, что если не установлена переменная окружения AIXTHREAD_ENRUSG=ON, то при профилировании не будет измеряться время использования процессора потоком. Это документировано в README/SDK Guide для всех версий Java.

Возможно, наиболее общим средством мониторинга производительности Java являются журналы verbosegc. Информация о том, как анализировать журналы verbosegc, доступна в статье Fine-tuning Java garbage collection performance. Включение verbosegc не сильно влияет на работу приложений, но при этом дает хорошие возможности для анализа потерь производительности. Fine-tuning Java garbage collection performance описывает выполнение настройки производительности, основываясь на выводе в verbosegc.


Поведение Java в AIX по умолчанию

В этом разделе описываются установки по умолчанию. Эти установки могут быть изменены, и в большинстве случаев изменяются. README или SDK Guide, содержащиеся в SDK - наиболее новые руководства для этих настроек.

Java использует следующие установки окружения:

  • AIXTHREAD_SCOPE=S

    Это значение используется для гарантирования того, что каждый поток Java отображается на один отдельный поток ядра. Преимущества такого подхода заметны в нескольких примерах; хороший пример - это то, как Java выполняет динамическое логическое разбиение [Dynamic Logical Partitioning (DLPAR)]; когда новый процессор добавляется в разбиение, поток Java может выполняться на нем. Это значение обычно не должно изменяться.

  • AIXTHREAD_COND_DEBUG, AIXTHREAD_MUTEX_DEBUG and AIXTHREAD_RWLOCK_DEBUG

    Эти флаги используются для целей отладки на уровне ядра. Иногда их значения установлены в OFF. Если нет, то их отключение может привести к приросту производительности.

  • LDR_CNTRL=MAXDATA=0x80000000

    Это значение по умолчанию в Java 1.3.1, контролирующее величину кучи Java, может быть увеличено. Java 1.4 определяет настройку LDR_CNTRL исходя из запрашиваемого размера кучи. В статье Getting more memory in AIX for your Java applications детально описаны возможности манипуляций с этой переменной.

  • JAVA_COMPILER

    Определяет, какой должен быть Just-In-Time-компилятор. По умолчанию это jitc, который является компилятором IBM JIT. Он может быть изменен на jitcg - версию компилятора JIT для отладки, или на NONE для выключения компилятора JIT (что в большинстве случаев - худшая вещь, которую можно сделать для производительности).

  • IBM_MIXED_MODE_THRESHOLD

    Определяет количество вызовов, после которых JVM JIT компилирует метод. Значения этой переменной разные для различных платформ и версий; например, оно равно 600 для Java 1.3.1 на AIX.

Необходимо заметить, что ни одна из этих установок не аннулирует существующие настройки. Например, если изменить LDR_CNTRL=MAXDATA на какое-нибудь другое значение, то будет использоваться новое значение, а не установка по умолчанию.

В README/SDK Guide, содержащемся в IBM Java SDK, объясняется, какие установки окружения должны иметь библиотеки Java Native Interface (JNI). Если придется модифицировать любую из переменных окружения, указанных в списке, то необходимо быть уверенным, что библиотеки JNI также созданы с соответствующими настройками.


Заключение

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

Ресурсы

Комментарии

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=344324
ArticleTitle=Оптимизация производительности Java в AIX: Часть 1. Основы
publish-date=10092008