跳到主要内容

资源限制

介绍

在分布式追踪系统中,Jaeger 作为核心组件,其资源使用直接影响系统的稳定性和性能。资源限制是指通过配置约束 Jaeger 服务对内存、CPU 和存储等资源的使用,避免因资源耗尽导致服务崩溃或性能下降。本指南将详细介绍如何为 Jaeger 设置合理的资源限制,适合初学者逐步实践。


为什么需要资源限制?

Jaeger 在处理大量追踪数据时可能占用大量资源,尤其是:

  • 内存:存储未落盘的追踪数据。
  • CPU:处理数据压缩和查询请求。
  • 存储:长期保存追踪数据。

未配置资源限制可能导致:

  • 服务因内存溢出(OOM)被终止。
  • 节点资源被独占,影响其他服务。
  • 存储成本不可控。

核心配置项

1. 内存限制

通过环境变量或启动参数限制 Jaeger Collector 和 Query 服务的内存:

yaml
# 示例:Kubernetes Deployment 配置
env:
- name: SPAN_STORAGE_TYPE
value: "elasticsearch"
- name: ES_MAX_NUM_SPANS # 限制单个批次的Span数量
value: "50000"
- name: MEMORY_MAX_TRACES # 内存中保留的最大追踪数
value: "10000"
备注

Jaeger Agent 默认内存限制为 --collector.queue-size=2000(队列大小),超过时会丢弃数据。

2. CPU 限制

在容器化部署中(如 Docker 或 Kubernetes),直接通过资源声明限制 CPU:

yaml
# Kubernetes 示例
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "1"
memory: "2Gi"

3. 存储限制

根据后端存储类型配置:

  • Elasticsearch:通过索引生命周期管理(ILM)自动删除旧数据。
  • Cassandra:设置 TTL(Time-To-Live)。
json
// Elasticsearch ILM 策略示例
{
"policy": {
"phases": {
"hot": { "actions": { "rollover": { "max_size": "50gb" } } },
"delete": { "min_age": "7d", "actions": { "delete": {} } }
}
}
}

实际案例

场景:高流量服务的资源限制

一个电商平台在促销期间流量激增,Jaeger Collector 频繁因 OOM 崩溃。通过以下调整解决问题:

  1. 调整内存队列
    bash
    jaeger-collector --collector.queue-size=5000 --collector.num-workers=20
  2. Kubernetes 资源限制
    yaml
    resources:
    limits:
    memory: "8Gi"
    requests:
    memory: "4Gi"
  3. Elasticsearch 滚动索引:每天自动创建新索引,限制单个索引大小为 50GB。

总结

资源类型配置方法影响范围
内存队列大小、环境变量防止 OOM
CPU容器资源声明避免节点过载
存储后端存储的 TTL 或 ILM控制成本和数据保留周期
练习
  1. 在本地 Docker 中启动 Jaeger,尝试通过 -e MEMORY_MAX_TRACES=5000 限制内存。
  2. 使用 Kubernetes 为 Jaeger 分配 2CPU/4Gi 资源并观察性能变化。

附加资源