跳转至

mnt-lustre.mount 自愈 —— 诊断与方案(待决策)

主题:lustre_mount_selfheal_20261007|状态:诊断完成,方案待决策(未执行任何变更) 触发:HANDOFF §3 #9(env_facts_sync_20261004/SOP.md 附录 A 为其根因记录)

1. 问题(复核后的准确表述)

原描述:「mnt-lustre.mount 无自动重试,Lustre 不可用时静默失败、4 天无人察觉 (2026-09-29 .18–.20 故障根因)」。

2026-10-07 核实后:问题不只是"缺一个重试",而是——健康保障层整层声明了却没落地:

层 配置(config/slurm_deploy.yaml §health_ensure) 现场实测(.18) 判定
机制 A:slurmd 内置 HealthCheck install_healthcheck: true、health_check_program: /usr/local/bin/slurm_health_check.sh、health_check_interval: 300 slurm.conf 无 HealthCheckProgram(脚本在场但未挂接) 未落地
机制 B:控制节点巡检 watchdog install_watchdog: true、watchdog_script: /usr/local/bin/cluster_health_check.py、watchdog_interval: 15min /usr/local/bin/ 下无 cluster_health_check.py;无 health timer(systemctl list-timers 无) 未落地
挂载检查项 extra_check_mounts: []、extra_writable_dirs: [] 现场脚本 NFS_MOUNTS=""、WRITABLE_DIRS=""(第 27/29 行) 列表为空
  • 现场脚本 slurm_health_check.sh(1468 B,2026-09-18 05:35)确实下发过,但因列表为空, 它实际只检查「根可写 / tmp 可写 / 内存 / 磁盘 / munge」——完全不检查任何共享挂载。
  • 3 台计算节点当前 State=IDLE,没有误 DRAIN(未启用 = 无副作用,也无保护)。

为什么现在不能只"加一条检查":机制 A 的语义是判定健康(失败 → slurmd 自动 DRAIN 节点)—— 把「Lustre 挂载失败」纳入 A,等于选择「Lustre 一挂就停掉该节点接作业」;而自愈动作(重启挂载) 放在 A 里语义不合(自愈成功仍要返回 0,逻辑绕)。自愈天然属于机制 B(巡检 + 修复,不动调度状态)。

2. 方案选项(二选一,或 A 单独先行)

方案 A:只启用机制 B(巡检自愈) 方案 B:A + 启用机制 A(HealthCheck+DRAIN)
动作 部署 cluster_health_check.py + slurm-cluster-health.timer(15min);在其中新增「/mnt/lustre 挂载检查 + reset-failed + start 自愈」 在 A 之上,把 HealthCheckProgram 写进 slurm.conf 并重启各计算节点 slurmd
对调度的影响 无(不改节点状态) 有:任一检查失败即 DRAIN,需人 scontrol update 恢复
能否解决 #9 能(挂载失败 15min 内自动恢复) 能,但代价是故障期节点被 DRAIN
风险 低:新增常驻 timer;--fix 动作需限定在挂载类 中:DRAIN 会静默减少算力,且依赖检查项配置正确
范围 建议先「slurm 侧节点」(.18–.20 + .28);.25–.27 属 LSF,归 lustre_ins §3.1 #14 同左(HealthCheckProgram 只对跑 slurmd 的节点有意义)

推荐:先做方案 A。理由:它直接消解 #9 的根因(静默失败无人察觉 → 15min 内自动恢复), 且不改变调度语义(不引入 DRAIN 这种需要人介入的副作用);机制 A 是否启用可作为后续独立决策, 届时再按「挂载失败该不该停节点接作业」单独拍板。

无论选哪个,都应同时:把 extra_check_mounts 填为当前环境 (/home /projects /tools /pdk /opt/modulefiles /mnt/lustre)、extra_writable_dirs 填 (/home /projects /local_scratch)—— 现在为空是配置缺陷(脚本里的旧集群默认值 /mnt/nfs、/opt/lsf 早已不适用;注意只读层 /tools、/pdk 绝不能进"可写"列表)。

3. 验收(实施时用)

  1. systemctl is-failed mnt-lustre.mount 为真时,≤1 个巡检周期内变 active;
  2. 人为 systemctl stop mnt-lustre.mount 后,timer 能自动恢复(故障注入验证, 须在无在跑作业的窗口做,且验证后确认 /mnt/lustre 可读写);
  3. 部署器复跑「待执行 0 / 幂等跳过」;
  4. slurm.conf 与节点状态不受影响(方案 A 下节点保持 IDLE、无 DRAIN)。

4. 本轮未做的事(有意)

  • 未启用任何一层:启用 = 改变系统行为(常驻 timer / DRAIN 语义),且涉及范围与调度策略选择,需先定方案。
  • 未改 extra_check_mounts 等配置:改了不跑部署器不生效;跑了就等于启用机制 A(见上)。
  • 未动 slurm_health_ensure/ 下的旧资产(slurm_health_check.sh、cluster_health_check.py、 SLURM_HEALTHCHECK_STANDARD_SOP.md):该目录是旧集群(192.168.0.x / CentOS7 / k8s-node-0x / /home/rian)资料,其 SOP 与 service 文件(ExecStart=/root/.pyenv/versions/3.9.6/...)均不适用于当前集群; 实施方案 A 时应按当前环境新写 watchdog,而不是复用旧资产。

来源:/home/rain/Documents/slurm/slurm_ins/lustre_mount_selfheal_20261007/README.md | 最后更新:2026-10-07 03:24(由 build/sync.py 同步,请勿在站点侧修改)