【问题标题】:JProfiler 11 Offline Profiling: Timer Trigger for Snapshot not workingJProfiler 11 离线分析:快照的计时器触发器不起作用
【发布时间】:2020-05-23 15:28:40
【问题描述】:

我尝试在远程主机上离线分析 Java 8 应用程序,但不允许我直接访问。 (hadoop 集群上的 Flink YARN 作业)。

我能够通过 JProfiler -> 会话 -> 集成向导 -> 新的远程集成 -> 执行一些步骤,然后“使用分析代理创建存档”,从 JProfiler for linux 64 中导出相关的 JProfiler 库以进行离线调试。 我将未提取的存档部署到所有主机上的 /JPROFILER,之后为整个目录结构递归地设置了 755。

然后我在主机上创建了一个带有 2 个计时器触发器的会话。一个在 2 分钟后激活跟踪,另一个在 22 分钟后停止所有跟踪并保存快照。当我在 JProfiler GUI 中通过 SSH 将这个会话运行到某个任意远程主机时,我有一个连接,它似乎工作正常。在状态栏中,我看到 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 ...

但是,快照文件不知何故从未保存,可能根本没有触发两个触发器(我无法检查是否开始录制或快照保存不起作用)。我试图在 /tmp 中的 JVM 进程工作目录中找到快照,我什至通过以下方式搜索了整个主机:

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)

【问题讨论】:

  • 您的配置看起来不错,您肯定会看到触发器的一些输出。我唯一可以想象的是引用的配置文件不包含触发器。也许您可以为“Adimated Bezier Curve”演示尝试“Session->Conversion Wizards->Convert Application Session to Offline”,并定义一个每 5 秒打印一条消息的计时器触发器。
  • 引用的配置文件不包含触发器是什么意思?我通过“导出会话设置”创建了配置并完整地打印了结果文件。 XML 看起来像是包含整个触发器定义,没有对其他地方的引用。如果我运行“将应用程序会话转换为离线”,我无法选择我的个人资料,因为我猜它是一个“远程”。如果我用动画贝塞尔曲线来做,我只会得到一个带有一些 JVM 参数的 .bat 文件......
  • 有趣的地方:我在开发环境中测试设置,在该环境中我还拥有对集群机器的 root 和 ssh 访问权限。当我将 JProfiler UI 附加到主机以进行远程调试时,我看到 JVM 呈灰色,表明它已针对离线分析进行了检测。总的来说,我看到为我登录的用户运行了 14 个 JVM。如果我在该用户下的同一台机器上运行 jpenable,我只会看到 5 个 JVM,缺少我的离线 JVM。这可能有关系吗?
  • 不,这听起来很正常,jpenable 仅显示您可以附加到的 JVM。我的意思是尝试不同的过程来检查您是否可以让触发器在离线模式下工作,然后检查可能有什么不同。
  • 现在,在现有的配置 xml 中,我在触发元素中添加了另一个非常简单的第三个计时器: 。这个计时器适用于我的所有机器(Windows、Windows WSL linux、远程集群项目)。但只有这一个!另外两个也不能在我的本地机器上工作?!

标签: java jprofiler


【解决方案1】:

我对其进行了跟踪,这是 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 将不会存储 timer 元素的 count 属性,可能是因为它是默认值。该轮到离线分析器不会执行任何重复,而相比之下,JProfiler UI 将执行触发器 1 次。

总结:手动编辑 jprofiler_config.xml 并将count=1 作为属性添加到我的timer 可以解决这里的问题。 希望 JProfiler 能尽快修复这个错误。我在他们的主页上报告了这个错误。

编辑 在周末报告错误仅 4 小时后,我收到了错误修复版本,正如评论所说,JProfiler 11.1.1 将修复此问题。我在这里保留这篇文章只是作为关于如何设置离线分析(在 FLink/YARN 中)和使用 JProfiler 11.0 作为升级提醒的人的简短教程。

【讨论】:

  • 感谢您的分析,此错误将在 11.1.1 中修复,您还通过我们的支持电子邮件地址与我们联系,我们向您发送了包含修复的构建。
猜你喜欢
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多