JProfiler 11 Offline Profiling: не работает таймер для моментального снимка - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь автономно профилировать приложение Java 8 на удаленном хосте, мне не разрешен прямой доступ. (Задание Flink YARN в кластере oop).

Мне удалось экспортировать соответствующие библиотеки JProfiler для автономной отладки из JProfiler для linux 64 через JProfiler -> Сессия -> Мастера интеграции -> Новая удаленная интеграция -> Пройдем несколько шагов и затем «Создать архив с агентом профилирования». Я развернул этот нераспакованный архив в / JPROFILER на всех хостах, после чего был установлен рекурсивный набор 755 для всей структуры каталогов.

Затем я создал сеанс на моем хосте с двумя триггерами таймера. Один активирует отслеживание через 2 минуты, другой останавливает все отслеживание через 22 минуты и сохраняет снимок. Когда я запускаю этот сеанс в JProfiler GUI на каком-либо произвольном удаленном хосте через S SH, к которому у меня есть соединение, кажется, он работает нормально. В строке состояния я вижу, что через 2 минуты запущено 3 записи, а через 22 минуты запущено 0 записей. Но когда я пытаюсь использовать этот сеанс в автономном профилировании без GUI, он не работает.

Для автономного профилирования в кластере я запустил свое приложение YARN с соответствующими параметрами и убедился, что запущенные JVM будет иметь:

-agentpath:/JPROFILER/jprofiler11/bin/linux-x64/libjprofilerti.so=offline,id=123,config=/JPROFILER/jprofiler_config.xml

набор. Кажется, это работает нормально, из журналов контейнера YARN, которые я вижу в stderr:

JProfiler> Protocol version 63
JProfiler> Java 8 detected.
JProfiler> Offline profiling mode.
JProfiler> 64-bit library
JProfiler> Using config file /JPROFILER/jprofiler_config.xml (id: 123)
JProfiler> Listening on port: 8849.
JProfiler> Enabling native methods instrumentation.
JProfiler> Can retransform classes.
JProfiler> Can retransform any class.
JProfiler> Native library initialized
JProfiler> VM initialized
JProfiler> Using sampling (2 ms)
JProfiler> Time measurement: elapsed time
JProfiler> CPU profiling enabled
SLF4J: Class path contains multiple SLF4J bindings.
... Some SLF4J stuff, no more JProfiler or other messages ...

Однако файл снимка почему-то никогда не сохраняется, возможно, ни один из обоих триггеров не запускается вообще (у меня нет способа проверьте, началась ли запись или не работает сохранение снимка). Я попытался найти снимок в рабочем каталоге процесса JVM, в / tmp, и даже обыскал весь хост с помощью:

find / -iname "*flink-taskmanager-snapshot*" 2>/dev/null

Но я ничего не нашел. Больше никаких сообщений не было записано в stderr, хотя мои триггеры настроены на вывод чего-либо в stderr

Есть ли у вас идеи, почему триггеры / снимок не работает? JProfiler, кажется, инициализируется просто отлично. Вот jprofiler_config. xml:

<?xml version="1.0" encoding="UTF-8"?>
<config version="11.1">
  <sessions>
    <session id="123" name="Flink-TaskManager-JProfiler" type="remote" remoteType="ssh" timeout="5" jvmConfigurationId="100" samplingFrequency="2" recordArrayAlloc="false" compilationMode="manual" compilationTarget="1.8">
      <filters>
        <group type="exclusive" name="Default excludes" template="none">
          <filter type="exclusive" name="$Proxy" />
          <!-- ... stripped ... -->
          <filter type="exclusive" name="workshop." />
        </group>
      </filters>
      <triggers logTarget="stderr" logFile="">
        <timer descriptionType="manual" manualDescription="Start recording" offsetTime="2" intervalTime="2" type="limited">
          <actions>
            <startRecording>
              <cpu enabled="true" />
              <allocation enabled="true" />
              <thread enabled="true" />
              <telemetry enabled="true" />
            </startRecording>
            <startCallTracer />
            <startProbeRecording name="builtin.HttpClientProbe" events="true" />
            <printMessage message="JProfiler: Start tracking" />
          </actions>
        </timer>
        <timer descriptionType="manual" manualDescription="stop recording" offsetTime="22" intervalTime="22" type="limited">
          <actions>
            <stopRecording>
              <cpu enabled="true" />
              <allocation enabled="true" />
              <thread enabled="true" />
              <telemetry enabled="true" />
            </stopRecording>
            <stopCallTracer />
            <stopProbeRecording name="builtin.HttpClientProbe" />
            <saveSnapshot file="flink-taskmanager-snapshot" number="true" />
            <printMessage message="JProfiler: stop recording and save snapshot..." />
          </actions>
        </timer>
      </triggers>
      <probes>
        <probe name="builtin.TrackingInterceptor">
          <id value="1" />
          <id value="2" />
          <id value="5" />
          <id value="7" />
        </probe>
      </probes>
      <ssh port="43490" verifyHosts="false">
        <entry hostName="some-remote-for-tests" userName="yarn" authentication="key" keyFile="C:\Users\theo\.ssh\id_rsa" />
      </ssh>
    </session>
  </sessions>
</config>

А вот и выводы о моей java версии:

$ /usr/java/jdk1.8.0_181-cloudera/bin/java -XshowSettings:properties -version
Property settings:
    awt.toolkit = sun.awt.X11.XToolkit
    file.encoding = ANSI_X3.4-1968
    file.encoding.pkg = sun.io
    file.separator = /
    java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
    java.awt.printerjob = sun.print.PSPrinterJob
    java.class.path = .
    java.class.version = 52.0
    java.endorsed.dirs = /usr/java/jdk1.8.0_181-cloudera/jre/lib/endorsed
    java.ext.dirs = /usr/java/jdk1.8.0_181-cloudera/jre/lib/ext
        /usr/java/packages/lib/ext
    java.home = /usr/java/jdk1.8.0_181-cloudera/jre
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/packages/lib/amd64
        /usr/lib64
        /lib64
        /lib
        /usr/lib
    java.runtime.name = Java(TM) SE Runtime Environment
    java.runtime.version = 1.8.0_181-b13
    java.specification.name = Java Platform API Specification
    java.specification.vendor = Oracle Corporation
    java.specification.version = 1.8
    java.vendor = Oracle Corporation
    java.vendor.url = http://java.oracle.com/
    java.vendor.url.bug = http://bugreport.sun.com/bugreport/
    java.version = 1.8.0_181
    java.vm.info = mixed mode
    java.vm.name = Java HotSpot(TM) 64-Bit Server VM
    java.vm.specification.name = Java Virtual Machine Specification
    java.vm.specification.vendor = Oracle Corporation
    java.vm.specification.version = 1.8
    java.vm.vendor = Oracle Corporation
    java.vm.version = 25.181-b13
    line.separator = \n
    os.arch = amd64
    os.name = Linux
    os.version = 3.10.0-1062.4.1.el7.x86_64
    path.separator = :
    sun.arch.data.model = 64
    sun.boot.class.path = /usr/java/jdk1.8.0_181-cloudera/jre/lib/resources.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/rt.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/sunrsasign.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/jsse.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/jce.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/charsets.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/lib/jfr.jar
        /usr/java/jdk1.8.0_181-cloudera/jre/classes
    sun.boot.library.path = /usr/java/jdk1.8.0_181-cloudera/jre/lib/amd64
    sun.cpu.endian = little
    sun.cpu.isalist =
    sun.io.unicode.encoding = UnicodeLittle
    sun.java.launcher = SUN_STANDARD
    sun.jnu.encoding = ANSI_X3.4-1968
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers
    sun.os.patch.level = unknown
    user.country = US
    user.dir = /var/lib/hadoop-yarn
    user.home = /root
    user.language = en
    user.name = root
    user.timezone =

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

1 Ответ

2 голосов
/ 08 февраля 2020

Я отследил это, и это ошибка в JProfiler 11 и 11.1 для автономного профилирования.

Все таймеры и их действия в автономном профилировании работают хорошо, если они неограничены, то есть регулярно планируются. XML будет выглядеть как

<timer offsetTimeUnit="s" intervalTime="10" intervalTimeUnit="s">
  <actions>
    <printMessage message="JProfiler Debug working?" />
  </actions>
</timer>

. Это также работает, если я установил ограниченное количество выполнений! = 1, поэтому конфигурация XML будет выглядеть следующим образом:

<timer manualDescription="Start recording" offsetTime="30" offsetTimeUnit="s" intervalTime="30" intervalTimeUnit="s" type="limited" count="2">
  <actions>
    <printMessage message="JProfiler: Start tracking" />
  </actions>
</timer>

Однако, если для счетчика повторений установлено значение 1, в конфигурации JProfiler XML не будет храниться атрибут count элемента timer, возможно, потому, что это значение по умолчанию. В свою очередь автономный профилировщик не будет выполнять никаких повторений, тогда как пользовательский интерфейс JProfiler выполнит триггер 1 раз.

В заключение: ручное редактирование jprofiler_config. xml и добавление count=1 в качестве атрибута к моему timer решает проблему здесь. Надеюсь, JProfiler скоро исправит ошибку. Я сообщил об ошибке на их домашней странице.

EDIT Всего через 4 часа после сообщения об ошибке в выходной день я получил версию с исправлением ошибки и, как говорится в комментарии, JProfiler 11.1. 1 это исправит. Я оставляю этот пост здесь просто как краткое руководство о том, как настроить автономное профилирование (в FLink / YARN) и для людей с JProfiler 11.0 в качестве напоминания об обновлении.

...