效率收益归因拆分测量(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同步,请勿在站点侧修改)