当前位置: 首页 > 知识库问答 >
问题:

JProfiler 11脱机分析:快照的计时器触发器不工作

燕和同
2023-03-14

我尝试在远程主机上脱机评测Java 8应用程序,不允许直接访问。(hadoop集群上的Flink纱线作业)。

我能够通过JProfiler从JProfiler for linux 64中导出相关的JProfiler库以进行脱机调试-

然后,我在我的主机上创建了一个带有2个计时器触发器的会话。一个在2分钟后激活跟踪,另一个在22分钟后停止所有跟踪并保存快照。当我在JProfiler GUI中通过SSH将此会话运行到某个任意远程主机时,它似乎工作正常。在状态栏中,我看到2分钟后,3条记录正在运行,22分钟后,0条记录正在运行。但是,当我尝试在没有GUI的脱机评测中使用该会话时,它不起作用。

对于集群上的离线评测,我使用适当的选项启动了我的Thread应用程序,并确保启动的JVM具有:

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

设置从纱线容器原木来看,这似乎很好,我在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\u配置。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个答案

凤凡
2023-03-14

我找到了它,这是JProfiler 11和11.1中脱机评测的一个bug。

离线分析中的所有计时器及其操作都运行良好,如果它们是无限的,即定期安排的。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将不会存储time元素的count属性,可能是因为它是默认值。脱机分析器将不会执行任何重复,而JProfilerUI将执行触发器1次。

总结:手动编辑jprofiler\u配置。xml并将count=1作为属性添加到我的计时器中,解决了这里的问题 希望JProfiler能很快修复这个bug。我在他们的主页上报告了这个bug

在一个周末报告错误后仅4小时,我就收到了一个错误修复版本,正如评论所说,JProfiler 11.1.1将修复此问题。我在这里写这篇文章只是作为一个简短的教程,介绍如何设置脱机评测(在FLink/Thread中),以及如何使用JProfiler 11.0作为升级提醒。

 类似资料:
  • 我正在使用Firestore for Android。我知道它默认启用了持久性。 以下是一些背景: 我的应用程序显示了一个笔记列表,每一个笔记都绑在一个标签上。因此,在创建便笺时,我必须提供标签列表(在中,响应“选择标签”按钮),该列表将由上的快照侦听器提供。由于创建便笺是一个单独的,所以每次用户创建便笺时,都必须提供完整的标签列表。 null

  • 我试图远程评测运行在64位linux服务器上的alfresco,该服务器运行1.8 JVM和Apache Tomcat 7。xx来自我的测试代码,但不知道如何通过编程触发快照。 我想做的是连接到远程服务器,开始分析,并从用Java编写的测试代码中将该服务器性能的快照保存到本地机器上。 我已经在linux服务器上安装了JProfiler 9.2,可以通过JProfiler GUI连接并拍摄快照。为了

  • 我正在使用Sonarqube6.7,开发人员的版本,我在本地机器上通过声纳扫描器msbuild运行分析。有什么方法可以:1)在代码签入时自动触发此分析,而不使用声纳扫描仪?2)我可以通过邮件获得分析报告吗?我必须为每一个这些做什么?提前谢谢!

  • 我在Azure上有一个函数,包含以下function.json文件: 除非我错了,否则这个函数应该每天运行一次,在凌晨3点? 这是函数的签名: 我到底做错了什么?当我手动触发(在门户中单击“运行”)时,该功能工作正常,但它在今天凌晨3点没有运行,昨天也没有运行。 编辑:所以,正如建议的那样,我已经将计划更改为付费计划,并且我选择了一个动态计划。日志仍然没有说明功能在今天早上3点被激活。

  • 我用固定速率启动计时器。当用户更改系统时间时,此时任务将连续执行。它没有考虑时段。如何管理。 注:现在系统时间为当前时间。周期为30秒。现在用户将系统时间从当前时间改为10分钟后。当时计时器任务不考虑周期。在一秒钟内,它执行了20次任务。 当我使用 而不是 任务工作正常。如果我将系统时间更改为10分钟过去的时间,从现在起任务不会执行。。。 如何解决这个问题(

  • 本文向大家介绍mysql触发器简介、创建触发器及使用限制分析,包括了mysql触发器简介、创建触发器及使用限制分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了mysql触发器简介、创建触发器及使用限制。分享给大家供大家参考,具体如下: 简介 SQL触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时,即会执行或触发SQL触发器,例如插入,更新或删除。SQL触发器也可以