性能调优指南
调整 Jaeger 实例以获得更好的性能
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 仍然可以像直接写入存储时那样进行扩展。追踪 ID 被用作 Kafka 分区的分片键,因此给定追踪的所有 Span 都将落在 Kafka 主题的同一分区中。每个 jaeger-collector 都可以写入任何分区。
jaeger-ingester 也可以根据需要进行扩展以维持吞吐量。它们将自动在彼此之间协商并重新平衡 Kafka 分区。然而,运行的 jaeger-ingester 数量不应超过 Kafka 主题中的分区数量,因为在这种情况下,一些 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-collector 中 Span 队列的项目由工作器处理。每个工作器从队列中取出一个 Span 并将其持久化到存储中。工作器数量可以通过设置 collector.num-workers
(默认值:50
)指定,并且应根据需要尽可能高,以使队列接近零。一般规则是:后端存储越快,所需的工作器数量越少。鉴于工作器相对廉价,这个数量可以随意增加。一般来说,当存储速度快时,队列中每 50 个项目配置一个工作器就足够了。当 collector.queue-size
为 2000
时,拥有大约 40
个工作器应该足够了。对于较慢的存储机制,此比例应相应调整,每个队列项目配置更多工作器。