SOP — slurm_ins 残余三处只读探测批量化 + 附录 B 过度声称更正¶
主题目录:
slurm_ins/probe_batch_residual_20261008/|执行日期:2026-10-08|类型:C 类(改实现体 + 修文档) 触发:再次核实「slurm_ins 侧效率是否已完全做完」时,发现主链路已完成、但仍有 3 处残余, 且sync_status_concurrency_20261007/SOP.md附录 B 的「9 条探测路径全部已批量」属过度声称
1. 背景¶
只读审计(file:line 复核 + 官方遮蔽检测)结论:
- 主链路已完成:
slurm_deployer/submit_node_deployer/node_env/module_env/health_ensure.sync_status/user_mgmt.sync_status/local_scratch/storage_layout.probe_mount|tier0均已「主机内拼一条 shell + 主机间并发 + 进程内缓存」。基类deployer.py的_query_cache/_kv_script/_parse_kv/_remote_query_many/_run_per_host齐全。 - 残余 3 处(本次收掉):
scratch_gc_deployer.py:_probe_file(每文件一条)+_probe_timer(一条)主机内逐条; 自有_query未接基类缓存;pre_check每台 3 条裸查询串行未并发;storage_layout_deployer.py::_probe_node:组目录齐备判定按for item × for grp逐条remote_query(而_probe_group_dirs早已是一条 shell 批量,dry-run 却没用它);user_mgmt_deployer.py::pre_check:每台 5 条串行;health_ensure_deployer.py::pre_check:每台 2 条。- 文档问题:附录 B 把上述说成「全部已批量」,与实现体不符(曾据此误判过一次)。
2. 目标¶
| # | 目标 | 判据 |
|---|---|---|
| 1 | scratch_gc:sync_status 每台一条 shell;pre_check 每台一条 shell + 并发 |
命令数下降;变更清单逐条一致 |
| 2 | storage_layout:组目录判定复用已批量的 probe_group_dirs(N 条 → 1 条) |
同上 |
| 3 | user_mgmt / health_ensure:pre_check 每台一条 shell + 并发 |
同上 |
| 4 | 命令文本单一来源(缓存键是 (host, cmd),文本漂移即预取白做) |
离线自测断言「命令文本逐字未变」 |
| 5 | 更正附录 B 的过度声称 | 与代码一致,不再误导 |
3. 前置条件¶
- 工程根
/home/rain/Documents/slurm/slurm_ins,.venv可用; - 到节点(
.16–.20)的 SSH 凭据沿用config/slurm_deploy.yaml;本次上机前实测三台.16/.17/.18免密可达; - 变更前完成 5.1 备份;验证全程
--dry-run(只读,不下发任何变更)。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 变更对象 | scratch_gc_deployer.py、storage_layout_deployer.py、user_mgmt_deployer.py、health_ensure_deployer.py;sync_status_concurrency_20261007/SOP.md 附录 B;docs/HANDOFF.md |
| 改的是什么 | 只改只读探测的“打包方式”;判定表达式、变更记录的顺序/内容、变更类命令均不动 |
| 是否停服 | 否;验证全程只读 |
| 回滚风险 | 低:改动集中在探测路径,且附离线自测 + 上机新旧对照(清单逐条一致) |
5. 分步操作¶
5.1 备份(前置)¶
TOP=/home/rain/Documents/slurm/slurm_ins/probe_batch_residual_20261008
mkdir -p "$TOP/backup"
cd /home/rain/Documents/slurm/slurm_ins
cp -a scratch_gc_deployer.py storage_layout_deployer.py \
user_mgmt_deployer.py health_ensure_deployer.py "$TOP/backup/"
5.2 scratch_gc:探测命令抽为单一来源 + 每台一条 shell¶
# 概念等价:命令文本只在一处定义(缓存键才稳定)
# _file_probe_cmd(path) -> "if [ -f {path} ]; then sha256sum ...; else echo __MISSING__; fi"
# _timer_probe_cmd(name) -> "e=$(systemctl is-enabled ...); a=$(systemctl is-active ...); printf '%s|%s' ..."
# _judge_file(ok, out, sha) / _judge_timer(ok, out) ← 纯函数,单条与批量共用
# _probe_file/_probe_timer ← 保留,供 health_check 复用
# sync_status._probe:{f0..fn} + timer 拼一段 shell,_kv_script 回传,_parse_kv 拆回
# pre_check:{ssh, systemctl, uid} 拼一段 shell + _run_per_host 并发
坑:scratch_gc 的 _query 返回 (ok, stdout) 三态,与基类 _remote_query 语义不同,有意保留、不得合并;
改造只在「命令文本来源」与「打包道数」上,判定逻辑(_judge_*)逐字照搬。
5.3 storage_layout:组目录判定复用 probe_group_dirs¶
# _probe_node:dirs_ok 由「每 item × 每组成员一次 remote_query」改为
# all(probe_group_dirs(host, mp).get(grp) for grp in ldap_groups)
# 注:probe_group_dirs 原是 _probe_group_dirs(私有),本次提为公开同名(与 _ensure_content_dirs 同源)
等价性:目录缺失时 probe_group_dirs 的值为空串 → 与旧 [ -d ... ] && echo yes != yes 同判;
旧实现遇首个缺失即 break(条数 ≤ N),新实现一次取回全部组(恒 1 条),判定结果一致。
5.4 user_mgmt / health_ensure:pre_check 每台一条 shell + 并发¶
# user_mgmt:{ssh, conf, slurmctld, sacctmgr, ldapsearch[, ldap]} 拼一段 shell + _run_per_host
# 问题清单的「追加顺序与判据」保持原样
# health_ensure:{ssh[, conf]} 拼一段 shell + _run_per_host;主控 {state, sshcli} 合并为一次往返
5.5 离线自测(上机前)¶
cd /home/rain/Documents/slurm/slurm_ins
.venv/bin/python -m py_compile \
scratch_gc_deployer.py storage_layout_deployer.py \
user_mgmt_deployer.py health_ensure_deployer.py && echo COMPILE_OK
.venv/bin/python probe_batch_residual_20261008/selftest.py
预期:COMPILE_OK + RESIDUAL_BATCH_SELFTEST_OK(25 项)。
坑:本工程用相对导入,自测须以 slurm_ins.<mod> 导入;载入 backup 旧模块时名字带包前缀 slurm_ins._old_*。
5.6 上机新旧对照¶
cd /home/rain/Documents/slurm/slurm_ins
mkdir -p /tmp/new4 && cp scratch_gc_deployer.py storage_layout_deployer.py \
user_mgmt_deployer.py health_ensure_deployer.py /tmp/new4/ # 留住新版
cp probe_batch_residual_20261008/backup/{scratch_gc,storage_layout,user_mgmt,health_ensure}_deployer.py .
for f in --storage-layout --user-mgmt --health-ensure --scratch-gc; do
.venv/bin/python main.py --config config/slurm_deploy.yaml $f --dry-run >/tmp/old.log 2>&1; done
cp /tmp/new4/*.py . # 还原新版;务必 cmp 校验
for f in scratch_gc_deployer.py storage_layout_deployer.py user_mgmt_deployer.py health_ensure_deployer.py; do
cmp -s $f /tmp/new4/$f || echo "RESTORE_FAIL $f"; done
6. 验证¶
验证一:语义等价(离线) —— RESIDUAL_BATCH_SELFTEST_OK:
- scratch_gc:文件/timer 判定穷举等价(2×5 与 2×7 组合);命令文本逐字未变;
批量闭环「4 文件 + timer → 每台仅 1 条远端调用」,缺失→pending、连接失败→unknown 皆覆盖;
- storage_layout:三种目录存在性下 dirs_ok 等价,命令数 N → 1。
验证二:命令数与墙钟(上机 --dry-run,新旧各一轮)【已确认】
| 子命令 | 命令数(旧→新) | 墙钟 ms(旧→新) | 变更记录 | rc |
|---|---|---|---|---|
| --scratch-gc | 57 → 13(-77.2%) | 7566 → 1871(-75.3%) | 18 = 18 | 0/0 |
| --storage-layout | 108 → 49(-54.6%) | 8166 → 3608(-55.8%) | 19 = 19 | 0/0 |
| --user-mgmt | 33 → 12(-63.6%) | 4982 → 2014(-59.6%) | 6 = 6 | 0/0 |
| --health-ensure | 46 → 36(-21.7%) | 11543 → 8387(-27.3%) | 5 = 5 | 0/0 |
取数口径:命令数 = 该轮日志中 [RET: <数字>] 行数(真实远端命令执行行;
普通日志行的 [RET: N/A] 不计);墙钟 = 端到端 date +%s%3N 差值(含 Python 启动)。
验证三:变更清单逐条一致【已确认】 —— 四个子命令新旧两轮日志的 变更记录: 明细
diff 为空(scratch_gc 18 / storage_layout 19 / user_mgmt 6 / health_ensure 5 条逐条一致)。
失败判断:变更记录出现实质差异、或 py_compile / 自测失败 → 按第 7 章回滚。
7. 回滚¶
cd /home/rain/Documents/slurm/slurm_ins
BAK=probe_batch_residual_20261008/backup
cp -a $BAK/scratch_gc_deployer.py $BAK/storage_layout_deployer.py \
$BAK/user_mgmt_deployer.py $BAK/health_ensure_deployer.py .
- 回滚后验证:
py_compile+ 各子命令--dry-run(命令数回到旧值、变更记录条数不变)。 - 触发条件:清单出现实质差异;子命令报错;
py_compile/ 自测失败。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
| 命令文本漂移 → 探测缓存不命中(白做) | 文本抽为单一来源(_file_probe_cmd / _timer_probe_cmd);离线自测逐字比对 |
scratch_gc._query 三态语义被误并入基类 |
明确保留自有 _query;只在打包与文本上改造 |
组目录判定改 probe_group_dirs 后语义漂移 |
all(dir.get(grp)) 与旧 break 结果等价;离线自测三种情形验证 |
| pre_check 合并后问题清单顺序变化 | 保持 append 顺序与判据原样;上机 diff 清单为空 |
| 临时用 backup 覆盖工作区忘记还原 | 5.6 全程 cp + cmp 校验,输出 RESTORE_OK |
附录 A 交付物清单¶
| 文件 | 说明 |
|---|---|
SOP.md |
本文件 |
selftest.py |
离线自测(判定等价 / 命令文本未变 / 批量闭环 / 组目录等价) |
backup/ |
4 个改造前文件快照 |
backup/README.md |
备份台账 |
| 变更的工程文件 | scratch_gc_deployer.py、storage_layout_deployer.py、user_mgmt_deployer.py、health_ensure_deployer.py |
| 修正的文档 | sync_status_concurrency_20261007/SOP.md 附录 B、docs/HANDOFF.md |
附录 B 残余项存量(截至本次)¶
| 工程 | 状态 |
|---|---|
| slurm_ins(本工程) | 本次收尾:主链路 + 上述 3 处均已完成;遮蔽检测 0/0 |
其它挂载 precheck_module 的工程 |
【2026-10-11 结案】 遮蔽检测已扫:lsf_ins / lustre_ins / k8s_ins / eda_tools_ins / harbor 均 0 处版本落后 |
| 其它待批量化工程 | 【2026-10-11 结案】 属其它工程的独立优化,不在 slurm_ins 效率改造范围;如需推进另立变更(可参考 conn_reuse_20261007/SOP.md) |
来源:
/home/rain/Documents/slurm/slurm_ins/probe_batch_residual_20261008/SOP.md| 最后更新:2026-10-11 21:15(由build/sync.py同步,请勿在站点侧修改)