排除内存不足错误
了解内存不足 (OOM) 问题以及如何排除故障。
设置最大属性大小有助于控制内存不足错误
当获取包含具有非常大属性的 Span 的追踪时,Tempo Querier 可能会耗尽内存。在使用 tracebyID
端点获取单个追踪时已观察到此问题。
为了避免这些内存不足崩溃,请使用 max_span_attr_byte
限制任何单个属性允许的最大大小。任何超出配置限制的键或值在存储前会被截断。
使用 tempo_distributor_attributes_truncated_total
指标跟踪有多少属性被截断。
# Optional
# Configures the max size an attribute can be. Any key or value that exceeds this limit will be truncated before storing
# Setting this parameter to '0' would disable this check against attribute size
[max_span_attr_byte: <int> | default = '2048']
请参考分发器配置文档了解更多信息。
最大追踪大小
长时间运行(几分钟或几小时)或大型(10 万 - 100 万个 Span)的追踪在被遇到时会急剧增加每个组件的内存使用量。这是因为 Tempo 将追踪视为单个单元,并将追踪的所有数据保存在一起,以实现结构化查询和分析等功能。
读取大型追踪时,可能会急剧增加读取组件的内存使用量
- query-frontend
- querier
- ingester
- metrics-generator
写入大型追踪时,可能会急剧增加写入组件的内存使用量
- ingester
- compactor
- metrics-generator
从较小的追踪大小限制 15MB 开始,并根据需要增加。平均 Span 大小为 300 字节时,这将允许每个追踪包含 5 万个 Span。
务必确保已配置限制,建议的最大限制为 60 MB。
在每个租户的覆盖配置中配置限制
overrides:
'tenant123':
max_bytes_per_trace: 1.5e+07
请参考 [覆盖配置](# https://grafana.org.cn/docs/tempo/<TEMPO_VERSION>/configuration/#standard-overrides) 文档了解更多信息。
大型属性
非常大的属性(10KB 或更长)在被遇到时会急剧增加每个组件的内存使用量。Tempo 的 Parquet 格式使用字典编码列,这对于重复值非常有效。然而,对于非常大且高基数的属性,这可能需要大量内存。
大型属性的常见来源是以下领域的自动插桩
- HTTP
- 请求或响应体
- 大型头部
- 大型 URL
- http.url
- url.full
- 数据库
- 完整查询语句
- db.statement
- db.query.text
- 队列
- 消息体
读取这些属性时,可能会急剧增加读取组件的内存使用量
- query-frontend
- querier
- ingester
- metrics-generator
写入这些属性时,可能会急剧增加写入组件的内存使用量
- ingester
- compactor
- metrics-generator
您可以自动限制属性大小,使用 [max_span_attr_byte
](( https://grafana.org.cn/docs/tempo/<TEMPO_VERSION>/configuration/#set-max-attribute-size-to-help-control-out-of-memory-errors)。您还可以使用这些选项
- 手动更新应用插桩以移除或限制这些属性
- 使用属性处理器在追踪 Pipeline 中丢弃属性