Удаленное профилирование Yourkit с докером
Yourkit — это очень часто используемый профилировщик в командах по производительности для всего профилирования, связанного с Java. Если основное использование этого профилировщика — профилирование варианта использования на вашем локальном компьютере, бывают ситуации, когда вам нужно профилировать удаленно работающие серверы Java. Это становится еще труднее, когда сервер запускается внутри контейнера докеров, потому что в большинстве случаев эти контейнеры настроены так, чтобы не открывать никаких портов, кроме назначенных портов, таких как 8080.
В такой ситуации можно профилировать приложение в самом док-контейнере и скопировать моментальный снимок на локальный компьютер для анализа. К счастью, вам не нужна лицензия для профилирования приложения, но вам нужна лицензия только для просмотра/анализа результатов, так что вы избавлены от головной боли при регистрации. В этом документе мы увидим, как раздуть yourkit на док-контейнер и получить моментальный снимок.
Я часто использовал это в контейнерах XO, поэтому я буду использовать имена контейнеров из XO.
прежде всего нам нужно найти контейнер, в котором размещено приложение. Используйте команду docker ps, чтобы получить его.
docker -H <хост> ps -fname=machine
Это даст вывод что-то вроде
ИДЕНТИФИКАТОР КОНТЕЙНЕРА ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНА СОСТОЯНИЕ ПОРТЫ
c892579bed1f register2.swarm.devfactory.com/crossover/xo-tomcat:95 «/scripts/docker-ent…» Около часа назад Наверх Около часа 10.69.11.214:20314->8080/tcp
Из вывода вы можете легко обнаружить, что идентификатор контейнера c892579bed1f — это тот, который нам нужно использовать для дальнейших шагов.
Когда у нас есть контейнерный идентификатор докера, следующим шагом будет вход в контейнер bash. мы будем использовать команду docker exec, чтобы сделать то же самое.
docker -H dl6.
это откроет консоль bash для контейнера.
Следующим шагом является загрузка и размещение бинарных файлов yourkit в контейнере. Запустите команду ниже с соответствующим двоичным URL-адресом внутри docker bash, чтобы сделать то же самое.
root@machine:/usr/local/tomcat# wget -P /tmp/ &&
распаковать /tmp/YourKit-JavaProfiler-2018.04-b82.zip -d /usr/local &&
РМ /tmp/ВашКит-JavaProfiler-2018.04-b82.zip
Эта команда загрузит двоичные файлы yourkit на компьютер, разместит их в каталоге /usr/local и удалит загруженный двоичный файл, чтобы освободить место.
генерирует вывод, как показано ниже
—2018-09-10 12:44:58—
Разрешение www.yourkit.com (www.yourkit.com)… 144.76.223.241
Подключение к www.yourkit.com (www.yourkit.com)|144.76.223.241|:443… подключено.
HTTP-запрос отправлен, ожидается ответ… 200 OK
Длина: 70990617 (68 м) [application/zip]
Сохранение в: ‘/tmp/YourKit-JavaProfiler-2018.04-b82.zip’
YourKit-JavaProfiler-2018.04- 100%[=================================================>] 67,70 млн 717 КБ/с за 1 мин 52 с
2018-09-10 12:46:51 (618 КБ/с) — «/tmp/YourKit-JavaProfiler-2018.04-b82.zip» сохранен [70990617/70990617]
Архив: /tmp/YourKit-JavaProfiler-2018.04-b82.zip
.
.
.
раздувание: /usr/local/YourKit-JavaProfiler-2018.04/jre64/release
Следующим шагом является присоединение агента профилировщика yourkit к работающей JVM, вам нужно знать идентификатор процесса работающей JVM, обычно это 1, если это контейнер только для tomcat.
Используйте attach.sh в <директории установки Yourkit>/bin
root@machine:/usr/local/tomcat# /usr/local/YourKit-JavaProfiler-2018.04/bin/attach.sh
Посмотрите вывод ниже, он показывает все процессы и спрашивает, какой pid вы хотите использовать, я ввел 1 для pid и использовал порт по умолчанию, просто нажав Enter. Вы также можете передать PID в качестве первого параметра
[YourKit Java Profiler 2018.04-b82] Файл журнала: /root/.yjp/log/profiler-ui-362.log
Запуск JVM:
Имя | ПИД | Статус |
---|---|---|
Кот | 1 | Агент профилировщика не загружен. Готов к прикреплению. |
Введите PID приложения, которое вы хотите подключить (0 для выхода), и нажмите Enter:
Не число. Пожалуйста, введите еще раз.
1
Укажите список параметров запуска, разделенных запятыми, или нажмите Enter для параметров по умолчанию (рекомендуется):
<<Ввод>>
root@machine:/usr/local/tomcat#
Начать профилирование
Теперь наш агент подключен к процессу, и нам нужно начать профилирование. Утилита yjp-controller-api-redist.ja доступна в <каталоге установки Yourkit>/lib, поскольку мы будем часто использовать эту утилиту, давайте изменим рабочий каталог. перед вызовом этой утилиты.
root@machine:/usr/local/tomcat# cd /usr/local/YourKit-JavaProfiler-2018.04/lib
root@machine:/usr/local/YourKit-JavaProfiler-2018.04/lib# java -jar yjp-controller-api-redist.jar localhost 10001 start-cpu-sampling
Команда yjp-controller-api-redist.jar имеет несколько параметров, перечисленных ниже.
Профилирование можно выполнять в режиме выборки или в режиме трассировки. выдать yjp-controller-api-redist.jar без каких-либо параметров
java -jar yjp-controller-api-redist.jar
Инструменты командной строки YourKit Java Profiler 2018.04-b82
Использование: java -jar yjp-controller-api-redist.jar <хост> <порт> <команда>
где <команда> является одним из:
статус
захват-память-моментальный снимок
захват-hprof-моментальный снимок
снимок производительности захвата
старт-процессор-выборка
запуск-процессор-трассировка
старт-процессор-подсчет звонков
стоп-процессор-профилирование
очистить данные процессора
начать-распределить-запись-все
// записываем все объекты
старт-аллок-запись-адаптивный [alloc-sampled]
// записываем все объекты размером >= 4 КБ и только каждый 10-й меньший объект
остановить-распределить-запись
очистить-распределить-данные
запуск-монитор-профилирование
стоп-монитор-профилирование
очистить данные монитора
включить телеметрию стека
отключить телеметрию стека
сила-gc
четкие карты
Примеры:
java -jar yjp-controller-api-redist.jar localhost 10001 захват-память-моментальный снимок
java -jar yjp-controller-api-redist.jar localhost 10001 start-cpu-sampling
После запуска профилирования очистите данные процессора перед выполнением вашего варианта использования.
root@machine:/usr/local/YourKit-JavaProfiler-2018.04/lib# java -jar yjp-controller-api-redist.jar localhost 10001 clear-cpu-data
Теперь выполните свой вариант использования и создайте снимок
root@machine:/usr/local/YourKit-JavaProfiler-2018.04/lib# java -jar yjp-controller-api-redist.jar localhost 10001 Capture-Performance-Snapshot
Получен снимок: /root/Snapshots/Tomcat-2018-09-10.snapshot
root@machine:/usr/local/YourKit-JavaProfiler-2018.04/lib# java -jar yjp-controller-api-redist.jar localhost 10001 stop-cpu-profiling
Профилирование ЦП остановлено
В выводе вы увидите, что снимок создается в этом месте — /root/Snapshots/Tomcat-2018-09-10.snapshot
Копировать снимок
Используйте docker cp для копирования моментального снимка на локальный компьютер — помните, что мы отметили идентификатор контейнера, нам придется использовать его для копирования. Вы можете выполнить эту команду из отдельной оболочки, чтобы избежать выхода из текущего сеанса ptofiling.
docker cp -H dl6.
При этом моментальный снимок будет скопирован в папку F:\yktsnaphosts\Tomcat-2018-09-10.snapshot, которую вы сможете открыть с помощью вашей лицензионной версии yourkit для анализа.
Все команды вместе
docker -H
docker -H
wget -P /tmp/ &&
распаковать /tmp/YourKit-JavaProfiler-2018.04-b82.zip -d /usr/local &&
РМ /tmp/ВашКит-JavaProfiler-2018.04-b82.zip
/usr/local/YourKit-JavaProfiler-2018.04/bin/attach.sh
cd /usr/local/YourKit-JavaProfiler-2018.04/lib
java -jar yjp-controller-api-redist.jar localhost 10001 start-cpu-sampling
java -jar yjp-controller-api-redist.jar localhost 10001 очистить данные процессора
Займитесь своей деятельностью
java -jar yjp-controller-api-redist.jar localhost 10001 захват-производительность-моментальный снимок
java -jar yjp-controller-api-redist.jar localhost 10001 остановить профилирование процессора
docker cp -H
выход