Оптимизация производительности Java в AIX: Часть 4. Устранение узких мест ввода/вывода и сети

Библиотека

Это четвертая статья из серии статей о настройке производительности Java на AIX, состоящей из пяти частей. Прежде чем продолжить чтение этой статьи, настоятельно рекомендуется еще раз просмотреть предыдущие статьи этой серии.

В этой статье рассказывается еще о двух областях, которые могут стать узким местом в производительности:
сеть;
дисковый ввод/вывод (I/O).

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

В начало

Ввод/вывод и сеть как узкое место

В этой статье рассматриваются ситуации, когда узким местом становятся ввод/вывод или сеть.

Из предыдущих статей этой серии можно было узнать, как каждый небольшой компонент вписывается в общую картину. Была сделана попытка разбить советы по областям применения, но эта классификация ни в коей мере не является всеобъемлющей. Для сети и ввода/вывода трудно найти источники проблем, но всё же можно оценить, как они влияют на производительность приложения. Только хорошее знание приложения позволит решить проблему. Например, ранее в этой серии обсуждалась важность проверки того, что куча не разбивается на страницы. Максимальный размер кучи, устанавливаемый переключателем –Xmx, должен быть меньше общего объема физической памяти, установленной в системе (определяется с помощью bootinfo -r или lsattr -El sys0 -a realmem, см. статью AIX Commands you should not leave home without).

Инструменты (например, topas и iostat) могут отобразить активность использования различных дисков, но в большинстве случаев виновником возникновения узкого места является цикл GC или какой-либо известный фрагмент функционального кода, поэтому если вы хорошо знаете приложение, то сможете легко найти узкое место. Инструменты типа filemon подскажут, к каким файлам осуществлялся доступ, позволяя избежать настройки «вслепую». Если производительность Java-приложения упала из-за неправильной конфигурации системы, то надо оценить производительность системы в целом. Например, для устранения узкого места дисковой подсистемы может потребоваться правильно распределить данные или приобрести более быстрые диски. Эта тема, выходящая за рамки этой статьи, подробно раскрывается в книгах из серии IBM Redbooks, например, Understanding IBM eServer pSeries Performance and Sizing.

Настройка сетевых буферов и других параметров сети может существенно повлиять на приложения, активно использующие сеть. Хорошим источником информации по настройке сетевых параметров является раздел Network Tunable Parameters руководства Performance Management Guide. Часто для настройки используются thewall, socketthresh, sbmax, somaxconnect, tcp_sendspace, tcp_recvspace, rfc1323 и т. д. Выдаваемая этими инструментами информация относится не только к AIX или Java, но и к любому приложению, интенсивно использующему сеть, поэтому их использование должно быть первым шагом при настройке производительности.

Далее в этом разделе дается краткое введение в некоторые общие инструменты и в обнаружение проблем, специфичных для Java. Дополнительную информацию можно получить в справочниках AIX 5L Performance Tools Handbook и Understanding IBM eServer pSeries Performance and Sizing.

vmstat

Вы наверняка уже пользовались универсальной командой vmstat. Для информации о вводе/выводе просмотрите значение столбца wa (I/O Wait) в разделе cpu. Если это значение большое, то, скорее всего, диски являются узким местом, и для вывода подробной информации о их вводе/выводе следует запустить iostat.

iostat

Утилита iostat является идеальным инструментом для определения узкого места в подсистеме ввода/вывода. Она отображает процессы чтения и записи для всех дисков. Это прекрасный инструмент для определения ситуации, когда нужно распределить ввод/вывод между несколькими дисками. Кроме того, этот инструмент генерирует такие же отчеты об активности центрального процессора, как и vmstat.

Для начала следует выяснить, что делает система. Для этого введите простую команду iostat -s в момент, когда работает приложение. Пример вывода этой команды:

tty: tin tout avg-cpu: % user % sys % idle % iowait
0.3 232.9 13.8 19.1 27.4 39.6

Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk0 28.7 291.4 35.0 176503 2744795
hdisk1 0.0 0.4 0.0 3537 0
hdisk7 1.7 34.9 9.8 8920 341112
hdisk14 24.5 1206.1 36.2 1188404 10904509
hdisk18 0.0 1.2 0.1 10052 2046
hdisk8 2.1 36.8 10.5 10808 357910

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

%tm_act показывает процент времени активного использования диска. Трассировка, приведенная выше, показывает очень интересный сценарий – показатель %iowait был близок к 40%, но tm_acts был намного меньше 100%, находясь в районе 30%. К системе, на которой был проведен опыт, был подключен дисковый массив Fibre Channel, и узким местом оказался маршрут до системы хранения SAN. Как только были получены конкретные цифры, все это стало очевидным!

Также можно использовать # iostat -at или iostat -sat … которые выводят tps и KBps (а также скорость чтения и записи) для адаптеров. Флаг -s означает, что нужно выдавать общую статистику системы.

netstat

При настройке сети netstat является идеальным инструментом для начала исследования. Команда netstat -m может применяться для мониторинга использования памяти mbuf, что может служить индикатором использования памяти сокетами и сетью. Если используется no -o extendednetstats=1, то команда netstat -m отобразит более подробную информацию, но это может повлиять на производительность, поэтому такой вариант следует использовать только для диагностики. При использовании netstat -m наиболее ценная информация выводится в начале отчета, например: