跳转至

效率收益归因拆分测量(B 组:只合并、不并发)

  • 测量时间:2026-09-30
  • 对象工程:env-monitor-deploy(14 台外部主机 + 单控制面 K8s)
  • 被测量命令:只读子命令 precheck(--refresh-precheck,强制绕过 300 s 结论缓存)
  • 脚本:measure_serial.py(零侵入:不改配置、不改源码,仅在本次进程内 patch 基类 _cfg)

1. 缺口与目标

measured-baselines.md 第一节的两个数字归因不同,此前从未拆分:

  • 126→14(SSH 连接)是合并独享的战果;
  • 136.84s→10.90s 是合并 + 并发的合计。

补测「现代码 + 串行(workers=1)」这一格,即可把时间收益拆成两半。

2. 数据(每组 3 次,取中位数)

组 代码 / 并发 逐次耗时(s) 中位数(s) SSH 连接
A 旧代码(每台 9 次逐项探测)+ 串行 136.84(历史单次观测) 136.84 126
B 现代码(每台 1 次合并采集)+ 串行 46.02 / 46.20 / 47.34 46.20 14
C 现代码 + 并发 5 11.51 / 10.97 / 11.06 11.06 14

A 组为改造前记录,旧代码已被覆盖,无法重测;B/C 组为本轮实测。

3. 归因结论

手段 时间收益 连接收益
合并(9 次/台 → 1 次/台) 136.84 → 46.20,省 90.64 s(约 66%) 126 → 14,省 112 次
并发(串行 → workers=5) 46.20 → 11.06,省 35.14 s(约 26%) 0(仍为 14)
合计 136.84 → 11.06,省 125.78 s 126 → 14

与原判断的差异:原文只说「并发不省连接」,现在可以进一步说清时间账—— 合并才是时间收益的主要来源(约 2/3),并发占约 1/3,且并发的收益完全建立在 「先合并成每台 1 次会话」之上(不合并时 126 次连接,并发只会放大峰值连接数)。

模型自洽性校验:B 组单台探测 ≈ 46.20 ÷ 14 ≈ 3.3 s;并发 5 时 14 台分 3 批 ≈ 3 × 3.3 ≈ 9.9 s,与 C 组 11.06 s 吻合(余下约 1.2 s 为本地与集群侧固定开销)。 反推 A 组:126 × ≈1.09 s ≈ 137 s,与 136.84 s 吻合。

副作用:本轮为 C 组也做了 3 次重复,中位数 11.06 s 与历史单次观测 10.90 s 吻合,顺带补上了「原基线只有单次观测、无方差」这一短板。

4. 复现

cd /home/rain/Documents/k8s_ins/env-monitor-deploy
.venv/bin/python /home/rain/Documents/k8s_ins/attribution-split-20260930/measure_serial.py 1   # B 组
.venv/bin/python /home/rain/Documents/k8s_ins/attribution-split-20260930/measure_serial.py 5   # C 组

串行生效的验证方式:日志中 14 台首次出现的时刻应逐个递增(B 组实测间隔 2.5–5 s);并发 5 时前 5 台应在数毫秒内同时启动。

5. 测量中发现的缺陷(已修复)

ops.batch_max_workers 对预检不生效,恒取默认 5:

  • EnvMonitorPreCheck.__init__ 调 super().__init__(..., section="precheck");
  • 基类 PreCheckBase._cfg() 返回 config_data[section],即 precheck: 段;
  • 而 batch_max_workers 定义在 ops: 段(config/env-monitor.yaml 第 220 行), 故 precheck.py 第 248 行的 self._cfg().get("batch_max_workers", 5) 永远取默认值。

实测佐证:把配置副本的 ops.batch_max_workers 改成 1 后运行,14 台主机的前 5 台 仍在 6 ms 内同时启动(并发度未变);改用进程内 patch 基类 _cfg 后,14 台依次启动 (间隔 2.5–5 s),确认注入生效、原配置项无效。

连带影响:

  • 该配置项无法调低或调高预检并发;
  • utils/config_validate.py 校验的是 ops: 段的同名键(第 438–445 行),与使用侧不一致;
  • docs/SOP.md 第 476 行「预检主机间并发:线程池,度数与 ops.batch_max_workers 同源」 与代码不符。

修复方向(2026-09-30 已实施完成):采用「precheck.py 改从 ops: 段读取」方案—— 配置项位置不变、与校验同源。变更档案见 env-monitor-deploy/docs/SOP.md 附录 G.3; 实测 ops.batch_max_workers=1 为 47.62 s、默认 5 为 10.87 s,配置项自此真实生效。

6. 交付物

文件 说明
measure_serial.py 零侵入测量脚本(进程内钉住并发度)
env-monitor-serial.yaml 第一版测量用的配置副本(ops.batch_max_workers: 1)——已验证对预检无效,保留作缺陷证据,非测量依赖
serial-fixed-run{1,2,3}.log B 组(workers=1)原始输出
concurrent-run{1,2,3}.log C 组(workers=5)原始输出
serial-run{1,2,3}.log 用配置副本跑的 3 次(无效注入,同 C 组行为,作为缺陷证据保留)
times.txt 全部 /usr/bin/time 耗时记录
MEASUREMENT.md 本文件

来源:/home/rain/Documents/k8s_ins/attribution-split-20260930/MEASUREMENT.md | 最后更新:2026-09-30 14:04(由 build/sync.py 同步,请勿在站点侧修改)