【问题标题】:How to debug which particular Camel Route has a kind of "CPU leak"? Is there a CU metrics per route?如何调试哪条特定的骆驼路线有一种“CPU泄漏”?每条路线是否有 CU 指标?
【发布时间】:2022-01-24 17:54:02
【问题描述】:

我们在 Camel 实例上运行了许多不同的数据抓取路径。并且在开始 Camel 运行后大约 1 周,Camel 占用的 CPU 资源趋于增长并且永远不会被释放:

当它们达到 100% 时,开始吸食,我们错过了数据。

第一种也是非常简单的方法是设置 1 个实例,并在 1 个实例中保留唯一的路由以供观察,而其余的将在另一个实例中,直到我们确定哪个导致问题然后进行调试这条特定路线内的一些点/豆。但由于退化需要一周时间,因此这种方法看起来非常缓慢。

是否有一种 CPU-per-route 指标可以让我们估计哪个路由占用了 CPU 资源?

UPD:我也在监控路线指标,但不幸的是,每条路线的指标 s 只是给了我时间,h 没有发散并且看起来同时增加/达到峰值/开始振荡。

sum by(routeId)(rate(CamelMessageHistory_seconds_sum{}[5m]))

rate(label_replace({__name__=~"camel_proxy.*count"},"name_label","$1","__name__", "(.+)")[5m:])

被绘制成 prolt Micrometer 指标,如下所示:

# HELP CamelRoutePolicy_seconds_max  
# TYPE CamelRoutePolicy_seconds_max gauge
CamelRoutePolicy_seconds_max{camelContext="camel-1",failed="false",routeId="realtime_positioning_raw",serviceName="MicrometerRoutePolicyService",} 1.3250687
# HELP CamelRoutePolicy_seconds  
# TYPE CamelRoutePolicy_seconds summary
CamelRoutePolicy_seconds_count{camelContext="camel-1",failed="false",routeId="realtime_positioning_raw",serviceName="MicrometerRoutePolicyService",} 868.0
CamelRoutePolicy_seconds_sum{camelContext="camel-1",failed="false",routeId="realtime_positioning_raw",serviceName="MicrometerRoutePolicyService",} 15.7921739

# HELP camel_proxy_mqtt_kafka_stream_seconds  
# TYPE camel_proxy_mqtt_kafka_stream_seconds summary
camel_proxy_mqtt_kafka_stream_seconds_count{camelContext="camel-1",} 868.0
camel_proxy_mqtt_kafka_stream_seconds_sum{camelContext="camel-1",} 14.5903913
# HELP camel_proxy_mqtt_kafka_stream_seconds_max  
# TYPE camel_proxy_mqtt_kafka_stream_seconds_max gauge
camel_proxy_mqtt_kafka_stream_seconds_max{camelContext="camel-1",} 1.297158

【问题讨论】:

  • 有代码覆盖率工具可以告诉您正在执行哪些方法。这些往往是侵入性的,因此您可能需要为此设置一个测试服务器。您也可以尝试直接从 JVM 获取线程转储,并打开垃圾收集日志记录(gc 也需要 CPU)。

标签: java apache-camel


【解决方案1】:

您可以使用 VisualVM (https://visualvm.github.io/) 对您的应用程序进行采样或分析,您会找到消耗 CPU 的方法。

使用骆驼你可以添加hawtio(https://hawt.io/),它可以提供帮助。

【讨论】:

  • 有没有办法让那些监控结果导出到Prometheus?
  • 也许是 hawt.io。但 VisualVM 采样或分析更像是一种开发人员工具,您需要将其实时连接,它不会发送数据。
  • 我相信我不需要静态方法的执行时间分布,而是随着时间的推移对其进行动态变化以了解哪条路线开始吃得越来越多
  • 是的,但是如果一周后该方法使用 90%-100% 的 CPU,它将在 10 分钟内的采样中排在前 3 位,所以你会找到它。
【解决方案2】:

假设您使用的是 Camel 3.x,我建议您做两件事:

  1. 激活 MicroProfile 指标,以便您可以分析 Camel 内置路由指标(通过调用 Web 服务以 Prometheus 格式返回数据)

  2. 启用交换池以减少对象分配

这是一个关于如何在 CDI 环境中执行此操作的示例

public class CamelSupport {

    @Inject
    private MetricRegistry metricRegistry;


    @Produces
    @ApplicationScoped
    public final CamelContext createContext() {
        CdiCamelContext context = new CdiCamelContext();
        context.setName("demo");
        ...
        MicroProfileMetricsRoutePolicyFactory mpmrp = new MicroProfileMetricsRoutePolicyFactory();
        mpmrp.setMetricRegistry(metricRegistry);
        context.addRoutePolicyFactory(mpmrp); // (1)

        
        context.setExchangeFactory( new PooledExchangeFactory() ); // (2)
        return context;
    }

【讨论】:

  • 是的,我尝试过使用指标,但它们只给我计时指标,因此没有一条路线看起来占用更多时间。
  • CamelRoutePolicy_seconds_max{camelContext="camel-1",failed="false",routeId="positioning_raw",serviceName="MicrometerRoutePolicyService",} 1.3250687 # HELP CamelRoutePolicy_seconds # TYPE CamelRoutePolicy_seconds summary CamelRoutePolicy_seconds_count{camelContext="camel-1",failed="false",routeId="positioning_raw",serviceName="MicrometerRoutePolicyService",} 868.0 CamelRoutePolicy_seconds_sum{camelContext="camel-1",failed="false",routeId="positioning_raw",serviceName="MicrometerRoutePolicyService",} 15.7921739
  • 因此,由于时间原因,无法直接了解 CPU 占用情况,尽管对此我可以看到动态
  • 我已经更新了我的问题
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 2020-05-13
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多