【问题标题】:Java Flight Recorder - Continuous rolling recordingJava Flight Recorder - 连续滚动记录
【发布时间】:2022-08-15 03:20:43
【问题描述】:

问题

如何获得滚动记录到磁盘,用最大年龄?

语境

当我的服务器出现问题时,我希望能够转储前几个小时的分析信息并对其进行分析,以了解出了什么问题。

  1. 我不知道什么时候会变坏,JDK 应该不断地将事件保存到磁盘。
  2. 由于服务器不经常重新启动,为避免文件无限增长,我需要设置某种上限(年龄或大小)。

    因此,换句话说,我希望 JDK 将记录连续保存到磁盘,但删除较旧的文件/记录,以使总量保持在某个阈值(年龄或大小)以下。

    为此,这些是我为版本Oracle JDK 1.8.0_144 提供的选项:

    -XX:+UnlockCommercialFeatures
    -XX:+FlightRecorder
    -XX:StartFlightRecording
       name=<foo-bar>
    -XX:FlightRecorderOptions
       defaultrecording=true   // what does this do even?
       disk=true
       maxage=1h // this is what I thought would solve my problem! 
       repository=<path-to-where-I-want-the-recording>
       maxchunksize=5M
    

    我原以为设置 maxage=1h 只会将最后 1 小时的记录保留在磁盘上。但不是!它已经过去 1 天,并且文件没有被封顶。

    同时maxchunksize 似乎工作。各种.jfr 文件大约有5M。其中有很多这样的文件,因为没有强制执行年龄上限。

    我究竟做错了什么?

  • 你为什么不做一个删除旧文件的 cron 作业?
  • @Kayaman 提出解决方法对解决根本原因没有多大帮助。
  • 提出包括// what does this do even? 在内的问题并不能充分发挥我的客户支持质量。
  • @Kayaman cron 作业增加了系统的复杂性。需要记住、维护和记录的额外内容会导致系统脆弱。此外,这是一种简单的行为,人们认为这是 JFR 的大多数用户所期望的并且实际上是需要的,因此很可能存在“本机”解决方案。
  • 1. 这就是我在这里发帖的目的。 2. 不必粗鲁。我的问题很清楚,简洁,精心策划。你的挫败感是没有根据的。 3. 我没有找到关于defaultrecording 含义的文档。你?

标签: java jvm jvm-hotspot jfr jmc


【解决方案1】:

我认为,问题在于您正在开始两份录音,一份是-XX:StartFlightRecording,另一份是-XX:FlightRecorderOptions=defaultrecording=true

带有-XX:StartFlightRecording 的那个是无限的。我认为以下选项适用于 Oracle JDK 1.8.0_144 和您的用例:

-XX:+UnlockCommercialFeatures
-XX:FlightRecorderOptions=repository=<path>
-XX:StartFlightRecording=maxage=1h,name=<name>

-XX:+UnlockCommercialFeatures 是必需的,因为 JFR 是 Oracle JDK 8 中的商业功能。从 JDK 11 开始,不再需要它。

JDK 8u40 或更高版本的 -XX:StartFlightRecoding 不需要 -XX:+FlightRecorder。 JFR 缓冲区现在在第一次记录开始时设置,而不是在 JVM 启动时设置。如果使用 defaultrecording=true 开始录制,-XX:+FlightRecorder 仍然需要它。

-XX:FlightRecorderOptions=defaultrecording=true 做了很多事情,主要是出于历史原因,但仅在进行内存记录时才需要。从 JDK 9 开始,该选项不再需要并且已被删除。

如果使用-XX:StartFlightRecording,则不需要-XX:FlightRecorderOptions=disk=true,maxage=1h,这是启动JFR 的推荐方式。

除非您有问题,否则我会将 maxchunksize 保留为默认值 (12 MB)。这是 JFR 已针对其进行优化和测试的块文件大小。

【讨论】:

    【解决方案2】:

    我接受Kire Haglin 的回答。

    为在这个 JDK 上对我有用的东西增加一点价值:

    -XX:+UnlockCommercialFeatures
    -XX:StartFlightRecording
      name=<foo-bar>
      maxage=12h
      dumponexit=true
    -XX:FlightRecorderOptions
      dumponexitpath=<path-to-file>.jfr
      disk=true
      repository=<some-folder-path>
    

    注意额外的参数dumponexitdumponexitpath,在我原来的问题中不存在。我最终也需要那些。
    经过反复试验,似乎dumponexit 必须存在于XX:StartFlightRecording 参数中,dumponexitpath 必须存在于FlightRecorderOptions 参数中。似乎没有其他安排有效。

    另请注意,删除 -XX:+FlightRecorderdefaultrecording=true(如 Kire 建议的那样)仍然工作。话虽如此,我不认为defaultrecording=true 的存在会触发双重录音。
    我这样说是因为在发出命令jcmd &lt;PID&gt; JFR.check &lt;name&gt; 时我只有一个条目。

    【讨论】:

    • 您是否尝试过不带 <name> 的“jcmd <PID> JFR.check”?如果你想要一个固定的文件名(不是自动生成的),你应该能够使用 -XX:StartFlightRecording=filename=dump.jfr,dumponexit=true,maxage=1h 然后只有 -XX:FlightRecorderOptions=repository=<some -文件夹路径>。如果要自动生成文件名,则不能使用 -XX:StartFlightRecording 并且需要使用 dumponexitpath 的 defaultrecording=true 路径。所有这些混乱都在 JDK 9 中得到修复。
    • 关于没有&lt;name&gt; 的命令,这是一个很好的观点。我已经不记得了。如果我真的用名字发出它,也许我确实触发了两次录音。感谢其他信息。真是一团糟。 xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多