部署器重复探测消除(首次落地,未达标)¶
主题目录:
dedupe_probe_20261007/|日期:2026-10-07|类型:C 类(改基类) 状态:已落地并达标 —— 重复探测归零(49 → 0)。初版曾因诊断工具口径错误误判为「未达标」,见 §三。
一、做了什么¶
在 deployer.py(基类)加进程内只读探测缓存 —— 所有远端查询都已统一汇聚到基类(见 sync_status_concurrency_20261007/),故只改一处:
_remote_query:同(host, cmd)本次运行只下发一次;空输出也缓存(ldd这类"正常即无输出"的探测若按空串跳过等于永不缓存);仅有连接异常/无返回不缓存。_remote_query_many:同样走缓存;同批内同一命令只下发一次;结果按索引回填。- 失效时机:
_remote_exec成功执行后清空(dry-run 下不执行 → 不清,缓存全程有效);run()在deploy()之后再清一次(兜底覆盖 SFTP 等写路径)。 - 开关:环境变量
DEPLOY_QUERY_CACHE=0可整体关闭(供 A/B 对照)。
二、验证结果¶
离线自测 8 项全过(dedupe_probe_20261007/selftest.py):命中复用 / 空输出也缓存 / 连接异常不缓存 / 变更后失效 / 批量同批去重 / 批量跨批命中 / 部分命中 / 开关关闭。
上机对照(slurm_ins 主部署器 --dry-run,6 台):
| 指标 | 改造前 | 改造后 | 判定 |
|---|---|---|---|
| 变更记录 | 225 / 25 / 200 | 225 / 25 / 200 | ✅ 逐条一致(正确性无回归) |
| 建连 | 6 次 | 6 次 | ✅ 未退化 |
| 远端命令(修正口径:只计实际执行) | 433 次 | 384 次 | ✅ -11.3% |
| 可省重复 | 49 | 0 | ✅ 归零 |
| 墙钟 | 134.6 s | 116.1 s | ✅ -13.7% |
结论:达标 —— 重复探测从 49 降到 0。
三、一小时的弯路:诊断工具口径错误(已纠正)¶
初版结论写成「未达标」,依据是 remote_cmd_profile.py 报的「命令 864 条 / 可省重复 483 条 → 改造后仍 384 条」。
这个依据本身是错的:同一次远端执行会被两层日志(paramiko_module.run_cmd 与 exec_linux)各记一条带「耗时」的日志,
统计脚本把两条当成两条命令 → 命令数与重复数双双虚高约一倍。
用正确口径(只计 exec_linux 那条)重算:
| 日志 | 实际执行 | 真实可省重复 |
|---|---|---|
| 改造前 | 433 次 | 49 |
| 改造后 | 384 次 | 0 |
教训:诊断工具的口径必须先自证 —— 否则会把正常结果判成故障(本次差点据此继续改代码)。
四、结论与后续¶
目标达成:重复探测归零;命令数 -11.3%、墙钟 -13.7%。
若还想继续压命令数(384 次),方向是命令内合并(同一主机的多条只读探测拼成一条 shell),属另一轮。
【2026-10-11 结案】 该方向已由后续主题落地:submit_node_batch_20261007(_sync_host 批量化)与 probe_batch_residual_20261008(4 子命令命令内合并)。
五、备份¶
backup/slurm_ins/deployer.py.bak.20261007-064700(改前快照)。
回滚:cp -a dedupe_probe_20261007/backup/slurm_ins/deployer.py.bak.* deployer.py,回滚后跑一次 --dry-run 确认变更记录仍为 225/25/200。
来源:
/home/rain/Documents/slurm/slurm_ins/dedupe_probe_20261007/README.md| 最后更新:2026-10-11 21:15(由build/sync.py同步,请勿在站点侧修改)