【问题标题】:Monitoring the size of the Netty event loop queues监控 Netty 事件循环队列的大小
【发布时间】:2016-01-01 05:03:00
【问题描述】:

我们已经对 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

  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++;
      }
    }
  }

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

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

【问题讨论】:

    标签: java netty monitoring event-loop


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可能需要将更改作为在SingleThreadEventExecutor 实例中添加和删除的任务进行跟踪。

      为此,您可以创建一个包装和/或扩展SingleThreadEventExecutor 的类。然后你会得到一个java.util.concurrent.atomic.AtomicInteger,每次添加新任务时调用incrementAndGet(),每次删除/完成时调用decrementAndGet()

      然后,AtomicInteger 将为您提供当前待处理任务的数量。您可能可以覆盖 pendingTasks() 来使用该值(尽管要小心 - 我不是 100% 不会有副作用)。

      这会给正在执行的每个任务增加一点开销,但会使检索待处理任务的数量接近恒定速度。

      这样做的缺点当然是它比您目前所做的更具侵入性,因为您需要配置您的应用程序以使用不同的事件执行器。

      注意。这只是关于如何解决这个问题的建议——我没有专门用 Netty 做这个。虽然我过去用其他代码做过这种事情。

      【讨论】:

      • 我不喜欢过分依赖内部细节的想法。我想我会做的是定期安排一个任务来检查事件循环线程中的队列大小。不太准确,但适合监控。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多