Автор оригинала: Antonio Manuel Moreno Delgado.
1. введение
Alibaba Arthas – это диагностический инструмент, который позволяет нам отслеживать, профилировать и устранять неполадки в наших Java-приложениях. Одним из ключевых преимуществ использования Arthas является то, что нам не нужно менять наш код или даже перезапускать службы Java, которые мы хотим контролировать.
В этом уроке мы начнем с установки Arthas, прежде чем пройдемся по простому кейсу, чтобы продемонстрировать некоторые ключевые особенности Arthas.
Наконец, поскольку Arthas написан на Java, он кросс-платформенный и с удовольствием будет работать на Linux, macOS и Windows.
2. Загрузка и начало работы
Во-первых, давайте начнем с загрузки библиотеки Arthas либо непосредственно по ссылке download link , либо с помощью curl :
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
Теперь давайте проверим, что он работает , запустив Arthas с параметром -h (help):
java -jar arthas-boot.jar -h
В случае успеха мы должны увидеть справочное руководство для всех отображаемых команд:
3. Тематическое Исследование
На протяжении всего этого урока мы будем использовать очень простое приложение, основанное на довольно неэффективной реализации последовательности Фибоначчи с использованием рекурсии:
public class FibonacciGenerator { public static void main(String[] args) { System.out.println("Press a key to continue"); System.in.read(); for (int i = 0; i < 100; i++) { long result = fibonacci(i); System.out.println(format("fib(%d): %d", i, result)); } } public static long fibonacci(int n) { if (n == 0 || n == 1) { return 1L; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } }
Наиболее интересной частью этого примера является метод фибоначчи , который следует математическому определению Фибоначчи.
В методе main мы используем цикл for с относительно большими числами, поэтому наш компьютер будет занят более длительными вычислениями. Это, конечно, именно то, что мы хотим продемонстрировать Артасу.
4. Начало Артаса
А теперь давай попробуем Артаса! Первое, что нам нужно сделать, это запустить наше небольшое приложение Фибоначчи. Для этого мы можем использовать вашу любимую IDE или запустить ее непосредственно в терминале. Он попросит нажать клавишу, чтобы начать. Мы нажмем любую клавишу после того, как прикрепим процесс к Артасу.
Теперь давайте запустим исполняемый файл Arthas:
java -jar arthas-boot.jar
Артас предлагает меню, чтобы выбрать, к какому процессу мы хотим подключиться:
[INFO] arthas-boot version: 3.1.7 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 25500 com.baeldung.arthas.FibonacciGenerator ...
Давайте выберем тот, у которого есть имя com.baeldung.arthas.Генератор Фибоначчи . Просто введите номер в списке, “1” в этом примере, а затем нажмите клавишу Enter.
Теперь Артас присоединится к этому процессу и начнет:
INFO] Try to attach process 25500 [INFO] Attach process 25500 success. ...
Как только мы запустили Arthas, у нас есть подсказка, где мы можем выдавать различные команды.
Мы можем использовать команду help , чтобы получить дополнительную информацию о доступных опциях. Кроме того, чтобы облегчить использование Arthas, мы также можем использовать клавишу tab для автозаполнения его команд.
После присоединения Артаса к нашему процессу, теперь мы можем нажать клавишу, и программа начнет печатать числа Фибоначчи.
5. Приборная панель
Как только Артас будет запущен, мы сможем использовать приборную панель. В этом случае мы продолжим, набрав команду dashboard . Теперь мы видим подробный экран с несколькими панелями и большим количеством информации о нашем процессе Java:
Давайте рассмотрим некоторые из них более подробно:
- Верхний раздел посвящен текущим потокам
- Одним из важных столбцов является потребление процессора для каждого потока
- В разделе 3 показано процессорное время для каждого потока
- Еще одна интересная панель предназначена для анализа памяти. Различные области памяти перечислены со своей статистикой. С правой стороны у нас есть информация о сборщике мусора
- Наконец, в разделе 5 мы имеем информацию о хост-платформе и JVM
Мы можем выйти из панели управления, нажав q .
Мы должны иметь в виду, что Артас будет привязан к нашему процессу, даже если мы выйдем. Итак, чтобы правильно отсоединить его от нашего процесса, нам нужно выполнить команду stop .
6. Анализ Трассировок стека
В приборной панели мы увидели, что наш основной процесс занимает почти 100% процессора. Этот процесс имеет ID 1, который мы видим в самом первом столбце.
Теперь, когда мы вышли из панели мониторинга, мы можем проанализировать процесс более подробно, выполнив команду thread :
thread 1
Число, переданное в качестве аргумента, является идентификатором потока. Артас распечатывает трассировку стека, которая, что неудивительно, загромождена вызовами метода fibonacci .
Если трассировка стека длинная и утомительная для чтения, команда thread позволяет нам использовать каналы:
thread 1 | grep 'main('
Это приведет только к печати строки, соответствующей команде grep :
[[email protected]]$ thread 1 | grep 'main(' at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)
7. Декомпилируйте класс Java
Давайте представим себе сценарий, в котором мы анализируем Java-приложение, о котором почти ничего не знаем, и вдруг обнаруживаем, что стек усеян повторяющимися вызовами типа:
[[email protected]]$ thread 1 "main" Id=1 RUNNABLE at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18) at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18) ...
Поскольку мы запускаем Arthas, мы можем декомпилировать класс, чтобы увидеть его содержимое. Для этого мы можем использовать команду jad , передавая в качестве аргумента квалифицированное имя класса:
jad com.baeldung.arthas.FibonacciGenerator ClassLoader: [email protected] [email protected] Location: /home/amoreno/work/baeldung/tutorials/libraries-3/target/
/* * Decompiled with CFR. */ package com.baeldung.arthas; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; public class FibonacciGenerator { public static void main(String[] arrstring) throws IOException {
На выходе получается декомпилированный Java-класс и некоторые полезные метаданные, такие как местоположение класса . Это действительно полезная и мощная функция.
8. Класс поиска и метод поиска
Команда search class очень удобна при поиске классов, загруженных в JVM. Мы можем использовать его, набрав sc и передав шаблон, с подстановочными знаками или без них, в качестве аргумента :
[[email protected]]$ sc *Fibonacci* com.baeldung.arthas.FibonacciGenerator Affect(row-cnt:1) cost in 5 ms.
Как только у нас есть квалифицированное имя для класса, мы можем затем искать дополнительную информацию, используя два дополнительных флага:
- -d для отображения сведений о классе
- -f для отображения полей класса
Однако поля класса должны быть запрошены в сочетании с деталями:
[[email protected]]$ sc -df com.baeldung.arthas.FibonacciGenerator class-info com.baeldung.arthas.FibonacciGenerator ...
Аналогично, мы можем использовать команду sm (метод поиска) для поиска загруженных методов в классе. В данном случае для нашего класса com.baeldung.arthas.Генератор Фибоначчи , мы можем запустить:
[[email protected]]$ sm com.baeldung.arthas.FibonacciGenerator com.baeldung.arthas.FibonacciGenerator()V com.baeldung.arthas.FibonacciGenerator main([Ljava/lang/String;)V com.baeldung.arthas.FibonacciGenerator fibonacci(I)J Affect(row-cnt:3) cost in 4 ms.
Мы могли бы использовать флаг -d для получения подробных сведений о методах, а также . Наконец, мы можем передать имя метода необязательным аргументом, чтобы сузить число возвращаемых методов:
sm -d com.baeldung.arthas.FibonacciGenerator fibonacci declaring-class com.baeldung.arthas.FibonacciGenerator method-name fibonacci modifier public,static annotation parameters int return long exceptions classLoaderHash 799f7e29
9. Вызов Метода Мониторинга
Еще одна классная вещь, которую мы можем сделать с Артасом, – это контролировать метод. Это может быть очень удобно при отладке проблем производительности в наших приложениях. Для этого мы можем использовать команду monitor .
Команда monitor требует флага -c и двух аргументов — квалифицированного имени класса и имени метода.
Для нашего примера давайте теперь вызовем monitor :
monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci
Как и ожидалось, Артас будет печатать метрики о методе фибоначчи каждые 10 секунд:
Affect(class-cnt:1 , method-cnt:1) cost in 47 ms. timestamp class method total success fail avg-rt(ms) fail-rate ----------------------------------------------------------------------------------------------------------------------------- 2020-03-07 11:43:26 com.baeldung.arthas.FibonacciGenerator fibonacci 528957 528957 0 0.07 0.00% ...
У нас также есть метрики для тех вызовов, которые заканчиваются сбоями, и они могут быть полезны для отладки.
10. Аргументы Метода Мониторинга
В случае, если нам нужно отладить параметры метода, мы можем использовать команду watch . Но синтаксис немного сложнее:
watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10
Давайте подробно рассмотрим каждый из аргументов:
- Первый аргумент – это имя класса
- Второе – это имя метода
- Третий аргумент-это выражение OGNL , определяющее то, что мы хотим наблюдать — в данном случае это первый (и единственный) параметр метода и возвращаемое значение
- Четвертый и последний необязательный аргумент-это логическое выражение, используемое для фильтрации вызовов, которые мы хотим отслеживать
В этом примере мы хотим отслеживать аргумент только тогда, когда он больше 10. Наконец, мы добавляем флаг, чтобы ограничить количество результатов до 10:
watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10 Press Q or Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 19 ms. ts=2020-02-17 21:48:08; [cost=30.165211ms] [email protected][ @Integer[11], @Long[144], ] ts=2020-02-17 21:48:08; [cost=50.405506ms] [email protected][ @Integer[12], @Long[233], ] ...
Здесь мы можем увидеть примеры вызовов с их временем процессора и входными/возвращаемыми значениями.
11. Профилировщик
Очень наглядная возможность для тех, кто заинтересован в производительности приложений, доступна через команду profiler . Профилировщик будет оценивать производительность процессора, который используют наши процессы.
Давайте запустим профилировщик, запустив profiler start . Это неблокирующая задача, то есть мы можем продолжать использовать Arthas, пока работает профилировщик.
В любое время мы можем спросить, сколько образцов имеет профилировщик, запустив profiler get Samples .
Теперь остановим профилировщик с помощью profiler stop. В этот момент сохраняется изображение FlameGraph . В этом конкретном случае мы имеем график с доминирующей на графике нитью фибоначчи :
Обратите внимание, что эта диаграмма может быть особенно полезна, когда мы хотим определить, где тратится наше процессорное время.
12. Заключение
В этом уроке мы изучили некоторые из самых мощных и полезных функций Arthas.
Как мы уже видели, у Артаса есть много команд, которые могут помочь нам диагностировать различные проблемы. Это также может быть особенно полезно, когда мы не можем получить доступ к коду исследуемого приложения или если мы хотим сделать быструю диагностику проблемного приложения, работающего на сервере.
Как всегда, полный исходный код статьи доступен на GitHub .