Рубрики
Без рубрики

Производительность Java – 3 – Набор инструментов для повышения производительности Java

Резюме Эта статья является частью 4 для серии Java Performance, в которой обобщается java… Помечено книгами, java, программированием, производительностью.

Резюмировать

Эта статья является частью 4 серии Производительность Java которые обобщают книгу о производительности Java по Скотт Оукс

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

В этой главе мы обсудим некоторые интересные инструменты измерения для процессора, сети и диска. Мы поймем разницу между различными профилями в java и немного поговорим о JFR Java Flight Recorder .

Отлично, давайте начнем третью главу…

Название главы:

Набор инструментов для повышения производительности java

Анализ производительности — это прежде всего наглядность – знание того, что происходит внутри приложения и в среде приложения. Видимость – это все, что связано с инструментами. И поэтому настройка производительности – это все, что связано с инструментами.

1) Инструменты и анализ операционной системы

Отправной точкой для анализа программ является вовсе не специфика Java: это базовый набор инструментов мониторинга, поставляемых вместе с операционной системой. Мы собираемся кратко ознакомиться с методами операционной системы, чтобы изучить использование:

  • ПРОЦЕССОР –> vmstat
  • Диск –> iostat
  • Сеть –> nicstat

A- Загрузка ЦП

Загрузка процессора обычно делится на две категории: пользовательское время и системное время (Windows называет это привилегированным временем).

  • Пользовательское время – это процент времени, в течение которого процессор выполняет код приложения.
  • Системное время – это процент времени, в течение которого процессор выполняет код ядра.

Цель состоит в том, чтобы максимально использовать процессор.

Если вы запустите vmstat 1 на своем рабочем столе Linux, вы получите серию строк (по одной каждую секунду), которые выглядят так: Как вы можете найти в выходных данных:

  • Каждая секунда имеет системный% и % пользователей приблизительно.
  • Общее время работы процессора [он же загрузка] составляет 45% Это означает, что процессор простаивает в течение 55% времени.

Процессор может простаивать по нескольким причинам:

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

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

Java и один процессор: Если код представляет собой приложение в пакетном стиле, то процессор не будет простаивать, потому что у него всегда есть работа [если задание заблокировано для ввода-вывода или чего-то еще, другой пакет может использовать процессор .. и т. Д.]/| … Java и мультипроцессор: Общая идея такая же, как и в одном процессоре, однако, убедившись, что отдельные потоки не заблокированы, процессор будет работать быстрее.

Очередь запуска процессора

Вы можете отслеживать количество потоков, которые могут быть запущены [иначе говоря, не заблокированы]. Эти потоки вызываются для того, чтобы находиться в Очереди запуска процессора . Вы можете найти длину очереди запуска на предыдущем изображении в первом столбце процесс r

Примечание

  • В linux: число равно количеству запущенных в данный момент потоков [тех, которые используют процессоры] и других, которые ожидают использования процессоров.
  • В Windows: число равно числу НЕ подсчитывает текущие запущенные потоки. Таким образом, цель в linux состоит в том, чтобы сделать эту очередь количеством машинных процессоров, а в Windows – сделать.

Использование B-Диска

Мониторинг использования диска преследует две важные цели.

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

Вы можете использовать команду iostat для мониторинга диска, давайте посмотрим пример:

  • Это приложение записывает данные на диск sda .
  • w_await : время обслуживания каждой записи ввода-вывода
  • использовать : использование диска

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

Использование C-Сети

Если вы запускаете приложение, которое использует сеть — например, сервер REST, — вы также должны отслеживать сетевой трафик. Вы можете использовать netstat

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

2) Инструменты мониторинга Java

Чтобы получить представление о самой JVM, требуются инструменты мониторинга Java. Эти инструменты поставляются вместе с JDK:

Команды A- JVM

  • jcmd : Выводит базовую информацию о классе, потоке и JVM для процесса Java.
  • консоль : Предоставляет графическое представление действий JVM, включая использование потоков, использование классов и действия GC
  • jmap : Предоставляет дампы кучи и другую информацию об использовании памяти JVM. Подходит для написания сценариев, хотя дампы кучи должны использоваться в инструменте постобработки.
  • джинфо : Обеспечивает видимость системных свойств JVM и позволяет динамически устанавливать некоторые системные свойства. Подходит для написания сценариев.
  • jstack : Сбрасывает стеки Java-процесса. Подходит для написания сценариев.
  • j статистика : Предоставляет информацию о GC и мероприятиях по загрузке классов. Подходит для написания сценариев.
  • jvisualvm : инструмент с графическим интерфейсом для мониторинга JVM, профилирования запущенного приложения и анализа дампов кучи JVM (это операция постобработки, хотя jvisualvm также может извлекать дамп кучи из живой программы).

если вы используете docker, вы можете запустить их с помощью docker exec за исключением jconsole и jvisualvm .

Эти инструменты подходят для следующих широких областей: • Базовая информация о виртуальной машине • Информация о потоке • Информация о классе • Анализ GC в реальном времени • Постобработка свалки кучи • Профилирование JVM

B- Основная информация о виртуальной машине

  • Время безотказной работы Продолжительность работы JVM можно определить с помощью этой команды:

% jcmd процесс_ид виртуальной машины.время безотказной работы

  • Свойства системы

% jcmd процесс_ид виртуальной машины.системные_ свойства

или

% % информация -идентификатор процесса sysprops

  • Версия JVM Версия JVM получается следующим образом:

% jcmd процесс_ид виртуальной машины.версия

  • Флаги настройки JVM Флаги настройки, действующие для приложения, можно получить следующим образом:

% jcmd процесс_ид виртуальной машины.флаги [-все]

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

% jinfo -флаг -идентификатор процесса печати gcdetails # отключает печать gcdetails % jinfo -флаг printgcdetails_idпроцесса

3) Инструменты профилирования

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

Многие распространенные инструменты профилирования Java сами написаны на Java и работают, “прикрепляясь” к профилируемому приложению. Это вложение осуществляется через сокет или через собственный интерфейс Java, называемый Интерфейс инструмента JVM (JVMTI). Это означает, что вы должны обратить внимание на настройку инструмента профилирования так же, как вы бы настроили любое другое приложение Java. В частности, если профилируемое приложение является большим, оно может передавать довольно много данных в инструмент профилирования, поэтому инструмент профилирования должен иметь достаточно большую кучу для обработки данных.

Профилирование происходит в одном из двух режимов:

  • режим выборки
  • инструментальный режим

Профилировщики A- выборки

Плюсы : Базовый режим профилирования и несет наименьшее количество накладных расходов.

Минусы : Однако профилировщики выборки могут быть подвержены всевозможным ошибкам, например, наиболее распространенная ошибка выборки, как показано на рисунке ниже: Поток здесь чередуется между методом выполнения (показан в заштрихованных полосах) и методом B (показан в прозрачных полосах). Если таймер срабатывает только тогда, когда поток находится в методе B, профиль сообщит, что поток потратил все свое время на выполнение метода B; на самом деле в методе A было потрачено больше времени.

Причина : это связано с смещением точки безопасности , что означает, что профилировщик может получить трассировку стека потока только тогда, когда поток находится в безопасной точке, когда они: • Заблокированы синхронизированной блокировкой • Заблокировано ожидание ввода-вывода • Заблокировано ожидание монитора • Припаркованный • Выполнение кода Java Native Interface (JNI) (если только они не выполняют функцию блокировки GC)

B- Инструментальные профилировщики

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

Минусы : Они с гораздо большей вероятностью приведут к различиям в производительности приложения, чем профилировщики выборки.

Инструментальные профилировщики работают, изменяя последовательность байт-кодов классов по мере их загрузки (вставляя код для подсчета вызовов и т. Д.).

Примечание

Является ли этот профиль лучшим, чем выборочная версия? Это зависит от обстоятельств; в данной ситуации невозможно определить, какой профиль является более точным. Количество вызовов инструментального профиля, безусловно, является точным, и эта дополнительная информация часто помогает определить, где код тратит больше времени и какие вещи более эффективны для оптимизации.

C- Собственные профили

Такие инструменты, как async-profiler и Oracle Developer Studio, позволяют профилировать собственный код в дополнение к коду Java. Это имеет два преимущества:

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

4) Бортовой самописец Java JFR

Java Flight Recorder (JFR) – это функция JVM, которая выполняет легкий анализ производительности приложений во время их работы. Как следует из названия, данные JFR представляют собой историю событий в JVM, которые можно использовать для диагностики прошлой производительности и операций JVM.

Основная операция JFR заключается в том, что включается набор событий (например, одно событие заключается в том, что поток блокируется в ожидании блокировки), и каждый раз, когда происходит выбранное событие, данные об этом событии сохраняются (либо в памяти, либо в файле).

Чем больше количество событий, тем выше производительность, на которую повлиял JFR.

Управление полетами A- Java

Обычным инструментом для изучения записей JFR является Java Mission Control (jmc), хотя существуют и другие инструменты, и вы можете использовать наборы инструментов для написания собственных инструментов анализа. Программа Java Mission Control (jmc) запускает окно, в котором отображаются процессы JVM на компьютере, и позволяет выбрать один или несколько процессов для мониторинга. На рисунке 3-9 показана консоль Java Management Extensions (JMX) Java Mission Control, отслеживающая наш пример сервера REST.

Особенности B- JFR

В следующей таблице показано, какие другие инструменты могут собирать данные и что jfr собирает для каждого события:

Какой загрузчик классов загрузил класс; время, необходимое для загрузки отдельного класса Загрузка классов Количество загруженных и выгруженных классов
Какие потоки заблокированы при блокировках (и на какой конкретной блокировке они заблокированы) Статистика потоков Количество созданных и уничтоженных потоков; свалки потоков
Количество возникших исключений и ошибок и трассировка стека их создания Бросаемые предметы Выбрасываемые классы, используемые приложением
Конкретные объекты, выделенные в куче, и трассировка стека, в которой они выделены Распределение TLAB Количество выделений в куче и размер локальных буферов выделения потоков (TLABs)
Время, затрачиваемое на вызов чтения / записи, для чтения или записи определенного файла или сокета требуется много времени Ввод/вывод файлов и сокетов Время, затраченное на выполнение ввода-вывода
Конкретные потоки, заблокированные на определенных мониторах, и продолжительность времени они заблокированы Монитор заблокирован Потоки, ожидающие монитора
Методы, удаленные из кэша кода; конфигурация кэша кода Кэш кода Размер кэша кода и сколько он содержит
Ничего специфичного для JFR, но объединяет информацию из нескольких источников Компиляция кода Какие методы компилируются, компиляция замены в стеке (OSR) и продолжительность компиляции
Ничего специфичного для JFR, но объединяет информацию из нескольких инструментов Вывоз мусора Время для ГК, включая отдельные фазы; размеры поколений
Не так много, как вы получили бы от настоящего профилировщика, но профиль JFR обеспечивает хороший обзор высокого порядка Профилирование Профили приборов и отбора проб

C- Включение JFR

JFR изначально отключен. Чтобы включить его, добавьте флаг -XX:+FlightRecorder в командную строку приложения. Это включает функцию JFR, но записи не будут производиться до тех пор, пока не будет включен сам процесс записи. Это может произойти либо через графический интерфейс, либо через командную строку.

В JDK 8 Oracle вы также должны указать этот флаг (до флага бортового самописца): -XX:+Разблокировать коммерческие функции (по умолчанию: false). Если вы забыли включить эти флаги, помните, что вы можете использовать jinfo для изменения их значений и включения JFR. Если вы используете jmc для запуска записи, при необходимости он автоматически изменит эти значения в целевой JVM.

Чтобы включить его из командной строки: -XX:+FlightRecorderOptions=строка Строка в этом параметре представляет собой список пар имя-значение, разделенных запятыми, взятых из этих параметров:

name=name
-->The name used to identify the recording.
defaultrecording=
-->Whether to start the recording initially. The default value is false; for reactive analysis, this should be set to true.
settings=path
-->Name of the file containing the JFR settings (see the next section).
delay=time
-->The amount of time (e.g., 30s, 1h) before the recording should start.
duration=time
-->The amount of time to make the recording.
filename=path
-->Name of the file to write the recording to.
compress=
-->Whether to compress (with gzip) the recording; the default is false.
maxage=time
-->Maximum time to keep recorded data in the circular buffer.
maxsize=size
-->Maximum size (e.g., 1024K, 1M) of the recording's circular buffer.

🏃 Увидимся в главе 4 …

🐒 возьмите чаевые

Никогда не доверяйте своему коду. 👮

Оригинал: “https://dev.to/yousef_zook/java-performance-3-a-java-performance-toolbox-iad”