Skip to content

fix: 削峰在平直线路上不生效,单样本桶的延迟带不再连成楔形 - #3

Merged
stqfdyr merged 6 commits into
mainfrom
fix/despike-flat-line
Sep 23, 2026
Merged

stqfdyr merged 6 commits into
mainfrom
fix/despike-flat-line

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 20, 2026 •

Copy link
Copy Markdown
Collaborator

削峰在平直线路上完全不生效:判据里的 mad > 0 守卫短路了整条滤波。同时修掉单探测延迟带被连成楔形的问题。

  • 延迟以整毫秒存储,稳定线路的 7 桶窗口内多数样本相同,绝对中位差正好为 0,尖峰原样留在图上。改为中位差下限取 1 ms,守卫随之去掉,平线上的阈值为 4.5 ms。
  • 滤波移到 format.ts,补四条断言:平线加尖峰、持续升高、超时缺口、1 ms 抖动。
  • 它只用到 d3-array 的 median,三行写完,依赖移除。
  • 窗口按时长折算而非固定样本数:桶的间隔由视口决定,固定 7 个样本会让同一次五分钟卡顿在桌面被当成尖峰削掉、在手机被当成持续保留。
  • 削峰后的 tooltip 取整:被替换的样本带的是偶数窗口的中位数,落在两个整毫秒之间。
  • 单探测画出的 band 与线一起削,否则勾上削峰后轴仍停在尖峰高度。
  • hub 只给有多个应答的桶下发 band,桌面 24 小时一天 1440 个桶里只有 2 到 10 个有,最长间隔 803 分钟;空着的桶留 null 时 connectNulls 把它们连成一大块楔形。改为用该桶的延迟填成零宽的带,削峰后的带同样处理。

tsc -b、oxlint、npm test、npm run build 通过。浏览器对着真实的 24 小时延迟数据只留一条探测:改前一块灰色楔形从 03:30 横跨到 17:00,改后消失,削峰视图同样正常。serverstatus 的同一滤波见 monitor-probe/monitor-theme-serverstatus#4。

判据里的 mad > 0 守卫让滤波在最需要它的形状上短路:延迟以整毫秒存储,稳定线路
的 7 桶窗口内多数样本是同一个整数,绝对中位差正好为 0,于是一个 2 秒的尖峰原样
留在图上,轴照样被撑开。实测两个同样高度的尖峰只削掉了一个。

改为把中位差下限取 1 ms,即数据本身的分辨率,守卫随之不再需要。平线上的判定阈值
是 4.5 ms,1 ms 的正常抖动仍原样保留。

滤波移到 format.ts,与本仓库其余纯函数一处,并补上断言:平线加尖峰、持续升高、
超时缺口、1 ms 抖动各一条。它只用到 d3-array 的 median,三行写完,依赖随之移除。

单探测时画出的 band 与线共享同一批离群点,且轴是按它拟合的,所以一并削,否则勾上
削峰后轴仍停在尖峰的高度。
被替换的样本带的是偶数窗口的中位数,落在两个整毫秒之间,tooltip 会显示 180.5 ms 这种值。
窗口此前固定 7 个样本,而桶的间隔由视口决定(请求的 points 是 innerWidth ×
devicePixelRatio),同一个 24 小时窗在桌面是一分钟一桶、在手机是两分钟一桶,于是同一次
五分钟的卡顿在桌面被当成尖峰削掉、在手机被当成持续保留。改为按探测自己的最小桶间隔折算
成七分钟,取奇数并夹在 3 到 15 之间。
带的上下沿是各自过滤的,一个比平时快一点的桶会只触发下沿:实测
[180,181,180,180,176,180,181,180,180] 这条线得到 [180, 178],区间倒置、线还落在区间外。
改为取线与上下沿三者的跨度。despikeWindow 的返回值原本叫 window,遮蔽了全局的 window。
stqfdyr added a commit to monitor-probe/monitor-theme-serverstatus that referenced this pull request Sep 20, 2026
公开页两处:实时速率固定宽度,延迟图表加削峰开关。

- 实时数字放进按最宽形态预留的槽位(`compact` 5.6ch、`bytes` 7.3ch、`rate` 10.2ch,按最宽的 MB 形态量),右对齐,宽度不再随量级变化。用在摘要行、表格网速列、展开详情的网速行;手机版网速列只有 60px,放不下两个槽位加分隔符的 70px,那里不预留。
- 延迟图表加削峰开关,默认关。`format.ts` 的 `despike`,Hampel 滤波:偏离窗口中位数超过 3 倍稳健差的样本换成该中位数,持续一段时间的变化保持原高度。
- 绝对中位差下限取 1 ms。延迟是整毫秒,稳定线路的窗口中位差为 0,不设下限时滤波在平直线路上完全不生效。
- 窗口按时长折算而非固定样本数。桶的间隔由视口决定,固定 7 个样本会让同一次五分钟卡顿在桌面被当成尖峰削掉、在手机被当成持续保留。
- 两侧都削:孤立的异常快同样把自适应的轴拉开,实测一个这样的桶把轴从 150–480 ms 拉到 0–600 ms。
- 单探测画出的 band 与线一起削,否则轴仍被尖峰撑开;带取线与上下沿三者的跨度,两条边各自过滤会得到倒置的区间;tooltip 取整,被替换的样本带的是偶数窗口的中位数。
- 详情里今日 / 本月 / 总流量三行未做预留,它们的宽度变化是分钟级的。

`tsc -b`、`oxlint`、`npm test`、`npm run build` 通过。浏览器实测:四种量级下摘要行、总流量、网速列三处坐标完全不变;320 / 360 / 390px 下网速列不再被旁边的进度条截断;削峰在双探测与单探测(带 band)下把轴从 2400 ms 收到 480 ms。同一滤波在默认主题的失效见 monitor-probe/monitor-theme-default#3。
hub 只给有多个应答的桶下发 band,一天 1440 个桶里只有 2 到 10 个带 band,最长间隔 803 分钟。空着的桶留 null 时 connectNulls 把相隔数小时的几个桶连成一大块楔形;改为用这一桶的延迟填成零宽的带,削峰后的带同样处理。
@stqfdyr stqfdyr changed the title 修复削峰在平直线路上不生效 fix: 削峰在平直线路上不生效,单样本桶的延迟带不再连成楔形 Sep 23, 2026
@stqfdyr
stqfdyr merged commit b55bf79 into main Sep 23, 2026
1 check passed
@stqfdyr
stqfdyr deleted the fix/despike-flat-line branch September 23, 2026 10:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant