监控 Netty 事件循环队列的大小

2024-01-18

我们已经实现了对 Netty 事件循环队列的监控,以便了解一些 Netty 模块的问题。 该显示器使用io.netty.util.concurrent.SingleThreadEventExecutor#pendingTasks方法,适用于大多数模块,但对于每秒处理几千个 HTTP 请求的模块来说,它似乎被挂起,或者非常慢。 我现在意识到文档严格指定这可能是一个问题,我感觉很蹩脚......所以我正在寻找另一种方法来实现这个监视器。

您可以在这里查看旧代码:https://github.com/outbrain/ob1k/blob/6364187b30cab5b79d64835131d9168c754f3c09/ob1k-core/src/main/java/com/outbrain/ob1k/common/metrics/NettyQueuesGaugeBuilder.java https://github.com/outbrain/ob1k/blob/6364187b30cab5b79d64835131d9168c754f3c09/ob1k-core/src/main/java/com/outbrain/ob1k/common/metrics/NettyQueuesGaugeBuilder.java

  public static void registerQueueGauges(final MetricFactory factory, final EventLoopGroup elg, final String componentName) {

    int index = 0;
    for (final EventExecutor eventExecutor : elg) {
      if (eventExecutor instanceof SingleThreadEventExecutor) {
        final SingleThreadEventExecutor singleExecutor = (SingleThreadEventExecutor) eventExecutor;
        factory.registerGauge("EventLoopGroup-" + componentName, "EventLoop-" + index, new Gauge<Integer>() {
          @Override
          public Integer getValue() {
            return singleExecutor.pendingTasks();
          }
        });

        index++;
      }
    }
  }

我的问题是,有没有更好的方法来监控队列大小?

这可能是一个非常有用的指标,因为它可以用来了解延迟,也可以在某些情况下用于应用背压。


现在,到了 2021 年,Netty 在内部使用 JCTools 队列,pendingTasks()执行速度非常快(几乎总是恒定时间),因此即使 javadoc 仍然声明此操作很慢,您也可以毫无顾虑地使用它。 以前的问题是对队列中的元素进行计数是一个线性操作,但在迁移到 JCTools 库后,这个问题消失了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

监控 Netty 事件循环队列的大小 的相关文章

随机推荐