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

Введение в Alibaba Arthas

Узнайте, как отслеживать, профилировать и устранять неполадки наших Java-приложений с помощью Alibaba Arthas.

Автор оригинала: 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:

Давайте рассмотрим некоторые из них более подробно:

  1. Верхний раздел посвящен текущим потокам
  2. Одним из важных столбцов является потребление процессора для каждого потока
  3. В разделе 3 показано процессорное время для каждого потока
  4. Еще одна интересная панель предназначена для анализа памяти. Различные области памяти перечислены со своей статистикой. С правой стороны у нас есть информация о сборщике мусора
  5. Наконец, в разделе 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 .