乌克兰国旗 我们与乌克兰的朋友和同事同在。为了支持乌克兰度过难关 请访问此页面

性能调优指南

调整你的 Jaeger 实例以获得更好的性能

版本  1.69 最新 转到最新的 2.x 版本

Jaeger 从一开始就旨在以弹性方式接收大量数据。为了更好地利用可能导致延迟的资源,如存储或网络通信,Jaeger 会对数据进行缓冲和批量处理。当生成的 span 数量超过 Jaeger 安全处理能力时,span 可能会被丢弃。然而,默认设置可能不适用于所有场景。

部署注意事项

虽然对单个组件进行性能调优很重要,但 Jaeger 的部署方式对于获得最佳性能可能起到决定性作用。

扩展和缩减 Collector

利用你的平台的自动伸缩能力:jaeger-collector 几乎可以水平扩展,以便根据需要添加和移除更多实例。一个好的伸缩方式是检查 jaeger_collector_queue_length 指标:当队列长度长时间高于最大大小的 50% 时,增加实例。另一个可以考虑的指标是 jaeger_collector_in_queue_latency_bucket,它是一个直方图,表示 span 在队列中等待工作进程拾取的时间。当队列等待时间随时间推移变长时,这是一个很好的迹象,表明需要增加工作进程数量或提高存储性能。

当你的平台提供自动伸缩能力时,或者当启动/停止 jaeger-collector 实例比更改现有运行实例更容易时,建议增加 jaeger-collector 实例。当需要将 CPU 使用率分散到多个节点时,也应进行水平扩展。

确保存储能够跟上

每个 span 由 jaeger-collector 的一个工作进程写入存储,该工作进程会一直阻塞直到 span 存储完成。当存储速度过慢时,被存储阻塞的工作进程数量可能过高,导致 span 被丢弃。为了帮助诊断这种情况,可以分析直方图 jaeger_collector_save_latency_bucket。理想情况下,延迟应随时间保持不变。当直方图显示大多数 span 的处理时间随时间推移越来越长时,这是一个很好的迹象,表明你的存储可能需要关注了。

考虑使用 Apache Kafka 作为中间缓冲区

Jaeger 可以使用 Apache Kafka 作为 jaeger-collector 和实际后端存储(Elasticsearch、Apache Cassandra)之间的缓冲区。这非常适合流量高峰相对频繁(高峰时段流量),但存储在流量恢复正常后最终能够赶上的情况。为此,应在 jaeger-collector 中将 SPAN_STORAGE_TYPE 环境变量设置为 kafka,并且必须使用 jaeger-ingester 组件,从 Kafka 读取数据并将其写入存储。

除了性能方面,将 span 写入 Kafka 对于构建实时数据管道以进行跟踪聚合和特征提取也非常有用。

jaeger-collector 仍然可以像直接写入存储时那样进行扩展。Trace ID 被用作 Kafka 分区的分片键,因此给定 trace 的所有 span 都将进入同一 Kafka topic 分区。每个 jaeger-collector 都可以写入任何分区。

jaeger-ingester 也可以根据需要扩展以维持吞吐量。它们将自动协商并重新平衡 Kafka 分区。然而,运行的 jaeger-ingester 数量不应超过 Kafka topic 的分区数量,因为在这种情况下,一些 jaeger-ingester 将会空闲。

Collector 设置

jaeger-collector 从 SDK 接收数据。如果配置不当,它可能处理的数据量少于同一主机上可能处理的数据量,或者可能因消耗的内存超出允许范围而导致主机过载。

调整队列大小

jaeger-collector 能够接收 span 并将其放入内部队列进行处理。这使得 jaeger-collector 可以立即返回给 SDK,而不必等待 span 写入存储。

设置 collector.queue-size(默认值:2000)决定了队列应支持多少个 span。在典型场景下,队列将接近空,因为应该有足够的工作进程从队列中取出 span 并将其发送到存储。当队列中的项目数量(指标 jaeger_collector_queue_length)长期处于高位时,这表明要么需要增加工作进程数量,要么存储无法跟上其接收的数据量。当队列满时,队列中的旧项目将被覆盖,导致 span 被丢弃(指标 jaeger_collector_spans_dropped_total)。

鉴于队列大小在大多数时间都应接近空,此设置应尽可能高,达到 Collector 可用内存的限制,以最大程度地抵御突发流量高峰。然而,如果你的存储层配置不足且无法跟上,即使是很大的队列也会迅速填满并开始丢弃数据。

实验性功能:从 Jaeger 1.17 开始,jaeger-collector 可以根据内存需求和平均 span 大小自动调整队列大小。将标志 collector.queue-size-memory 设置为 jaeger-collector 应使用的最大内存大小(单位为 MiB),Jaeger 将根据其观察到的平均 span 大小定期计算理想的队列大小。出于安全考虑,最大队列大小硬编码为 100 万条记录。如果你正在使用此功能,向我们提供反馈外部链接 - Jaeger 分布式追踪平台

调整处理工作进程数量

jaeger-collector 中 span 队列里的项目由工作进程拾取。每个工作进程从队列中拾取一个 span 并将其持久化到存储。工作进程数量可以通过设置 collector.num-workers(默认值:50)指定,应尽可能高以使队列接近于零。一般规则是:后端存储越快,所需工作进程数量可以越少。考虑到工作进程相对廉价,可以随意增加此数量。一般而言,对于快速存储,队列中每 50 个项目分配一个工作进程就足够了。如果 collector.queue-size2000,拥有大约 40 个工作进程就足够了。对于较慢的存储机制,应相应调整此比例,为每个队列项目分配更多工作进程。