async-profiler просматривает список событий профилирования, поддерживаемых jvm

Я пытаюсь просмотреть список событий профилирования, поддерживаемых jvm. Как упоминалось в документе, я использовал команду, как показано ниже -

      root@vrni-platform:/home/ubuntu/async-profiler-2.0-linux-x64# ./profiler.sh list 10208
Basic events:
  cpu
  alloc
  lock
  wall
  itimer
Java method calls:
  ClassName.methodName
Perf events:
  page-faults
  context-switches
  cycles
  instructions
  cache-references
  cache-misses
  branches
  branch-misses
  bus-cycles
  L1-dcache-load-misses
  LLC-load-misses
  dTLB-load-misses
  mem:breakpoint
  trace:tracepoint

Я не вижу событий, упомянутых в этом ответе, в приведенных выше выходных данных. Но если я выполню вышеуказанные события, как указано в этом ответе, похоже, что это сработает.

      root@vrni-platform:/home/ubuntu/async-profiler-2.0-linux-x64# ./profiler.sh -e malloc -d 30 -f /tmp/flamegraph.html 10208
Profiling for 30 seconds
Done

Может ли кто-нибудь сообщить мне, как я могу просмотреть список всех событий, поддерживаемых aysnc-profiler для определенного jvm? Если list правильный аргумент в пользу profiler.sh тогда почему malloc и т. д. отображаются под списком всех событий?

Среда

      ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64# ./profiler.sh --version
Async-profiler 2.0 built on Mar 14 2021
Copyright 2016-2021 Andrei Pangin
      ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64# uname -a
Linux vrni-platform 4.15.0-142-generic #146-Ubuntu SMP Tue Apr 13 01:11:19 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
      ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64$ java -version
openjdk version "11.0.11" 2021-04-20 LTS
OpenJDK Runtime Environment Zulu11.48+22-SA (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM Zulu11.48+22-SA (build 11.0.11+9-LTS, mixed mode)

1 ответ

Решение

вот это не отдельное мероприятие. Это просто пример точки останова на выполнение.

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

      ./profiler.sh -e mem:0x123450:x <pid>

Вместо числового адреса можно указать собственное имя функции. это просто имя функции в стандартной библиотеке C (libc):

      ./profiler.sh -e mem:malloc:x <pid>

А также -e malloc- это ярлык для описанного выше дескриптора события. Если async-profiler обнаруживает, что данное имя события соответствует некоторой собственной функции, он профилирует выполнение этой функции.

Вместо malloc, вы также можете профилировать любую другую функцию. Например,

  • -e pthread_start чтобы узнать, кто запускает новые потоки (как Java, так и собственные потоки);
  • -e connect профилировать новые соединения сокетов;
  • -e JVM_GC найти абонентов System.gc();
  • -e G1CollectedHeap::humongous_obj_allocate профилировать огромные распределения G1;
  • -e Deoptimization::uncommon_trap найти, где деоптимизируется скомпилированный код;

и так далее и тому подобное. В JVM, в стандартной библиотеке классов, в libc есть тысячи собственных функций. Очевидно, что перечислить их все в справке async-profiler практически невозможно.

Другие вопросы по тегам