推理服务的可观测性:从用户体验、流式交付到 GPU 证据的完整排障闭环
推理服务的可观测性:从用户体验、流式交付到 GPU 证据的完整排障闭环用户说“回答很慢”,工程师需要回答四个问题:慢在哪里,影响谁,有什么证据,怎么验证修复。本文以 Kubernetes 上的流式 LLM 推理服务为主线,结合框架指标、OpenTelemetry、自定义阶段埋点、DCGM 和 eBPF,建立从用户体验到 GPU 执行的关联分析方法。适用于 vLLM 等推理框架;具体指标与参数必须以部署版本为准。文中的阈值、案例数字和容量配置均为教学示例,不代表实测结果或通用性能承诺。这张图只展示在线请求的主路径;实际关联必须同时维护两条辅助路径:请求路径:客户端 → Ingress/网关 → 业务/RAG → 推理引擎 → GPU/rank Metrics: 各层低基数指标 ─────────────────────────→ Prometheus/Grafana/SLO Trace: trace_id/request_id ─────────────────────→ OTel Collector/Trace Store 映射: model → Pod UID → node/worker → GPU UUID/rank → batch_id(采样追踪) 下钻: 体验告警 → model/pod 看板 → 慢请求 Trace → 短窗口 eBPF/NsightPrometheus 只保存有限枚举标签;request_id、trace_id、batch_id只放日志/追踪。图或映射中任何一环不存在时,禁止把节点全部 GPU 活动强行归属给单个请求。术语与数据契约(先读本节)术语严格含义不应写成引擎 ITL引擎实际导出相邻 token/调度事件的间隔客户端 SSE 间隔chunk gap本层收到相邻有效 SSE 内容事件的间隔;一个事件可含多个 token每 token 生成时间用户可见 TTFT客户端实际展示首个有效内容减去用户发起时间首字节、role、心跳时间请求级平均 TPOT用首/末有效输出和可信N推导,且仅N1逐 token 精确时钟若只有代理/客户端视角,面板必须叫chunk_gap,而不是 ITL。输入 token 吞吐是输入工作负载代理,前缀缓存、KV 重用和分块 Prefill 存在时不等于实际 Prefill 计算量。一、用户的一句“慢”,可能是四类不同的问题上线了流式推理接口,GPU 利用率在 90% 左右,输出吞吐也很高,但用户仍在投诉。原因可能完全不同:请求发出后几秒没有内容:首个有效输出晚,优先检查网关、业务前置处理、排队和 Prefill。很快开始回答,但持续生成很慢:检查 Decode 调度、活跃序列、KV Cache、计算、访存和通信。回答一阵后突然停顿,再一次性出现大量文字:检查流式缓冲、客户端读取、批量输出、调度中断和抢占。每个 token 都正常,但整段回答耗时很长:可能只是输出长度变大,不能直接认定模型变慢。因此,第一步不是加卡,而是把“慢”转化为明确的测量口径。可观测性建设的顺序也应如此:先量化体验,再拆解阶段,最后用硬件证据解释原因。二、先统一指标口径:TTFT、TPOT、ITL 不是同一件事2.1 为每个测量位置定义时间点在客户端或网关的一次请求观测中,定义:时间点含义t0本层开始发送请求或接收请求t1本层收到第一个有效输出 token/内容事件tN本层收到最后一个有效输出tend本层收到流完成标记或请求结束N本次请求的输出 token 数,由服务端 tokenizer/usage 等可信来源统计“有效输出”要写入接口契约:角色信息、SSE 心跳、空 delta 不计入;如果产品隐藏思考内容,需要同时记录“首个模型输出”和“首个用户可见内容”。只有后者直接解释用户为什么迟迟看不到回答。同一个指标必须带测量位置:客户端 TTFT、网关 TTFT、引擎 TTFT 的起止点不同,数值不能直接比较。非流式接口收到完整响应前通常看不到首个 token,不能拿首字节时间冒充流式 TTFT。2.2 指标定义与使用场景指标推荐口径用来回答什么TTFTt1 − t0用户等多久才看到首个有效输出单请求平均 TPOT(tN − t1) / (N − 1),仅 N 1首个 token 之后,平均每 token 需要多久ITL相邻输出 token 的到达间隔;若只观测到 chunk,则记录 chunk gap生成过程中是否存在长停顿生成跨度tN − t0从请求开始到最后有效输出的时间E2Etend − t0整个请求何时结束,包括尾部收尾单请求生成速度(N − 1) / (tN − t1)一条请求的平均生成速度,token/s聚合输出吞吐窗口内实际生成的输出 token / 窗口秒数整个服务的输出能力输入吞吐窗口内处理的输入 token / 窗口秒数Prefill 侧工作量队列长度/排队时间等待请求数/请求等待调度的实际时长首字慢是否来自排队对同一测量位置、同一输出 token 口径:tN − t0 = TTFT + TPOT × (N − 1)若 E2E 定义到完成标记,还应加上tend − tN。N 为 0 或 1 时,TPOT 不定义,不能填 0 混入延迟直方图。失败、取消和没有输出的请求单独统计结果与耗时,避免只看成功样本。例如:首个输出等待 0.8 秒,200 个输出 token 的平均 TPOT 为 0.04 秒,则生成跨度为0.8 + 199 × 0.04 = 8.76 秒。其中约 25 token/s 是这条请求的速度,不能用集群的 5,000 token/s 来替代。2.3 chunk 不是 token,TPOT 分位数也不是 ITL 分位数SSE 的一个内容事件可以包含多个 token。一次网络读取还可能包含多个 SSE 事件;token 的文本片段也不能通过“字符数”准确反推 token 数。推测解码、输出合并与代理缓冲都可能进一步改变到达形态。因此建议保留两套统计:请求级平均 TPOT:每个完成请求产生一个样本,适合比较请求体验。输出事件间隔:每个间隔产生一个样本,适合发现停顿;面板必须标清 token gap 还是 chunk gap。长请求贡献更多间隔样本。ITL P99 与请求 TPOT P99 权重不同,不能互换。vLLM 当前文档也区分了输出事件间隔与请求级 TPOT,旧版指标名和语义可能不同。[1][2]2.4 分位数之前,先控制工作负载差异至少按模型版本、输入长度档、输出长度档、业务优先级和副本查看分布。常见误判是:模型没有退化,只是输入从短问答变成了长上下文 RAG。长度档使用有限枚举,例如0–1k / 1k–4k / 4k–16k / 16k;档位应与业务匹配。不要把精确 token 长度、用户 ID 或 request_id 放到 Prometheus 标签中。还要记住三条统计边界:不能平均多个副本的 P99;应合并相同桶边界的 Histogram,再计算分位数。P99(TTFT) − P99(queue)不是 Prefill P99。P99(TTFT) + P99(decode)不是 E2E P99。分位数对应的可能是不同请求。三、把请求拆开:找到首字之前和生成之中的等待3.1 建立阶段契约,而不是画一张含糊的耗时图对单个请求,建议记录以下阶段。名字可以自定义,起止事件必须固定。阶段建议起止点常见慢因网关处理网关接收 → 向后端转发鉴权、限流、连接池、路由业务前置业务服务接收 → 向引擎提交RAG 检索、工具调用、Prompt 拼接前处理引擎接收 → 请求进入调度等待分词、多模态预处理、参数校验初次排队入队 → 第一次被调度容量不足、优先级、KV 空间限制Prefill首次相关执行 → 首 token 产生输入长度、前缀缓存、执行配置Decode 生命周期首 token → 最后 token多轮调度、抢占、计算/访存/通信流式交付引擎产生事件 → 网关转发/客户端收到输出队列、代理缓冲、网络、慢客户端连续批处理、分块 Prefill、Prefill/Decode 分离和抢占会让阶段反复发生。此时记录事件与区间:入队、调度、暂停、恢复、首次输出、最后输出,而不是假定每个请求只有一次完整 Prefill 和一次连续 Decode。请求生命周期时长也不等于该请求独占的 GPU 时间。多条请求共用一个 batch,一次 GPU 执行可能同时推进多个请求。若需要归因,可在采样追踪中记录 batch_id、调度步与参与请求,使用 span link 或事件关联;不要把整个 batch 的 GPU 时长重复相加后当成集群总耗时。3.2 如何解释客户端与服务端的差值同一请求的客户端 TTFT 明显高于服务端 TTFT,说明额外耗时存在于引擎测量范围之外,可能包含连接建立、网关、业务前置、转发缓冲、网络和客户端调度。这个差值是缩小范围的线索,不能直接命名为“网络延迟”。下一步对比网关收到后端首内容、网关写出首内容、客户端读取首内容的事件,再检查连接与缓冲。用单调时钟测本进程耗时,用同步后的墙钟关联不同主机的时间线。不要直接拿不同机器的单调时间戳相减;时钟偏差也会影响跨主机事件排序。四、分层采集:每种工具负责一种证据工具/数据适合回答不能单独证明客户端与网关埋点用户看到首内容和持续输出的时间模型哪个 kernel 慢推理框架指标排队、请求延迟、吞吐、缓存状态单个慢请求的完整因果链OTel 与自定义阶段埋点请求经过哪些阶段,在哪里等待异步 GPU 的真实执行完成时间DCGM

相关新闻

SpringBoot+Vue影院购票系统全栈开发实战:从数据库设计到并发选座

SpringBoot+Vue影院购票系统全栈开发实战:从数据库设计到并发选座

1. 先盘一盘这套影院购票系统到底在解决什么问题1.1 影院售票的业务痛点与项目由来影院售票这件事,放在十年前和现在完全是两种体验。过去大家习惯去前台排队买票,选座靠一张纸质的座位图,售票员手写场次和座位号,高峰时段排队半小…

2026/10/11 3:21:33 阅读更多 →
SpringBoot+Vue养老院管理系统毕业设计:从需求分析到部署上线全解析

SpringBoot+Vue养老院管理系统毕业设计:从需求分析到部署上线全解析

1. 项目概述与毕业设计选题思路1.1 为什么选了养老院管理系统这个选题每年到毕业设计选题季,很多同学都在纠结到底做什么项目。我当初选养老院管理系统这个题目,核心原因有三点:第一,业务场景足够典型,养老院的日常管理…

2026/10/11 3:21:33 阅读更多 →
AI 帮你跑回归测试,一个改动约 2.65 美元值不值

AI 帮你跑回归测试,一个改动约 2.65 美元值不值

背景周一一早,研发一口气合了 20 个改动。你手里的回归清单还没跑完,问一句"这次动了支付,会碰到哪些用例",没人答得上来。全量跑一遍四小时,只挑支付又怕漏。这个挑活儿的活,正是 ContextQA 在 …

2026/10/11 3:21:33 阅读更多 →

最新新闻

用 OpenLogi 给罗技鼠标重映射按键:一份本地 config.toml 免费搞定全部设置

用 OpenLogi 给罗技鼠标重映射按键:一份本地 config.toml 免费搞定全部设置

用 OpenLogi 给罗技鼠标重映射按键:一份本地 config.toml 免费搞定全部设置 【免费下载链接】OpenLogi ⚡️A native, local-first alternative to Logitech Options, written in Rust 🦀 — remap buttons, DPI, and SmartShift over HID. No account, …

2026/10/11 4:21:10 阅读更多 →
AnyPS5串流方案全解析:从编码参数到网络优化的实战指南

AnyPS5串流方案全解析:从编码参数到网络优化的实战指南

1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候,我正蹲在一堆旧主机配件里翻找能用的散热风扇。当时脑子里冒出的第一个念头是:这玩意儿到底是想让 PS5 跑在任意设备上,还是想让任意设备变成 PS5?后来花了两周时…

2026/10/11 4:21:10 阅读更多 →
大模型处理文本的第一步:分词 —— 为什么 “汉字“ 和 “token“ 不是一回事

大模型处理文本的第一步:分词 —— 为什么 “汉字“ 和 “token“ 不是一回事

前言:几乎所有用过 ChatGPT、DeepSeek、Kimi 的人都见过 "token" 这个词 ——API 按 token 计费、上下文窗口按 token 计算。但 token 到底是什么?为什么它不是 "字",也不是 "词"?本文从底层机制出…

2026/10/11 4:21:10 阅读更多 →
SpringBoot2+Vue3+MyBatis-Plus校园失物招领系统全栈开发实战复盘

SpringBoot2+Vue3+MyBatis-Plus校园失物招领系统全栈开发实战复盘

做校园失物招领系统这个需求,前前后后我至少经手过三四个版本。从最早的 JSPServlet,到后来的 SSM,再到这次用 SpringBoot2 Vue3 MyBatis-Plus MySQL8.0 重写,每次都有新的体会。说实话,这类系统在高校里属于“小但…

2026/10/11 4:21:10 阅读更多 →
Spring Boot + Vue 全栈实战:蘑菇百科信息管理系统开发详解

Spring Boot + Vue 全栈实战:蘑菇百科信息管理系统开发详解

1. 项目定位与核心功能拆解1.1 这个蘑菇百科到底能做什么先把这个项目说清楚。所谓“蘑菇百科”,本质是一个面向科普场景的蘑菇信息检索与管理系统。它解决的实际问题很朴素:蘑菇种类太多、外观相似度又高,光靠翻图鉴或者问人,效率…

2026/10/11 4:21:10 阅读更多 →
智能体动手时代:从能说到能做,AI操作层的工程落地

智能体动手时代:从能说到能做,AI操作层的工程落地

1. 标题解构:为什么“智能体开始动手”是本周真正的分水岭“智能体开始‘动手’之后”——这句看似口语化的标题,实则是对当前AI产业演进阶段最精准的切片式描述。它不是在说模型参数又涨了多少,也不是在比谁家API响应快了200毫秒&#xff0c…

2026/10/11 4:20:09 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →