【问题标题】:How to chase a JFR event over multiple threads如何在多个线程上追逐 JFR 事件
【发布时间】:2019-10-06 20:47:28
【问题描述】:

我正在努力使用自定义 JFR 事件对异步 servlet 请求处理进行建模。 我面临的挑战是,在异步处理中,请求可能会被#dispatch()ed 多次。这意味着整个请求处理链可能会被执行多次,有时会在不同的线程中执行。如何使用自定义 JFR 事件对此进行建模?

对我有帮助的是“父”事件的概念(可能在不同的线程中)或事件的暂停和恢复。

编辑

为了说明这个问题。处理异步请求可能需要 100 秒的挂钟时间。然而,在Servlet#service() 方法中,实际处理可能只需要 4 秒的用户时间:

  • 线程 A 中的秒 0-1,Servlet#service() 方法返回,AsyncContext 开始
  • 线程 B 中的第二个 10-11,Servlet#service() 方法返回,AsyncContext 开始
  • 线程 A 中的秒 80-81,Servlet#service() 方法返回,AsyncContext 开始
  • 线程 C 中的秒 99-100,Servlet#service() 方法返回

我只对在这三个线程中为这四个持续时间生成事件感兴趣,然后将它们与单个请求相关联。

【问题讨论】:

    标签: java-11 jmc jfr java-mission-control


    【解决方案1】:

    您可以在事件中添加线程字段

    public class MyEvent extends Event [
      @Label("Start Thread")
      @TransitionFrom
      private final Thread startThread;
      MyEvent(Thread thread) {
        this.startThread = thread;
      }
    ]
    

    当您提交事件时,结束线程将被存储。

    如果您想在多个线程上跟踪一个事件,您需要为每个线程创建一个事件并拥有一个 id,以便您了解流程。

    class MyEvent extends Event {
    
      @Label("Transition id");
      long id;
    }
    

    如果您愿意,可以创建一个关系 id 来描述关系,JMC 应该能够提示(在上下文菜单等中)事件之间存在关系。

    @Label("Transition Id")
    @Relational
    @Target({ ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    @interface TransitionId {
    }
    

    如果您不想重复自己,您可以在基类中的方法中编写上述功能,您可以为事件访问的每个新线程调用该方法。

     abstract AbstractTransition extends Event {
    
       @TransitionId
       @Label("Transition Id")
       private long id;
       public void setTransitionId(long id) {
         this.id = id;
       }
     }
    

    没有其他方法可以做到这一点。

    JVM 不可能知道事件对象在哪个线程中,或者应该记录哪些线程。用户需要为每个应该被触及的线程提供至少一个方法调用(连同一些上下文)。

    【讨论】:

      【解决方案2】:

      这个问题类似于如何在分布式跟踪器中将跨度和范围的 JFR 事件绑定在一起。

      这篇文章可能会有所帮助: http://hirt.se/blog/?p=1081

      【讨论】:

      • 我是否正确理解这一点,即我将为请求生成自己的 id,然后让该请求的所有单个事件具有相同的 id?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多