1. 为什么需要AI性能监控
从一次性性能测试到持续性能监控
传统的性能测试通常在上线前集中执行一次,完成压测报告即告结束。但AI系统的性能表现并非一成不变——模型版本更新、数据分布变化、硬件老化、流量波动等因素都会导致性能持续退化。因此,必须将一次性性能测试升级为持续性性能监控,建立贯穿AI系统全生命周期的性能可观测能力。
在我处产品测试实践中,我们发现AI系统的性能退化往往具有"温水煮青蛙"的特性:单次更新可能只带来几十毫秒的延迟增长,但累积数十次迭代后,端到端延迟可能翻倍。没有持续监控体系,这类退化在用户投诉之前很难被主动发现。
AI系统的性能退化风险
与传统软件系统相比,AI系统面临更复杂和隐蔽的性能退化风险:
- 模型更新退化:新版本模型参数量增加、推理路径变长,导致延迟上升
- 数据漂移退化:用户输入分布变化(如平均Prompt长度增长),使推理耗时增加
- 资源竞争退化:多模型共享GPU集群时,资源争抢导致响应时间抖动
- 知识库膨胀退化:RAG系统的向量库持续增长,检索延迟逐渐上升
- Agent链路退化:工具API响应变慢或第三方服务降级,影响Agent端到端性能
2. 监控指标体系
AI性能监控需要覆盖LLM推理层、RAG检索层和Agent编排层三个维度,建立分层分级的指标体系。
2.1 LLM推理监控指标
| 指标分类 | 指标名称 | 定义 | 采集方式 | 推荐告警阈值 |
|---|---|---|---|---|
| 延迟指标 | TTFT | 首Token生成时间,从请求发送到第一个Token返回 | SSE首帧时间戳 | P95 < 1s(实时场景) |
| TPOT | 每个后续Token的平均生成间隔 | (总生成时间 - TTFT)/(输出Token数 - 1) | P95 < 50ms | |
| E2E延迟 | 端到端完整响应时间 | 请求发起到最后一个Token返回 | P95 < 5s | |
| 吞吐指标 | Tokens/s | 每秒处理的Token总数(输入+输出) | 采样周期内总Token数/时长 | 低于基线80%告警 |
| RPM | 每分钟处理的请求数 | API网关请求计数 | 异常突降告警 | |
| 质量指标 | 错误率 | 返回非200状态码或超时的请求占比 | HTTP状态码统计 | > 1%告警 |
| 流中断率 | SSE流未正常闭合(无[DONE]标记)的请求占比 | 解析SSE流结尾标记 | > 0.5%告警 | |
| 资源指标 | GPU利用率 | GPU计算核心的使用百分比 | nvidia-smi / DCGM | 持续 > 95%或持续 < 30% |
| GPU显存占用 | 已使用的GPU显存与总显存的比值 | nvidia-smi / DCGM | > 90%告警 | |
| 分位数指标 | P50 / P95 / P99 | 50%/95%/99%分位的延迟值,反映长尾分布 | 统计窗口内排序计算 | P99 < 3x P50 |
| 延迟标准差 | 延迟分布的离散程度 | 标准差公式计算 | 标准差 > 基线2倍告警 |
2.2 RAG系统监控指标
| 指标分类 | 指标名称 | 定义 | 意义 | 推荐阈值 |
|---|---|---|---|---|
| 检索性能 | 检索延迟 | 向量检索 + 重排序的总耗时 | 衡量检索管线的响应速度 | P95 < 500ms |
| 召回率@K | Top-K结果中相关文档的占比 | 衡量检索质量,影响最终回答准确性 | Recall@5 > 90% | |
| 缓存命中率 | 命中向量缓存或语义缓存的请求比例 | 缓存效率直接影响检索延迟和GPU节省 | > 30%(对高频Query) | |
| 端到端性能 | 检索端到端延迟 | 从用户输入到检索结果返回(不含LLM生成) | 衡量全链路响应 | P95 < 800ms |
| 检索+生成总延迟 | 完整RAG管线的端到端时间 | 用户感知的最终延迟 | P95 < 5s | |
| 检索占比 | 检索耗时 / 总耗时的百分比 | 定位瓶颈环节 | 不应超过40% | |
| 存储指标 | 向量库大小 | 向量索引中的文档/分块总数 | 直接影响检索性能和成本 | 月增长 < 20%告警 |
| 索引构建时间 | 新增文档到可检索状态的时间 | 影响知识时效性 | < 5min(准实时场景) |
2.3 Agent系统监控指标
Agent系统的监控更为复杂,因为其性能不仅依赖LLM推理,还依赖工具调用、多步决策和多Agent协作:
- 任务完成时间:从用户输入任务到Agent输出最终结果的总耗时,需区分简单任务和复杂任务的分别统计
- 执行步数:Agent完成单个任务所需的推理-行动循环次数,步数异常增加通常意味着Agent陷入无效循环
- 工具调用延迟:每个工具API的P50/P95/P99延迟,需按工具类型分别监控
- 工具调用成功率:工具API返回正常结果的比例,含超时、鉴权失败、格式错误等异常
- Token消耗:每个任务消耗的Prompt + Completion Token总量,用于成本控制和异常检测
- 任务成功率:Agent最终完成任务目标的比率,是最关键的端到端质量指标
3. 监控架构
一个完整的AI性能监控体系需要覆盖数据采集、数据存储、数据分析和数据展示四个层次。以下是推荐的架构设计:
3.1 数据采集层
数据采集是监控体系的基础,需要在多个节点埋点收集性能数据:
- API网关日志:在Nginx/Kong/APISIX等网关层记录请求耗时、状态码、请求体大小等基础指标,这是覆盖面最广的数据源
- 应用层埋点(SDK/中间件):在LLM SDK调用处注入性能采集逻辑,精确记录TTFT、TPOT、Token数等AI特有指标。推荐使用OpenTelemetry + 自定义Span
- Agent执行日志:Agent框架(LangChain/LlamaIndex等)内置回调机制,可采集每步推理耗时、工具调用耗时和Token消耗
- 基础设施指标:通过DCGM/Prometheus Node Exporter采集GPU利用率、显存、CPU、内存、网络等资源指标
3.2 存储层
性能监控数据属于典型的时序数据(带时间戳的数值型指标),推荐使用时序数据库(TSDB)存储:
| 组件 | 推荐方案 | 适用场景 | 特点 |
|---|---|---|---|
| 时序数据库 | Prometheus / VictoriaMetrics | 数值型指标(延迟、吞吐、资源) | 高效压缩、支持PromQL查询、内置告警 |
| 日志存储 | Elasticsearch / Loki | 结构化日志、请求详情、Trace | 全文检索、关联查询、聚合分析 |
| Trace存储 | Jaeger / Grafana Tempo | 分布式链路追踪(Agent多步调用) | 调用链拓扑、瓶颈定位、火焰图 |
| 指标聚合缓存 | Redis + 预聚合任务 | 仪表盘实时查询、大屏展示 | 低延迟、高并发读 |
3.3 分析层
分析层是监控体系的"大脑",负责从海量数据中提取有价值的信息:
- 聚合分析:按时间窗口(1min/5min/1h)聚合P50/P95/P99分位数、平均/最大/最小值
- 趋势分析:对关键指标进行线性回归,预测未来趋势并提前预警。例如发现TTFT以每周2%的速度增长,推断何时会突破SLO阈值
- 异常检测:基于统计学方法(3-sigma、IQR)或机器学习(Isolation Forest)自动发现指标异常波动
- 关联分析:将延迟异常与版本发布、流量变化、资源配置变更等事件关联,快速定位根因
- SLO/SLI计算:基于监控数据自动计算服务等级指标(SLI)和服务等级目标(SLO)达标率
3.4 展示层
展示层的核心是仪表盘(Dashboard),推荐使用Grafana构建。一个典型的AI性能监控仪表盘应包含:
- 实时概览面板:当前QPS、P95延迟、错误率、GPU利用率,一目了然的"健康指示灯"
- 延迟分布面板:TTFT/TPOT/E2E延迟的P50/P95/P99趋势图,支持按模型、按场景、按Prompt长度筛选
- 吞吐量面板:Tokens/s和RPM的时间序列,叠加GPU利用率曲线
- RAG全链路面板:检索延迟、LLM推理延迟、端到端延迟的堆叠面积图,直观展示瓶颈环节
- Agent执行面板:步数分布直方图、工具调用延迟热力图、Token消耗趋势
- 告警事件面板:近期告警列表、告警趋势、未处理告警统计
4. 告警策略
4.1 阈值告警 vs 趋势告警
告警策略是监控体系能否发挥价值的关键。常见的两种告警模式各有适用场景:
| 告警类型 | 原理 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| 阈值告警 | 指标超过固定阈值时触发(如P95延迟 > 5s) | 简单直接、易于理解和配置 | 阈值选择困难:设太高漏报,设太低误报频繁 | 硬性SLO指标、错误率、资源水位 |
| 趋势告警 | 指标持续单向变化(连续N个采样点上升/下降)时触发 | 可提前发现渐进式退化,避免"温水煮青蛙" | 配置复杂,需要设定合理的观察窗口和变化幅度 | TTFT渐进退化、提示词长度增长、缓存命中率下降 |
| 环比告警 | 当前值与历史同期值对比(如同比昨日同时段) | 自动适应周期性波动(工作日/周末差异) | 需要较长的历史数据积累 | 流量相关的吞吐指标、有周期性规律的场景 |
| 异常检测告警 | 机器学习模型自动学习基线,检测偏离正常模式的异常 | 无需手动设定阈值,可发现未知异常模式 | 模型训练和调优成本高,可解释性差 | 复杂系统的综合健康度监控 |
4.2 分级告警(P0-P3)
为了避免"告警疲劳",必须对告警进行分级管理,不同级别对应不同的响应时效和处理流程:
- P0 - 紧急(Critical):服务完全不可用或核心SLO严重超标(如错误率 > 10%、P95延迟 > SLO 3倍)。需要5分钟内响应,立即电话+即时消息通知值班人员,启动应急响应流程
- P1 - 严重(Major):核心指标超出SLO阈值但服务仍可用(如P95延迟 > SLO 1.5倍、错误率 > 1%)。需要15分钟内响应,即时消息+邮件通知相关团队
- P2 - 一般(Minor):非核心指标异常或指标接近阈值(如GPU利用率 > 85%、缓存命中率下降10%)。需要1小时内响应,邮件通知,纳入当日工作排程
- P3 - 提醒(Warning):趋势性预警或低优先级异常(如TTFT周环比增长 > 5%、新版本P95比旧版本高10%)。24小时内关注,纳入周度性能复盘议程
4.3 告警降噪
告警降噪是监控体系成熟度的重要标志。一个没有降噪机制的监控系统,最终会因为"狼来了"效应而被团队忽视:
- 告警收敛:同一根因引发的多条告警合并为一条,避免告警风暴(如一次网络闪断触发20条服务不可用告警,应合并为1条"网络异常影响XX服务")
- 告警抑制:低优先级告警在高优先级告警处理期间自动静默(如P0告警期间抑制P3提醒)
- 静默窗口:计划内变更(如版本发布、压测执行)期间,自动将相关告警静默,避免无效告警
- 重复去重:同一告警在短时间内(如10分钟内)只发送一次通知,后续重复触发的仅记录但不通知
- 告警确认与升级:告警发送后如果在规定时间内无人确认,自动升级到更高优先级并扩大通知范围
5. 持续优化
5.1 基于监控数据的性能优化
监控体系的价值最终体现在驱动性能优化上。监控数据能够帮助团队:
- 瓶颈精准定位:通过RAG全链路延迟分解(检索 vs 重排序 vs 生成),圈定最值得优化的环节,避免盲目优化非瓶颈环节
- A/B实验验证:在生产流量中切分小比例流量到优化方案,监控对比优化前后的P95延迟,以数据驱动的方式验证优化效果
- 参数自动调优:基于监控反馈自动调整推理参数(如batch size、max_tokens、温度等),在延迟和吞吐之间找到最佳平衡
- 成本优化:通过Token消耗监控识别高成本的低效Prompt,优化Prompt模板以降低Token消耗和推理延迟
5.2 容量规划
性能监控数据是容量规划的核心输入。通过分析历史趋势,团队可以:
- 线性外推:基于过去3-6个月的QPS增长曲线,预测未来3个月的流量峰值,提前申请GPU资源
- 弹性伸缩基准:根据监控数据设定HPA(水平自动扩缩)的触发阈值,使系统能在流量高峰自动扩容、低谷自动缩容
- 大促预演:结合业务预估(如双十一、年终决算),提前进行容量压测,验证扩展策略是否满足需求
- 成本效率比:监控GPU利用率与业务QPS的关系,识别资源浪费(如GPU利用率持续 < 30%但未自动缩容)
5.3 版本更新的性能回归测试
将性能监控与CI/CD流水线深度集成,在每次版本更新时自动执行性能回归测试:
- 发布前基线对比:在预发布环境对新版本执行相同负载的压测,将P50/P95/P99延迟与当前生产基线自动对比。差异超过阈值(如P95增长 > 10%)则阻断发布
- 灰度发布监控:新版本先向5%流量发布,监控15分钟核心指标。若P95延迟显著劣化或错误率上升,自动回滚
- 全量发布后观察:发布完成后持续监控24小时,对比发布前后的性能趋势,生成版本性能报告
- 性能回归知识库:将每次版本更新的性能变化记录归档,建立"模型/配置 → 性能基线"的知识图谱,辅助未来选型和排障
6. 实战演练
任务:搭建AI推理服务性能监控看板
目标:使用Prometheus + Grafana搭建一套覆盖LLM推理和RAG检索的实时性能监控看板,并配置分级告警。
环境要求:
- 已部署的LLM推理服务(vLLM/TGI/Ollama,需暴露metrics端点)
- 已部署的RAG服务(需在检索和生成环节添加耗时打点)
- Prometheus 2.x + Grafana 10.x
- Alertmanager(用于告警路由和降噪)
步骤要点:
- 采集层配置:在推理服务中启用OpenTelemetry Instrumentation,配置Exporter将TTFT/TPOT/Token数等指标推送至Prometheus Pushgateway或暴露/metrics端点供Prometheus拉取
- RAG链路打点:在检索函数和LLM调用函数前后添加计时装饰器/中间件,将检索延迟、生成延迟、端到端延迟作为自定义指标上报
- Prometheus配置:编写prometheus.yml配置文件,设置抓取间隔(推荐15s)、指标过滤规则和目标服务列表。配置Recording Rules对原始指标进行预聚合(如计算5分钟窗口的P95)
- Grafana看板搭建:
- 创建"AI推理概览"面板:实时P95延迟、QPS、错误率、GPU利用率
- 创建"延迟分布"面板:TTFT/TPOT/E2E的分位数趋势图
- 创建"RAG全链路"面板:检索-生成延迟堆叠图
- 创建"Token消耗"面板:按模型/按场景的Token消耗趋势
- 告警规则配置:编写Alertmanager规则文件,配置至少3条告警规则:
- P0:错误率 > 5% 持续1分钟 → 电话+即时消息通知
- P1:P95延迟 > SLO阈值 持续3分钟 → 即时消息+邮件通知
- P2:GPU显存 > 90% 持续5分钟 → 邮件通知
- 验证与调优:手动注入延迟(如临时降低GPU频率)和错误(如关闭一个推理实例),验证告警是否按预期触发、通知渠道是否畅通、告警降噪是否生效
预期产出:
- 一个完整的Grafana AI性能监控看板(可导出JSON分享给团队)
- 一套Prometheus告警规则配置文件
- 一份包含看板截图和告警验证结果的监控体系搭建报告