资源限制
介绍
在分布式追踪系统中,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 崩溃。通过以下调整解决问题:
- 调整内存队列:
bash
jaeger-collector --collector.queue-size=5000 --collector.num-workers=20
- Kubernetes 资源限制:
yaml
resources:
limits:
memory: "8Gi"
requests:
memory: "4Gi" - Elasticsearch 滚动索引:每天自动创建新索引,限制单个索引大小为 50GB。
总结
资源类型 | 配置方法 | 影响范围 |
---|---|---|
内存 | 队列大小、环境变量 | 防止 OOM |
CPU | 容器资源声明 | 避免节点过载 |
存储 | 后端存储的 TTL 或 ILM | 控制成本和数据保留周期 |
练习
- 在本地 Docker 中启动 Jaeger,尝试通过
-e MEMORY_MAX_TRACES=5000
限制内存。 - 使用 Kubernetes 为 Jaeger 分配
2CPU/4Gi
资源并观察性能变化。
附加资源
- Jaeger 官方文档:性能调优
- 《分布式追踪实战》第 6 章(资源管理)