dsh-speed-monitor:在 DSH 面板里测模型的流式速度

前言

用 DSH 接中转或官方模型,常会碰到一个问题:同样一句请求,有的接口首字节很快、但吐字慢,有的相反。光看对话响应体感觉不出来,手工拿脚本去点赞也麻烦。dsh-speed-monitor 这个插件把这件事放进了 DSH 自己的界面里:侧栏点开,右侧面板就按固定间隔对模型发流式请求,把首字节、总耗时、吞吐画成曲线。

它由 doraasn 维护,分类是「工作流」,思路是「测速不离开 DSH」:模型清单直接读 DSH 设置,请求打到供应商配置的 baseURL,密钥走 DSH 自己的凭据文件。下面介绍它的功能、安装和用法。

定位与维护

插件名是 dsh-speed-monitor,当前版本 0.9.8,MIT 许可,package.json 里声明对 dsh 引擎的要求是 >=0.2.1-rc.2。仓库在 https://github.com/doraasn/dsh-speed-monitor,社区目录页在 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor。目录页是独立站点,与 DeepSeek / 幻方没有官方从属关系。

核心功能

模型清单来自 DSH。 Client 读 /api/settings/describe 的 llm-* 命名空间,合并 llm-pi-ai.providers 与 llm-deepseek.models,插件里不硬编码模型。离开面板后新加的供应商,重启后会出现在下拉里。模型显示名也和 DSH 一致,用供应商 displayName + 模型 name 组合,例如 DeepSeek · DeepSeek-V4.1-Flash。

多模型并列。 每个模型一行,可以增删,每行的模型和思考挡位各自独立保存。默认目标写的是 astra-hub / deepseek-v4.1-flash,异常时回落到清单里第一个模型。

采样间隔。 默认每分钟一轮,可选 1 / 5 / 15 / 30 / 60 分钟。每轮每个模型先预热一次再采样 3 次,取中位数入库。

单指标曲线。 顶部切换首字节 / 总耗时 / 吞吐,每个模型一条线,图例点击可隐藏。悬浮显示该次采样的三项数值。时延单位是毫秒(越高越慢),吞吐单位是 tok/s(越高越快)。

断档不连线。 相邻采样点间隔超过 3 倍中位间隔或 2 分钟时,曲线会断开。这是刻意设计,不是数据丢失。

采样方法

数值不是点一次得来的,方法参考 term-llm benchmark 和 llm-speed-test:

步骤 做法 原因
预热 每个模型每轮第一次请求丢弃 排除 DNS、TCP 建连、前缀缓存冷启动
采样 默认 3 次,可调 1~5 次 单次抖动大,取中位数更稳
聚合 取中位数入库,同时记录 min / max 中位数抗离群点,min/max 看波动
串行 多模型之间间隔 300ms 串行执行 并发会抢带宽,把数值拉高
失败 记录 ok/runs 与错误信息 区分「慢」和「挂了」

面板概览卡显示的就是中位数:首字节带 ±(max-min)/2 波动,总耗时带区间;每条曲线上的一个点 = 一轮采样(3 个样本的中位数)。

安装与启用

README 给的安装方式是界面操作,没有命令行命令:

  1. 侧栏 → 插件 → 添加插件,粘贴仓库地址、.tgz 或本地目录
  2. 启用后重启 DSH,Host 侧改动不热加载
  3. 侧栏出现「速度监控」入口,点开即见面板

这里不要凭插件名去拼安装命令,README 里没有 dsh plugin add ... 这类写法。也不需要手动 git clone。

指标口径

读曲线之前先确认每个字段的含义:

字段 含义
ttfb_ms 请求发出 → 收到响应头
decode_ms 首个内容事件 → 最后一个内容事件
total_ms 请求发出 → 流结束
tokens completion_tokens
tps_decode 解码吞吐 = tokens ÷ decode
tps_e2e 端到端吞吐 = tokens ÷ total

首字节偏低、但 total 和 tps_decode 都差,是排队或生成慢;首字节高而 decode 正常,通常是建连或前缀缓存问题。

数据来源与接口

插件不新建配置体系,复用了 DSH 的设置和存储:

项 说明
模型清单 DSH 设置(llm-pi-ai / llm-deepseek 等命名空间)
请求 POST {baseURL}/chat/completions,stream: true、stream_options.include_usage: true
存储 ~/.dsh/storages/speed-monitor.json(配置)、speed-monitor.jsonl(采样)、speed-monitor.providers.json(模型清单缓存)
密钥 供应商配置里的 apiKeyEnv,指向 ~/.dsh/.credentials.yaml 的字段

密钥不出主机:按 apiKeyEnv 从 ~/.dsh/.credentials.yaml 读取,Client 拿不到。

面板前端调的是这几个 HTTP 接口:

方法 路径 说明
GET /dsh-speed/api/state { config, providers, items, error }
POST /dsh-speed/api/providers 写入模型清单 { providers }
POST /dsh-speed/api/config 保存 { intervalMinutes, runs, targets }
POST /dsh-speed/api/sample 立即采样,可带 { id } 只采一个目标

典型用法

装好重启后:

  1. 在 DSH 设置里配好至少一个 llm-* 供应商,apiKeyEnv 指向 ~/.dsh/.credentials.yaml 里有值的字段,baseURL 填完整
  2. 侧栏点「速度监控」,面板会从清单里带上已有模型
  3. 先点 立即采样 跑一轮,确认行内有数值而不是 --
  4. 确认无误后把采样间隔调回默认的 1 分钟,让它长期记录
  5. 前几条曲线只作为早期参考,中位数要等每轮采样攒够才有意义

常见问题

现象 处理
面板提示「还没有可用的模型清单」 DSH 设置里没有配置任何 llm-* 供应商
某行一直 -- 该供应商 apiKeyEnv 在 ~/.dsh/.credentials.yaml 里没有值,或 baseURL 为空
曲线不动 采样间隔被调大;或全部请求失败(行内会显示红色错误)
想清零 删除 ~/.dsh/storages/speed-monitor.jsonl

适用场景与注意

适合已经在 DSH 里接了多个供应商、想留下一条长期的延迟/吞吐记录的人,也适合在切换中转地址前后自己对比一次。它测的是网络到供应商这一段的流式表现,不含模型实际生成的推理质量。

需要注意几点:插件以当前 DSH 进程权限运行,会在该进程的工作目录下读取和写入 ~/.dsh/storages/ 下的配置文件。安装前先打开仓库核对源码与 MIT 许可证,确认其中的接口路径和存储路径符合预期,再决定是否启用。另外测速请求会真实消耗供应商额度,跑之前确认账户余额。

结尾

dsh-speed-monitor 的价值在于把测速变成 DSH 界面里的常驻功能,配置复用 DSH 的模型清单和凭据,不需要另起脚本。目录页是 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor,源码在 https://github.com/doraasn/dsh-speed-monitor。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜