四两线上监控知识图谱 · 费曼版

目标:让你能向别人讲清楚 Grafana 里每一个图是干嘛的。覆盖 4 张仪表盘 / 89 个面板 (后端核心 35 · 后端内存 36 · 业务后端 biz 11 · 容器层 7)——一个不落。
源文件:grafana/siliang-dashboard.json · siliang-memory-dashboard.json · siliang-biz-dashboard.json · siliang-containers-dashboard.json
配套详解:每张卡都可点开对应的「费曼详解课」——14 节概念课 + 20 节面板组课(grafana/guide/),小白也能懂

容器指标(未部署) /metrics 抓取 HTTP WebSocket SSE 用户浏览器 HTTP 页面与接口 · WebSocket 画布协作 · SSE 聊天 / 生成流 一个人开多个页签 = 多条连接(去重口径才等于“人数”) 容器层 · siliang-* 服务(两台 4C 宿主机各跑一套 · 单 IP NAT) 内存限额:backend 10G · biz 3G · rag 2G · review 2G · frontend 1G —— 每个服务两台机器各 1 个容器,预期存活 2 frontend 静态页面 限额 1G backend ×4 worker FastAPI · 限额 10G WS 协作 · SSE 聊天 LLM 编排 · 后台任务 → 核心 35 图 + 内存 36 图盯它 biz ×4 worker gunicorn · 限额 3G 业务 CRUD → biz 仪表盘 11 图盯它 rag RAG 检索 · 限额 2G LibreOffice 大文件 ⚠️ 历史上被 OOM 杀过,重点盯 review 审阅服务 · 限额 2G 独立 DB 池 5+5 抓取身份 instance = <机器>-<服务>-<worker 序号>,例:253-biz-0、253-backend-3 —— 仪表盘顶部 HOST 变量按机器前缀下钻;server job(共享端口)会双计,所有面板已排除 下游依赖(连接池就是从这里“借书”) MySQL backend 池 sync 30 / async 80 / checkpointer 30 biz 池 10 + overflow 20 = 30 锁冲突 1205 / 1213 有专项面板 Redis 共享池上限 50(与 Agent 服务共用) pubsub 跨实例广播 · 任务租约 Redis 抖 → 幽灵 session / 广播失明 LLM 提供商 gpt-5 · xAI · MiniMax Seedance · provider 生图 错误率 >10% = 限流 / key 失效 向量库 / 案例库 灵感检索召回 超时失败 → 灵感链路降级 COS 对象存储 上传下载 · 媒体转存 容器网络流量的大头 观测层 · 指标怎么变成图 cAdvisor(容器指标采集) ⚠️ 未部署 → 容器层面板暂无数据 Prometheus per-worker 精确端口抓取 /metrics 核心仪表盘 15s · 其余 30s · 默认看 6h Grafana · 4 张仪表盘 · 89 个面板 ① 后端核心 siliang-backend · 35 图 在线用户 / 后台任务 / LLM / HTTP / WS / 计费灵感 / 锁 点击跳到逐面板详解 ↓ ② 后端内存 siliang-memory · 36 图 RSS / GC / 在途 / 泄漏哨兵 / 连接池 / 视频队列 点击跳到逐面板详解 ↓ ③ 业务后端 siliang-biz · 11 图 biz 服务的 HTTP / 连接池 / RSS / GC 点击跳到逐面板详解 ↓ ④ 容器层 siliang-containers · 7 图 容器内存 vs 限额 / CPU / 网络 / 重启 / OOM / 存活 点击跳到逐面板详解 ↓ 图例 frontend backend / biz(Python 服务) rag / review / MySQL / 向量库 Redis(消息/广播) 外部云依赖(LLM / COS) 虚线框 = 尚未部署(cAdvisor) ① 核心仪表盘盯 backend ② 内存仪表盘盯 backend worker + rag/review ③ biz 仪表盘盯 biz ④ 容器仪表盘盯全部容器 实线箭头 = 请求流 / 指标流 读图三步(费曼):① 先看左边“系统长什么样”——用户请求打容器,容器借依赖;② 再看右边“指标怎么来”——Prometheus 每 15/30s 到每个 worker 抄一遍 /metrics; ③ 最后按颜色找到对应的仪表盘详解:每张图 = 系统某个部位的一个“体检项目”。点击右侧 4 张仪表盘卡片直达下方逐面板讲解。
💡 什么是“看监控”?
系统是个黑盒,监控就是给黑盒贴满温度计和流量计。每张图回答一个具体问题:“忙不忙?”“有没有积压?”“内存在不在偷偷涨?”——看图先看它回答什么问题,再看数值好坏。
🧩 记住两句话就够
① 带 _total 的都是计数器(只涨不跌),要配 rate() 看速度;② 其他多半是温度计(Gauge,可上可下),直接读数。所有“错误率”“QPS”“P95”都是从这两类原始数加工出来的。
⚠️ 先知道的一个坑
容器层仪表盘依赖 cAdvisor,当前未部署,所以那张盘暂时没数据,不是坏了。其余三张盘 per-worker 精确抓取,共享端口的 server job 会双计数、已全部排除。
🔎 怎么用本页
顶部搜索框可按面板名/指标名过滤;点全景图右上 4 张卡片跳对应仪表盘详解;每个面板卡都有:一句人话 → 回答什么问题 → 健康长啥样 / 危险长啥样 → 底下是真实 PromQL。点任意卡片(整卡可点)进入该卡的费曼详解课:类比故事 + 机制配图 + 生产实战 + 费曼自测。

🎓 必知必会:14 个概念,看懂全部 89 张图的地基

费曼技巧:如果一个概念你不能用大白话讲给外行听,就说明还没懂。这 14 张卡就是所有面板的“通用语法”。

1. Counter(计数器)vs Gauge(温度计)

  • • Counter 只增不减:像汽车里程表。名字带 _total(请求数、错误数)。
  • • Gauge 可上可下:像体温计。内存、在线人数、连接数、队列深度。
  • • 看里程表没意义,要看“每小时跑多快”;看体温计直接读数。这决定了每张图的 PromQL 写法。
📖 点开详解 · 费曼精讲 →

2. rate(counter[5m]) —— 算速度

  • • 过去 5 分钟计数器平均每秒涨多少 → 这就是 QPS(每秒请求数)。
  • • [5m] 是窗口:窗口越大曲线越平滑、越不抖;抓排查细节可临时改 [1m]。
  • • QPS 图、错误率图、结束原因图,全是 rate 出来的。
📖 点开详解 · 费曼精讲 →

3. increase() 与 changes()

  • • increase(x[1h]):过去 1 小时总共涨了多少(锁冲突“近 1h 次数”用它)。
  • • changes(x[1h]):这个值变过几次手——容器重启次数就是「启动时间戳 1h 内变了几次」。
📖 点开详解 · 费曼精讲 →

4. P50 / P95 / P99 分位数

  • • 把所有请求从快到慢排队:P95 = 95% 的请求比它快,只有 5% 更慢——最慢那批人的“代表”。
  • • 为什么不看平均值:平均值会被海量快请求稀释,一个 60s 的 LLM 慢请求根本拉不平平均,但 P99 会诚实暴露它。
📖 点开详解 · 费曼精讲 →

5. histogram_quantile 与 topk

  • • 延迟不是存一个数,是存一叠“水桶”(bucket:<10ms 多少、<50ms 多少…),分位数从桶里插值算出。
  • • topk(5, …):几十条线会把图糊成毛线团,topk 只画最慢/最大的前 N 名。
📖 点开详解 · 费曼精讲 →

6. max_over_time 与 deriv

  • • max_over_time(x[1m]):取 1 分钟内的最大值,抹掉抓取瞬间抖动,曲线更干净。
  • • deriv(rss[1h]):算斜率——“每小时涨多少字节”。内存告警 deriv > 5MB/h = 持续爬升,抓“真累积”。
📖 点开详解 · 费曼精讲 →

7. QPS · 并发 · 延迟:铁三角

  • • 排队论一句话:并发 ≈ QPS × 延迟(店里人数 = 进店速度 × 每人待多久)。
  • • 所以延迟一翻倍、并发就翻倍 → 连接池被打满 → 排队更狠 → 雪崩。三张图要连起来看。
📖 点开详解 · 费曼精讲 →

8. 连接池 = 图书馆借书

  • • 建连接贵,所以先建一柜子反复借:checked_out / in_use = 借走的书,capacity = 藏书量。
  • • 使用率 = 借出 ÷ 藏书。贴 100% = 所有人排队等书 = 请求卡住。80% 黄、95% 红是通用阈值。
  • • overflow = 临时加座(biz 池 10 + overflow 20 = 30)。
📖 点开详解 · 费曼精讲 →

9. RSS / VMS / working_set:三种“内存”

  • • RSS:物理内存真实占用(进程面板的主口径)。
  • • VMS:虚拟地址空间,虚高,只做参考。
  • • working_set:cAdvisor/内核视角的实际占用,OOM 杀不杀就看它(usage 含可回收缓存会虚高)。
📖 点开详解 · 费曼精讲 →

10. OOM kill(内存超限直接枪毙)

  • • 容器有内存限额(backend 10G、rag 2G…),working_set 顶到限额,内核直接杀进程(memcg OOM)。
  • • 现场表现:容器重启 + 一波 5xx + 用户掉线。rag 被 LibreOffice 大文件 OOM 杀过,所以有专门面板盯它。
📖 点开详解 · 费曼精讲 →

11. Python GC 分代回收

  • • 对象按年龄住三个区:gen0 新生代(回收最勤)、gen1、gen2 老年代(很少扫)。
  • • gen2 待回收对象持续爬升 + gen2 回收速率停滞 = 老大对象赖着不走——内存泄漏的早期信号。
📖 点开详解 · 费曼精讲 →

12. 泄漏判定心法(最重要)

  • • 锯齿形(涨跌交替)= 健康,用完就还。
  • • 线性爬升永不回落 = 真泄漏,去查在途/哨兵面板。
  • • 冲高后走平台期 = allocator 不归还(Python 常态,内存留着复用),不是泄漏,重启才还。
📖 点开详解 · 费曼精讲 →

13. job / instance / label:指标的身份证

  • • job = 哪个服务(siliang_backend_worker / siliang-biz / siliang-rag…)。
  • • instance = 哪个 worker:<机器>-<服务>-<序号>,如 253-biz-0;图例里每条线就是一个 worker。
  • • label = 切维度(handler / provider / outcome / generation…)。server job 随机命中 worker 会双计,已从所有面板排除。
📖 点开详解 · 费曼精讲 →

14. 5xx vs 4xx:谁的错

  • • 4xx = 客户端的错(参数不对、没登录),一般不用半夜爬起来。
  • • 5xx = 服务端自己的错(炸了、依赖挂了)。所有错误率面板只盯 5xx;>1 req/s 就该看日志了。
📖 点开详解 · 费曼精讲 →

① 四两后端核心指标监控(siliang-backend)· 35 图

主力仪表盘,盯 backend 服务(4 worker)的七件事:谁在线、后台任务有没有漏、LLM 健不健康、HTTP 快不快、协作 WS 稳不稳、计费准不准、数据库还锁不锁。颜色即分组:🟣在线 🔴泄漏与锁 🟡LLM 🟢HTTP 🔵WebSocket 🟠计费与灵感。

uid siliang-backendjob siliang_backend_worker(per-worker 精确)刷新 15s时间窗 6h顶部 HOST 变量按机器下钻

🟣 在线用户与协作规模(6 图)——“现在有多少活人、多少房间”

🟣 在线用户数(协作画布去重)

大数字

🍽️ 人话:此刻有多少人“坐在画布前”。把所有 worker 上的 WebSocket 会话按 user_id 去重后求和。

回答:产品的实时热度如何?发布/故障后用户是不是掉光了?

✅ 随业务节奏起伏;背景色 <50 绿 / 50–200 黄 / >200 红

🚨 归零或骤降 = 接入层/WS 出问题;注意同一用户跨 worker 会被算成两人,这是近似值

sum(siliang_ws_online_users{job="siliang_backend_worker"})

📖 点开详解 · 费曼精讲 →

🟣 聊天在线(去重用户 / 连接数)

大数字

🍽️ 人话:聊天室里有两个数——“几个人”(去重用户,一人开 5 个页签只算 1)和“几条电话线”(在途 SSE 连接数,每个页签一条)。

回答:聊天功能有多少真人在线?连接数和人数比例正常吗?

✅ 连接数 ≈ 人数 × 人均页签数,波动正常;阈值 100/400

🚨 连接数持续上涨不回落 = 监听生成器泄漏(挂了的 SSE 没人挂断)

sum(siliang_chat_resume_active_listener_users) / sum(siliang_chat_resume_active_listeners)

📖 点开详解 · 费曼精讲 →

🟣 在线协作画布数

大数字

🍽️ 人话:有多少个“画布房间”里还有人。有活跃 WS 会话的 workspace 数。

回答:协作发生的房间数——衡量真实协作广度。阈值 100/300。

sum(siliang_ws_workspaces_active{job="siliang_backend_worker"})

📖 点开详解 · 费曼精讲 →

🟣 在线用户口径(先读我)

说明卡

📖 人话:说明书。“在线”有三种,别混:①画布 WS 在线 ②聊天 SSE 在线 ③全能/生图/视频的 SSE 不在这两个数里(要看 HTTP 在途和 LLM 并发)。

还解释了为什么只信 job=siliang_backend_worker:共享端口的 server job 随机命中 worker、会双计数,已全部排除。

📖 点开详解 · 费曼精讲 →

🟣 在线用户与协作规模趋势

曲线

🍽️ 人话:把上面所有“在线数”画成 6 条时间曲线:去重用户、聊天用户、在线画布、WS 会话总数、pubsub 订阅任务、聊天 SSE 监听。

回答:一天的业务节奏长什么样?增长还是流失?发布前后对比如何?

✅ 曲线平滑起伏、彼此比例稳定

🚨 某条线脱离大部队独自爬升 = 对应资源在堆积(如 pubsub 任务)

sum(siliang_ws_online_users) / …_workspaces_active / …_sessions_active / …_pubsub_tasks_active

📖 点开详解 · 费曼精讲 →

🟣 聊天监听结束原因分布

曲线

🍽️ 人话:每条聊天“电话线”挂断时的 reason:completed=正常听完;disconnected=用户直接关页面(大多数,正常);lease_expired=worker 租约失效后收敛退出;error=读流出异常。

回答:SSE 链路健壮吗?

✅ disconnected + completed 占绝对多数

🚨 error 频繁 = 上下行不稳;lease_expired 高 = 实例在异常退出

sum(rate(siliang_chat_resume_listener_outcome_total[5m])) by (outcome)

📖 点开详解 · 费曼精讲 →

🔴 后台生成任务:内存泄漏核心哨兵(5 图)——“任务只进不出就是泄漏”

🔴 后台生成任务数(内存泄漏核心监控)

大数字

🍽️ 人话:后厨此刻有多少张“未出餐的订单”。历史教训:这些任务曾经只进不出,把内存吃爆。

回答:泄漏修复后有没有复发?这是本仪表盘最重要的一个数。

✅ 稳态个位数~几十;<20 绿 / 20–50 黄 / >50 红

🚨 持续单调增长 = 任务只进不出 = 泄漏复发,立刻去趋势图确认

sum(siliang_chat_resume_active_generation_tasks{job="siliang_backend_worker"})

📖 点开详解 · 费曼精讲 →

🔴 后台任务趋势(持续上涨=泄漏)

曲线

🍽️ 人话:同一个数的曲线版。大数字只告诉你“现在多少”,曲线才告诉你“它在往哪走”。

✅ 健康曲线围绕某个值上下波动(锯齿)

🚨 只涨不跌的斜线 = 泄漏,对照内存仪表盘 RSS 形态互证

sum(siliang_chat_resume_active_generation_tasks[曲线])

📖 点开详解 · 费曼精讲 →

后台任务结束原因分布

曲线

🍽️ 人话:后厨订单的结局——正常出餐 vs 厨房着火(exception)。

回答:后台任务失败率高不高?

🚨 exception 比例高 = 频繁失败,翻日志;失败重试还会推高内存

sum(rate(siliang_chat_resume_generation_task_outcome_total[5m])) by (outcome)

📖 点开详解 · 费曼精讲 →

租约刷新失败 + 过期清理失败

曲线

🍽️ 人话:分布式系统的“心跳+遗嘱”。每个后台任务在 Redis 里立了租约(谁活着谁续约);这里统计续约失败和清理失败。

回答:多实例协作机制本身有没有坏?

✅ 长期为 0

🚨 redis_error 高 = Redis 不稳;missing_lease 高 = 租约逻辑 bug;lease_expired_failed 高 = 清理逻辑异常

rate(siliang_chat_resume_lease_refresh_failed_total[5m]) by (reason) + rate(siliang_chat_resume_lease_expired_failed_total[5m])

📖 点开详解 · 费曼精讲 →

跨进程清理的过期任务数

曲线

🍽️ 人话:“收尸计数器”——某个实例崩了/租约过期后,由别的实例替它把烂尾任务收尾的次数。

回答:有没有实例在异常退出?

✅ 偶发为 0;active 稳定而 stale 高 = 有实例异常退出(对照发布记录)

sum(rate(siliang_chat_resume_stale_finalized_total[5m])) by (reason, status)

📖 点开详解 · 费曼精讲 →

🟡 LLM 健康(4 图)——“大模型供应商的门诊三件套+延迟”

🟡 LLM 调用 QPS(按 provider)

曲线

🍽️ 人话:每家大模型(gpt-5 / xAI / MiniMax…)每秒被我们 call 几次——钱花在哪家的实时账。

回答:调用量分布与突增(也被刷/活动时最先动的一条线)。

sum(rate(siliang_llm_calls_total[5m])) by (provider)

📖 点开详解 · 费曼精讲 →

🟡 LLM 错误率(按 provider)

曲线

🍽️ 人话:每家供应商的“失约率”= 失败次数 ÷ 总次数。

✅ <5% 绿 / 5–10% 黄

🚨 >10% 红:多半是 provider 限流(429)或 key 失效——切流量或换 key,不是我们的 bug

rate(siliang_llm_calls_total{outcome="error"}[5m]) / clamp_min(rate(siliang_llm_calls_total[5m]), 1)

📖 点开详解 · 费曼精讲 →

🟡 当前 LLM 并发调用数

曲线

🍽️ 人话:此刻每家供应商有几通“电话正在通话中”(在途调用)。

回答:LLM 是不是成了瓶颈?持续高位 = 大家在排队等模型回话。

🚨 持续高位且用户等得久 → 扩并发额度 / 换更快的模型 / 上队列

sum(siliang_llm_active_calls{job="siliang_backend_worker"}) by (provider)

📖 点开详解 · 费曼精讲 →

🟡 LLM 调用延迟 P50/P95/P99(按 model)

曲线

🍽️ 人话:用户等模型回话要多久——典型体验看 P50,最惨的 5%/1% 看 P95/P99。

✅ gpt-5 长输出跑到 60s+ 属正常,别当成故障(单位:秒)

🚨 P50 突然整体抬升 = provider 变慢/限流;对照错误率面板互证

histogram_quantile(0.50/0.95/0.99, sum(rate(siliang_llm_call_duration_seconds_bucket[5m])) by (le, model))

📖 点开详解 · 费曼精讲 →

🟢 HTTP 健康(4 图)——“门面生意好不好”

🟢 HTTP QPS(按 handler)

曲线

🍽️ 人话:backend 每个接口每秒被调几次(handler=路由模板,不含 /api/v2 前缀)。

回答:谁是最忙接口?流量结构有没有突变?

🚨 无发布无活动却突增 = 被刷/爬虫;某接口流量归零 = 上游调用方挂了

sum(rate(siliang_http_requests_total[5m])) by (handler)

📖 点开详解 · 费曼精讲 →

🟢 HTTP 5xx 错误率

曲线

🍽️ 人话:每秒有多少次“服务员自己把菜搞砸了”(服务端错误,按 handler 拆开)。

回答:现在有没有事故?哪个接口在出事故?

🚨 >1 req/s 就该排查(DB / Redis / 依赖故障),按 handler 直奔日志

sum(rate(siliang_http_requests_total{status=~"5.."}[5m])) by (handler)

📖 点开详解 · 费曼精讲 →

🟢 HTTP 当前并发请求数

曲线

🍽️ 人话:此刻店里有多少客人没走(在途请求)。多一条“ops 排空口径”参考线,专盯发布。

回答:请求在不在排队?发布时旧 worker 有没有干净退场?

✅ 滚动发布时每个 worker 的在途数应逐个归零

🚨 持续高位 = 排队(DB 慢查询或依赖抖动);发布后不归零 = 排空卡住

sum(siliang_http_requests_in_progress) by (method) + sum(siliang_ops_http_in_flight)

📖 点开详解 · 费曼精讲 →

🟢 HTTP P99 延迟(Top 10 慢接口)

曲线

🍽️ 人话:全站最慢的 10 个接口排行榜(P99=最惨的 1% 请求的等待时间)。这就是你的“性能优化待办清单”。

回答:该优化哪个接口?优化后变快了吗?

topk(10, histogram_quantile(0.99, sum(rate(siliang_http_request_duration_seconds_bucket[5m])) by (le, handler)))

📖 点开详解 · 费曼精讲 →

🔵 WebSocket 画布协作(7 图)——“多人实时协作的神经系统”

🔵 WS 当前活跃连接数

大数字

🍽️ 人话:画布协作此刻有多少条“对讲机”在线。

✅ 与在线用户数成比例(约每人 1–2 条);<100 绿 / 100–500 黄

🚨 持续上涨不回落 = 连接泄漏(断了没回收)

sum(siliang_ws_connections_active{job="siliang_backend_worker"})

📖 点开详解 · 费曼精讲 →

🔵 WS 连接结果分布

曲线

🍽️ 人话:敲门之后的结果:accepted=请进;其他 = 鉴权失败 / 超限 / Origin 不对,被拒之门外。

✅ accepted 一枝独秀

🚨 哪种拒绝高就是哪类问题:鉴权失败=token 问题;超限=连接数上限;Origin=跨域配置

sum(rate(siliang_ws_connections_total[5m])) by (outcome)

📖 点开详解 · 费曼精讲 →

🔵 WS 错误类型分布

曲线

🍽️ 人话:协作神经系统的病变类型。teardown_step 高 = Redis 故障留下“幽灵 session”(人走了系统以为还在);redis_pubsub > 0 = 跨实例广播失明——你在 A 机器画,B 机器上的同伴看不到。

✅ 长期贴地

sum(rate(siliang_ws_errors_total[5m])) by (error_type)

📖 点开详解 · 费曼精讲 →

🔵 WS 连接持续时长 P50/P95/P99

曲线

🍽️ 人话:一条“对讲机”平均开多久。连接总要结束(关页/超时),时长分布能暴露“该死的没死”。

🚨 P99 异常长 = 僵尸连接(teardown 清理没触发),与活跃连接数互证

histogram_quantile(0.50/0.95/0.99, sum(rate(siliang_ws_connection_duration_seconds_bucket[5m])) by (le))

📖 点开详解 · 费曼精讲 →

🔵 WS 业务消息接收 QPS(不含心跳)

曲线

🍽️ 人话:↑ 用户在画布上做的每个动作(拖拽/编辑…)传到服务器的速度,按 event type 拆开。

回答:协作活跃度;哪种操作最频繁(决定优化优先级)。

sum(rate(siliang_ws_messages_received_total[5m])) by (type)

📖 点开详解 · 费曼精讲 →

🔵 WS 业务消息发送 QPS(不含心跳)

曲线

🍽️ 人话:↓ 服务器把变更广播给房间里其他人的速度。接收是“进话”,发送是“出话”。

回答:广播压力多大?接收正常而发送归零 = 广播链路(pubsub)出问题。

sum(rate(siliang_ws_messages_sent_total[5m])) by (type)

📖 点开详解 · 费曼精讲 →

🔵 WS 心跳消息 QPS(客户端活跃度)

曲线

🍽️ 人话:客户端每隔几秒报一次“我还活着”(presence:ping)和“我的光标在这”(cursor/select)。

回答:有多少“活人”在动。心跳归零但连接还在 = 全是僵尸连接。

sum(rate(siliang_ws_heartbeat_messages_total[5m])) by (type)

📖 点开详解 · 费曼精讲 →

🟠 计费归因与灵感检索(7 图)——“钱算得准不准 + 生成首屏快不快”

🟠 消耗统计查询速率与归因失败

曲线

🍽️ 人话:算账服务的两条线——查询成不成功(ok/failed),以及 unattributed=“找不到主人的消费”(结算时无法通过会话确认这笔账算哪个画布的)。

回答:用户的钱算得准不准?

🚨 unattributed 持续增长 = 计费归因缺口(少收/错账),这是收入完整性问题

rate(siliang_workspace_consumption_query_total[5m]) by (endpoint, result) + rate(siliang_workspace_consumption_unattributed_total[5m])

📖 点开详解 · 费曼精讲 →

🟠 消耗统计查询耗时 P95

曲线

🍽️ 人话:查账单要等多久(按端点拆)。聚合统计类 SQL 会随数据量变慢。

🚨 持续升高 = 聚合查询需要优化(索引/预聚合)

histogram_quantile(0.95, sum(rate(siliang_workspace_consumption_query_duration_seconds_bucket[5m])) by (le, endpoint))

📖 点开详解 · 费曼精讲 →

🟠 灵感检索耗时(首屏链路)

曲线

🍽️ 人话:点“生成”之后正式开工前的“前奏”三段耗时 P95:Planner 规划 → Case 检索 → 首个可见进度事件。用户感知的“卡不卡”很大程度在这。

回答:生成体验的第一印象快不快?慢在哪一段?

histogram_quantile(0.95, …) on siliang_inspiration_plan / _search / _first_visible_duration_ms_bucket(单位 ms)

📖 点开详解 · 费曼精讲 →

🟠 灵感空结果 / 降级 / 跳过

曲线

🍽️ 人话:灵感链路的三种“不如意”:empty=检索啥也没搜到;degraded=某阶段坏了走备用路(按错误码);skipped=语义上主动跳过。

✅ 偶发正常

🚨 degraded 持续增长 = 向量库/案例库不稳,用户拿到的是降级体验

rate(siliang_inspiration_empty_total) / …_degraded_total by (error_code) / …_skipped_total by (reason)

📖 点开详解 · 费曼精讲 →

🟠 灵感向量召回质量

曲线

🍽️ 人话:检索“ Fishing ”收获如何——召回命中数 P95、其中投影完整有效多少、损坏无效多少。相当于渔网捞上多少鱼、多少是烂的。

🚨 invalid_document 持续偏高 = 向量库文档损坏或投影字段缺失(搜到了但用不了)

histogram_quantile(0.95, …) on siliang_inspiration_vector_hit / _valid_document / _invalid_document_count_bucket

📖 点开详解 · 费曼精讲 →

🟠 灵感检索后端与向量失败

曲线

🍽️ 人话:检索量按 backend(现在只有 vector,留了混合召回扩展位)+ 向量库失败按原因(timeout/error)。

🚨 失败速率持续 > 0 = 向量库不稳 → 拖慢首屏 + 触发降级(与上两张卡互证)

rate(siliang_inspiration_retrieval_total[5m]) by (backend) + rate(siliang_inspiration_vector_failure_total[5m]) by (reason)

📖 点开详解 · 费曼精讲 →

🟠 灵感候选与选中数量分布

曲线

🍽️ 人话:招聘视角——candidate=进入面试的人(合并排序后的候选数),selected=最终录取数。

回答:检索效果的质量趋势。

🚨 candidate 持续走低 = 召回变窄(网眼变大);candidate 高而 selected 低 = 排序/过滤过严(卡太狠)

histogram_quantile(0.95, …) on siliang_inspiration_candidate_count_bucket / _selected_count_bucket

📖 点开详解 · 费曼精讲 →

🔴 数据库锁冲突(2 图)——“锁专项修复的复发警报器”

🔴 数据库锁冲突(近 1h 次数)

大数字

🍽️ 人话:过去 1 小时数据库“抢座位吵架”了几次。这是锁专项修复(L-21)留下的哨兵:删除节点/换源的重试兜底每触发一次计一次。

回答:锁问题修干净了吗?有没有新的锁窗口冒出来?

✅ 根因修净后恒为 0(<1 绿)

🚨 ≥1 黄 / ≥10 红;持续 > 0 = 仍有锁窗口未收敛,去下面速率图定位

sum(increase(siliang_db_lock_errors_total{job="siliang_backend_worker"}[1h]))

📖 点开详解 · 费曼精讲 →

🔴 数据库锁冲突率(按操作与错误码)

曲线

🍽️ 人话:吵架细节——operation(删画布输出 / 节点换源)× code。1205=锁等待超时(等太久放弃),1213=死锁(俩事务互相等,数据库强制一个滚)。

回答:哪类操作在跟谁抢锁?修复上线后应归零并保持。

sum(rate(siliang_db_lock_errors_total[5m])) by (operation, code)

📖 点开详解 · 费曼精讲 →

② 四两后端内存监控(siliang-memory)· 36 图

内存专项“法医面板”:先看全局水位定罪(涨没涨),再用进程资源/在途/哨兵三组面板找凶手,最后连接池、视频队列两组看连带压力。所有“稳态应归零 / 应恒 0”的图都是历史泄漏修复后的“防回退哨兵”。

uid siliang-memoryjob siliang_backend_worker + siliang-rag / siliang-review刷新 30s核心告警 deriv(RSS[1h])>5MB/h · WS状态字节>50MB · 沙箱跟踪>0

📊 全局水位(3 图)——“有没有病,先量体温”

监控口径与告警规则(先读我)

说明卡

📖 人话:本盘使用说明书——instance 命名规则、server job 双计已排除、池面板“两张卡”用法(使用率卡看趋势告警 + 绝对值卡看上限)、5 条核心告警规则。

最重要的判定心法:线性爬升=真累积(查泄漏);平台期=allocator 不归还(常态)。

📖 点开详解 · 费曼精讲 →

进程内存 RSS / VMS(每 worker)

曲线

🍽️ 人话:每个 worker 的体温计。RSS=物理内存真实占用(主看这条);VMS=虚拟地址空间(虚高,仅参考)。

✅ 锯齿形(涨跌交替)健康;冲高后平台期 = allocator 不归还,常态

🚨 线性爬升永不回落 = 真泄漏,马上下钻下面几组找凶手

max_over_time(siliang_process_resident_memory_bytes[1m]) / …_virtual_memory_bytes(按机器 repeat)

📖 点开详解 · 费曼精讲 →

GC 各代待回收对象数

曲线

🍽️ 人话:垃圾回收站里三个区各堆了多少“待处理垃圾”。gen0/1 周转快属正常波动。

🚨 gen2(老物件区)待回收持续爬升 = 泄漏早期信号:大对象赖在老年代不走。比 RSS 涨得更早,是预警器

max_over_time(siliang_python_gc_pending_objects{generation="0/1/2"}[1m])

📖 点开详解 · 费曼精讲 →

🧵 进程资源(4 图)——“四大隐藏资源:协程/线程/FD/子进程”

asyncio 任务数

曲线

🍽️ 人话:事件循环里的“待办便签”数量。协程也会泄漏——创建后忘了 await/cancel,便签越贴越多。

🚨 只涨不落 = 协程泄漏(对照后台任务数判断来源)

max_over_time(siliang_asyncio_tasks_active[1m])(每 worker 一条线)

📖 点开详解 · 费曼精讲 →

线程数 / 打开 FD

曲线

🍽️ 人话:进程的“手指头”(线程)和“拿着的文件句柄”(FD)。子进程、网络连接、临时文件都要占 FD。

🚨 持续上涨不回落 = 子进程/连接/临时文件泄漏的旁证(FD 耗尽会直接报错 Too many open files)

max_over_time(siliang_process_threads[1m]) / …_open_file_descriptors[1m]

📖 点开详解 · 费曼精讲 →

进程池在途任务

曲线

🍽️ 人话:重活“外包车间”(compute/batch 子进程池)当前在干几个活。CPU 密集型工作不阻塞主事件循环的关键。

回答:外包车间忙不忙?活是不是堆在车间里没人收?

max_over_time(siliang_process_pool_active[1m]) by (pool)

📖 点开详解 · 费曼精讲 →

GC 各代回收速率

曲线

🍽️ 人话:垃圾车每秒出车几次(按代拆)。gen0/1 应该频繁出车。

🚨 gen2 长期不出车 + gen2 待回收爬升(上一组)= 大对象驻留实锤,两张图互证

sum by (generation) (rate(siliang_python_gc_collections_total[5m]))

📖 点开详解 · 费曼精讲 →

📦 大对象在途(2 图)——“谁手里正攥着大文件”

文件/打包模块在途(稳态应归零)

曲线

🍽️ 人话:三条线 = ZIP 打包 / 快照合成 / skill 整包,各有多少个“正在手里的活”。这些活每个都攥着大块内存。

✅ 忙完就归零(所以叫稳态应归零)

🚨 有活一直挂着不归零 = 大对象滞留内存,RSS 抬升的直接嫌疑人

max_over_time(siliang_file_batch_archive_active / …_snapshot_compose_active / …_openapi_skill_package_active[1m])

📖 点开详解 · 费曼精讲 →

图像处理在途(稳态应归零)

曲线

🍽️ 人话:图片分割 / 画布裁剪正在处理几个。图片解码后体积暴涨(一张几 MB 的 PNG 解码后占几十 MB 内存),是典型的大对象来源。

🚨 挂着不归零 = 图片对象没释放

max_over_time(siliang_image_segmentation_active / …_workspace_crop_active[1m])

📖 点开详解 · 费曼精讲 →

🚨 泄漏哨兵(3 图)——“历史修复的防回退警报器,非零即违规”

泄露哨兵:沙箱跟踪与清理(应恒 0)

曲线

🍽️ 人话:沙箱线程的“跟踪台账”和“待清理队列”。设计上台账应该随用随清。

🚨 任一 worker 非零 = 对应的泄漏修复被回退了(代码里清理逻辑没了),按告警规则 >0 即报

max_over_time(siliang_sandbox_tracked_threads[5m]) / …_sandbox_cleanup_tasks_pending[5m]

📖 点开详解 · 费曼精讲 →

泄露哨兵:MiniMax H3 窗口

曲线

🍽️ 人话:MiniMax 视频任务的两个“登记簿”——提交结果窗口(上限 1024 条)和已释放任务 ID 窗口(上限 4096 条)。登记簿满了要么挤掉旧的要么拒绝新的。

🚨 贴近上限 = 任务终态没收敛(该完成的一直占着坑),需上调窗口或排查终态逻辑

max_over_time(siliang_minimax_h3_tracked_entries{kind="submission_results"/"released_task_ids"}[10m])

📖 点开详解 · 费曼精讲 →

泄露哨兵:导演组跟踪窗口

曲线

🍽️ 人话:导演组(多智能体协作流程)的消息跟踪台账,处理完应清空。

🚨 只涨不回落 = N6-4 修复被回退

max_over_time(siliang_director_tracked_messages[5m]) by (kind)

📖 点开详解 · 费曼精讲 →

📏 字节分布(3 图)——“大对象都多大号”

文件/媒体处理字节分布 p95

曲线

🍽️ 人话:ZIP 产物 / 视频转存 / TTS 音频的“典型体重”(P95)。趋势参考——它解释了 RSS 为什么冲高:处理 200MB 的视频,内存必然先涨 200MB+。

用法:RSS 冲高时来这里对时间戳——谁在什么时候搬了大文件,一对照便知。

histogram_quantile(0.95, …) on siliang_file_batch_archive / _video_transfer / _tts_audio_bytes_bucket

📖 点开详解 · 费曼精讲 →

图像/整包字节分布 p95

曲线

🍽️ 人话:五类图像资产的典型体重:快照源图 / 分割图层 / skill 整包 / provider 生图返回 / Seedance 参考图。

用法:同上,定位“内存冲高时刻是谁的大图在处理”;provider 生图若突然变大,先怀疑上游换了默认分辨率。

histogram_quantile(0.95, …) on siliang_snapshot_compose_source / _image_segmentation_layer / _openapi_skill_package / _provider_image_response / _seedance_reference_bytes_bucket

📖 点开详解 · 费曼精讲 →

XAI 生图响应字节分布

曲线

🍽️ 人话:xAI 返回生图的体积分布(p50/p95 对照)。b64_json 格式会把图片塞进 JSON 文本,天然比 URL 形态大 33%+。

用法:判断响应是否异常膨胀(格式切换/分辨率变大),膨胀会直接放大内存峰值。

histogram_quantile(0.95/0.50, sum(rate(siliang_xai_image_response_bytes_bucket[5m])))

📖 点开详解 · 费曼精讲 →

🏁 结束原因(3 图)——“这些活干完了没、怎么死的”

文件/媒体模块结束原因

曲线

🍽️ 人话:ZIP / 视频转存 / TTS 三类活的结局(成功/exception)。

🚨 exception 高 = 频繁失败;失败任务的重试会反复占内存,和 RSS、在途面板三角互证

sum by (outcome) (rate(siliang_file_batch_archive_outcome_total / …_video_transfer_outcome_total / …_tts_outcome_total[5m]))

📖 点开详解 · 费曼精讲 →

快照/skill 模块结束原因

曲线

🍽️ 人话:快照合成 / skill 整包两类活的结局,同上。

sum by (outcome) (rate(siliang_snapshot_compose_outcome_total / …_openapi_skill_package_outcome_total[5m]))

📖 点开详解 · 费曼精讲 →

画布图片裁剪结果

曲线

🍽️ 人话:画布裁剪活的结局速率(正在处理几个看前面“图像处理在途”卡,这里看干得成不成功)。

sum by (outcome) (rate(siliang_workspace_crop_outcome_total[5m]))

📖 点开详解 · 费曼精讲 →

🔌 连接池(6 图)——“图书馆借书台账(backend 视角)”

数据库连接池使用率(worker × 池)

曲线

🍽️ 人话:借出书 ÷ 藏书量,按 worker × 池(sync/async/checkpointer)拆。80% 黄 / 95% 红。

🚨 贴 100% = 池打满,请求开始排队(通常伴随某个慢查询)

max_over_time(siliang_db_pool_connections{state="checked_out"}[1m]) / on(instance,pool) max_over_time(siliang_db_pool_capacity[1m])

📖 点开详解 · 费曼精讲 →

数据库连接池借出数与容量上限

曲线

🍽️ 人话:上一张的绝对值版——实线=各 worker 借了几条,水平参考线=该池藏书量(sync 30 / async 80 / checkpointer 30)。看“离天花板还有几条”更直观。

siliang_db_pool_connections{state="checked_out"} + max by (pool) (siliang_db_pool_capacity)

📖 点开详解 · 费曼精讲 →

Redis 连接池使用率

曲线

🍽️ 人话:Redis 图书馆两张借书证——shared(业务共用池)和 broadcaster_pubsub(画布广播专用池)。广播池打满 = 协作消息发不出去。

max_over_time(siliang_redis_pool_connections{state="in_use"}[1m]) / on(instance,pool) …_capacity[1m]

📖 点开详解 · 费曼精讲 →

Redis 连接池借出数与上限

曲线

🍽️ 人话:Redis 池的绝对值版——各 worker 借出几条 + 上限参考线。

siliang_redis_pool_connections{state="in_use"} + max by (pool) (siliang_redis_pool_capacity)

📖 点开详解 · 费曼精讲 →

HTTP client 借出连接(每 worker)

曲线

🍽️ 人话:出站电话总机(httpx 共享 client)上每 worker 正在占用的线路数。

用法:按 worker 展开——不均衡说明某个 worker 上的任务在狂打外部请求。

siliang_http_client_connections{state="active"} by (instance, client)

📖 点开详解 · 费曼精讲 →

共享 HTTP client 存活(1=存活)

曲线

🍽️ 人话:到各家 provider 的“电话总机”本身还在不在(1=在,0=没了)。连接复用是省内存省延迟的关键设计。

🚨 有聊天流量时某 provider 掉 0 = 连接复用被回退(退回每次新建连接 → FD 和内存抖动)

max by (provider) (max_over_time(siliang_shared_http_client_alive[1m]))

📖 点开详解 · 费曼精讲 →

🕸 WS 会话内存(2 图)——“会话对象本身占多少、有没有尸体”

WS 会话互校验(差值=注册表泄漏)

曲线

🍽️ 人话:同一个 worker 画两条线——登记簿上的会话数(注册表)vs 实际活的连接数(握手计数)。两线应重合。

🚨 分叉 = 注册表里有“尸体”(连接断了但登记没销)——注册表泄漏的直接证据

siliang_ws_sessions_active vs siliang_ws_connections_active(同一 instance 对照)

📖 点开详解 · 费曼精讲 →

WS 会话状态字节

曲线

🍽️ 人话:每个会话随身携带的“小背包”有多大(非共享状态)。正常 KB 量级;总量=会话数×单包大小。

🚨 总量 > 50MB 触发告警(口径卡规则)——要么会话数爆了,要么有人往背包里塞了大对象

siliang_ws_total_state_bytes + histogram_quantile(0.95, …_ws_session_state_bytes_bucket)

📖 点开详解 · 费曼精讲 →

🛡 防护与缓存(2 图)——“护栏拦了什么”

上限拦截速率

曲线

🍽️ 人话:四道安检门拦下了多少“超规行李”:上传预检 / 媒体下载 / XAI 生图 / provider 响应超限。护栏保护内存不被超大文件击穿。

拦截本身=护栏在工作;但高频拦截说明上游给的东西异常大,值得查源头。

rate(siliang_upload_precheck_rejected_total / …_media_download_rejected_total / …_xai_image_response_rejected_total / …_provider_image_response_rejected_total[5m])

📖 点开详解 · 费曼精讲 →

读快照缓存命中

曲线

🍽️ 人话:读快照先查缓存——命中了就省一次读取(省时省内存)。按 cache × result 看命中形态。

🚨 命中率突然崩了 = 缓存逻辑被改动/失效,读取压力和内存抖动会跟着上来

sum by (cache, result) (rate(siliang_read_snapshot_cache_total[5m]))

📖 点开详解 · 费曼精讲 →

👷 RAG / Review Worker(3 图)——“两个独立小弟的体检单”

RAG / Review Worker 内存(每实例)

曲线

🍽️ 人话:rag / review 两个单进程服务的 RSS。

✅ RAG 处理大文件(LibreOffice 解析)时内存冲高属预期——关键看之后回不回落

🚨 冲高后不回落 + 逼近 2G 限额 = 下一个 OOM 受害者(rag 有前科)

max_over_time(siliang_worker_process_resident_memory_bytes{job=~"siliang-rag|siliang-review"}[1m])

📖 点开详解 · 费曼精讲 →

Worker 连接池使用率

曲线

🍽️ 人话:小弟们自己的 DB / Redis 借书证使用率。

siliang_worker_db_pool_connections{state="checked_out"} / …_capacity + …_redis_pool_connections / …_redis_…_capacity

📖 点开详解 · 费曼精讲 →

Worker 连接池借出数与上限

曲线

🍽️ 人话:小弟池子的绝对值版,含上限参考线(review 是独立小池 5+5,特别容易被慢任务借空)。

siliang_worker_db_pool_connections / …_capacity + siliang_worker_redis_pool_connections / …_capacity

📖 点开详解 · 费曼精讲 →

🎬 视频后台流水线(5 图)——“视频做完工后的结算工厂”

视频后台结算结果

曲线

🍽️ 人话:视频轮询到 DONE 之后,后台工厂算钱的结局。retrying=再试一次,exhausted=试到没脾气放弃。

🚨 retrying/exhausted 高 = 定价或用量数据异常——这单钱算不出来(收入问题)

sum by (outcome) (rate(siliang_video_settlement_outcome_total[5m]))

📖 点开详解 · 费曼精讲 →

视频后台收尾结果

曲线

🍽️ 人话:成功视频的“售后”——下载转存到 COS 再打终态标记的结局。

🚨 retrying/exhausted 高 = 转存/转码链路异常(用户的成品可能拿不到)

sum by (outcome) (rate(siliang_video_finalization_outcome_total[5m]))

📖 点开详解 · 费曼精讲 →

视频后台队列深度(积压)

曲线

🍽️ 人话:工厂门口排队待处理的活(收尾/结算两条队)+ 丢件率。队列满开始丢投递时任务不丢(有兜底扫描补投),但延迟恶化。

🚨 深度持续上涨 = 消化不足;丢弃率 > 0 = 已经满到往外丢了

sum(siliang_video_finalization_queue_depth / …_settlement_queue_depth) + rate(…_dropped_total[5m])

📖 点开详解 · 费曼精讲 →

视频后台并发上限(配置)

大数字

🍽️ 人话:工厂开了几个工位(VIDEO_FINALIZER_CONCURRENCY / VIDEO_SETTLEMENT_CONCURRENCY 当前值)。

用法:和左边队列深度对照——队排在涨而工位没开满?调大并发;调大还不行,收尾侧看转存链路、结算侧先看锁冲突面板。

max(siliang_video_finalization_worker_concurrency / …_settlement_worker_concurrency)

📖 点开详解 · 费曼精讲 →

视频收割器(服务端自主轮询)

曲线

🍽️ 人话:“无人认领处理员”——用户关了页面没人轮询的视频任务(90s 无动静),服务端主动去推进结局。advanced=推进成功;forced_timeout=超 24h 强制收敛;skip_claimed=别的节点刚碰过(互斥跳过,正常);advance_error=推进失败。

🚨 stale 待收割持续走高 = 没人看着的积压任务在变多

sum by (outcome) (rate(siliang_video_reaper_outcome_total[5m])) + max(siliang_video_reaper_stale_tasks)

📖 点开详解 · 费曼精讲 →

③ 四两业务后端监控(siliang-biz)· 11 图

biz 是独立于 backend 的 gunicorn 多 worker 业务后端(APP_WORKERS 默认 4)。这张盘是核心盘的“精简镜像”:HTTP 四件套 + 连接池两对卡 + RSS/GC。看懂了核心盘,这张盘全部秒懂。

uid siliang-bizjob siliang-biz刷新 30shandler 不含 /api/v2 前缀池面板按机器 repeat 成对出现

口径说明(先读我)

说明卡

📖 人话:使用说明书。生产是 gunicorn 4 worker;instance 名=机器-biz-序号(如 253-biz-0);handler 是子路由模板(如 /me,不含 /api/v2)。

附 4 条建议告警:DB 池打满 / Redis 池打满 / 5xx 速率 >1 / deriv(RSS[1h]) > 5MB/h。

📖 点开详解 · 费曼精讲 →

HTTP QPS(按 handler)

曲线

🍽️ 人话:biz 每个接口每秒被叫几次。Counter per-worker 精确抓取,无漏计。

🚨 无缘无故突增(被刷)或某接口消失(调用方挂了)

sum(rate(siliang_biz_http_requests_total[5m])) by (handler)

📖 点开详解 · 费曼精讲 →

HTTP 5xx 错误率

曲线

🍽️ 人话:biz 每秒搞砸几次。

🚨 >1 req/s 排查——biz 的 5xx 多半源自 DB / Redis / 依赖故障

sum(rate(siliang_biz_http_requests_total{status=~"5.."}[5m])) by (handler)

📖 点开详解 · 费曼精讲 →

HTTP 当前并发请求数

曲线

🍽️ 人话:此刻 biz 店里多少客人没走(按 method 拆)。

🚨 持续高位 = 请求排队——DB 慢查询或依赖抖动的旁证(配合池面板看)

sum(siliang_biz_http_requests_in_progress) by (method)

📖 点开详解 · 费曼精讲 →

HTTP 延迟 P95(Top 5 慢接口)

曲线

🍽️ 人话:biz 最慢的 5 个接口(P95,单位秒)。要 P99 就进查询把 0.95 改 0.99。

用法:biz 的性能优化清单,比核心盘 top10 更聚焦。

topk(5, histogram_quantile(0.95, …siliang_biz_http_request_duration_seconds_bucket…))

📖 点开详解 · 费曼精讲 →

数据库连接池使用率(worker)

曲线

🍽️ 人话:biz 的 DB 图书馆——借出 ÷ 藏书(pool 10 + overflow 20 = 30)。80% 黄 / 95% 红。

🚨 贴 100% = 池打满开始排队;哪台机器打满看 repeat 出来的两张图

max_over_time(siliang_biz_db_pool_connections{state="checked_out"}[1m]) / …_capacity[1m]

📖 点开详解 · 费曼精讲 →

数据库连接池借出数与上限

曲线

🍽️ 人话:上一张的绝对值版——各 worker 借了几条 + 上限 30 参考线,看“离天花板多远”。

siliang_biz_db_pool_connections{state="checked_out"} + max(…_db_pool_capacity)

📖 点开详解 · 费曼精讲 →

Redis 连接池使用率(worker)

曲线

🍽️ 人话:biz 的 Redis 借书证使用率。注意这个 Redis 与 Agent 服务共享——对方用得多也会挤占你的池子。

max_over_time(siliang_biz_redis_pool_connections{state="in_use"}[1m]) / …_capacity[1m]

📖 点开详解 · 费曼精讲 →

Redis 连接池借出数与上限

曲线

🍽️ 人话:Redis 池绝对值版,上限 max_connections=50 参考线。

siliang_biz_redis_pool_connections{state="in_use"} + max(…_redis_pool_capacity)

📖 点开详解 · 费曼精讲 →

进程内存水位(RSS/VMS)(按容器拆分)

曲线

🍽️ 人话:每台机器一张图、每 worker 一条 RSS 线(1 分钟窗口最大值)。只反映被 Prometheus 抓到的 worker。

✅ 锯齿=健康;冲高后平台期=allocator 不归还(常态)

🚨 线性爬升=真累积(泄漏),配合 GC 面板互证

max_over_time(siliang_biz_process_resident_memory_bytes[1m])

📖 点开详解 · 费曼精讲 →

GC 各代回收速率

曲线

🍽️ 人话:biz 的垃圾车出车频率(按代拆)。

🚨 gen2 长期停滞而 gen0/1 活跃 = 有大对象驻留——与 RSS 平台期互证

sum by (generation) (rate(siliang_biz_python_gc_collections_total[5m]))

📖 点开详解 · 费曼精讲 →

④ 四两容器层监控(cAdvisor)(siliang-containers)· 7 图

唯一一张“基础设施视角”的盘:不看代码,只看 5 个容器的盒子(backend 10G / biz 3G / rag 2G / review 2G / frontend 1G)。⚠️ 依赖 cAdvisor,当前未部署 → 整盘暂无数据;部署后建议给每台机器的 target 打 machine 标签再接入下钻。

uid siliang-containers数据源 cAdvisor(未部署)口径 working_set(OOM 判定)按 compose service 聚合两台机器

口径说明(先读我)

说明卡

📖 人话:说明书。内存用 working_set(内核 OOM 的判定口径),不是 usage_bytes(含可回收 cache 会虚高);重启次数 = 启动时间戳在窗口内变化;OOM 用 container_oom_events_total。附 4 条告警建议(>90% 持续 5m / 重启 / OOM / 实例 <2)。

📖 点开详解 · 费曼精讲 →

容器内存使用 vs 限制(working_set)

曲线

🍽️ 人话:每个盒子“实际装了多少 vs 盒子多大”,两台机器按 service 聚合,一实一虚两条线。

🚨 使用线贴上限制线 = memcg OOM 倒计时(内核随时开枪)

sum by (service) (container_memory_working_set_bytes) + …_spec_memory_limit_bytes

📖 点开详解 · 费曼精讲 →

内存使用率(working_set / limit)

曲线

🍽️ 人话:上一张换成百分比,80% 黄 / 90% 红。rag 历史上被 OOM 杀过(LibreOffice 解析大文件),是这张图的头号盯防对象。

🚨 >90% 持续 5m 应告警——这是 OOM 前的最后窗口

working_set / clamp_min(sum by (service) (container_spec_memory_limit_bytes), 1)

📖 点开详解 · 费曼精讲 →

容器 CPU 使用(核)

曲线

🍽️ 人话:每个容器用了几个核(user+system 速率求和)。

🚨 4C 机器上两个重容器合计 >4 核 = 互相挤占 → CPU 节流 → 接口延迟莫名升高(查慢问题时先来这里排除)

sum by (service) (rate(container_cpu_user_seconds_total[5m]) + rate(container_cpu_system_seconds_total[5m]))

📖 点开详解 · 费曼精讲 →

容器网络收发

曲线

🍽️ 人话:每个容器每秒收(↓)/发(↑)多少字节。COS 上传下载、LLM 流量、SSE 下行全在里面。

🚨 无发布却暴涨 = 大文件搬运/被刷;SSE 下行突降 = 推流断了

rate(container_network_receive_bytes_total[5m]) + rate(container_network_transmit_bytes_total[5m]) by service

📖 点开详解 · 费曼精讲 →

容器重启与 OOM 事件

曲线

🍽️ 人话:两条线——1h 内重启次数(发布重启属预期,只看发布窗口外的重启)+ OOM 事件(出现即排查;cAdvisor 版本不支持该指标时此线无数据)。

changes(container_start_time_seconds[1h]) + increase(container_oom_events_total[1h]) by service

📖 点开详解 · 费曼精讲 →

各服务存活实例数(预期 2)

大数字

🍽️ 人话:点名器——两台机器各跑一个容器,每个 service 应该数出 2。<2 = 有台机器上的容器挂了或没起来。

✅ 全绿 = 2

🚨 1 黄 = 单机在撑(另一台挂了,冗余没了);0 红 = 服务整体不可用

count by (service) (container_start_time_seconds{service=~"siliang-.*"})

📖 点开详解 · 费曼精讲 →

🚑 故障排查速查表:看到什么症状 → 按什么顺序看哪些图

监控的价值不在“看”,在“出事时 3 分钟内定位”。这张表就是 SOP:从症状出发,沿着面板链往下钻。

症状排查路径(按序点击)
接口报 500 / 用户炸群🟢 5xx 错误率(哪个 handler)→ biz 5xx(是否 biz 侧)→ 🔴 锁冲突近 1h + 锁冲突率 1205/1213 → 🟡 LLM 错误率(下游连坐)
接口变慢 / 超时🟢 P99 Top10 慢接口 → 🟢 HTTP 并发(在排队?)→ DB 池使用率/biz DB 池(打满?)→ 容器 CPU(互相挤占?)→ 🟡 LLM 延迟(等模型?)
backend 内存涨 / 怀疑泄漏RSS 形态(线性爬升 or 平台期)→ GC 待回收 gen2 → 🔴 后台任务数+趋势 → asyncio 任务 → 线程/FD → 哨兵 沙箱/MiniMax/导演组 → 大对象 文件在途/图像在途
biz 内存涨biz RSS 形态 → biz GC 速率(gen2 停滞?)→ 并发(流量涨了?)
容器被杀 / 服务闪断重启重启与 OOM 事件 → 内存 vs 限制+使用率 90%(OOM 实锤?)→ 存活实例数(还剩几台?)
画布协作不同步 / 掉线🔵 WS 错误类型(redis_pubsub>0=广播失明)→ WS 活跃连接+连接时长(僵尸连接?)→ 心跳 QPS(还有活人吗)→ Redis pubsub 池
账单/消耗对不上🟠 归因失败 unattributed → 查询耗时 → 视频结算 retrying/exhausted(算不出钱的单子)
生成首屏慢 / 灵感质量差🟠 灵感三段耗时(慢在哪段)→ 向量失败 → 召回质量 invalid → 候选/选中数 → LLM 延迟
视频任务卡住不出片队列深度/丢弃率 → 并发上限(工位没开满?)→ 收尾结果+结算结果(retrying 卡哪)→ 收割器 stale
发布后确认是否健康HTTP 并发 ops 排空逐 worker 归零 → 存活=2 → 无计划外重启 → 跨进程清理 stale(旧实例死得干不干净)
每日例行巡检(2 分钟版)在线用户 → 后台任务数 → 5xx → RSS 形态 → DB 池 → 锁冲突=0? → 三个哨兵=0?