【发布时间】: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