跳转至

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 复核 + 官方遮蔽检测)结论:

  1. 主链路已完成: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 齐全。
  2. 残余 3 处(本次收掉):
  3. scratch_gc_deployer.py:_probe_file(每文件一条)+ _probe_timer(一条)主机内逐条; 自有 _query 未接基类缓存;pre_check 每台 3 条裸查询串行未并发;
  4. storage_layout_deployer.py::_probe_node:组目录齐备判定按 for item × for grp 逐条 remote_query (而 _probe_group_dirs 早已是一条 shell 批量,dry-run 却没用它);
  5. user_mgmt_deployer.py::pre_check:每台 5 条串行;health_ensure_deployer.py::pre_check:每台 2 条。
  6. 文档问题:附录 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 同步,请勿在站点侧修改)