跳转至

作业异常故障报告(F5:非法约束 PD / SEGV / 127 / ReqNodeNotAvail / OOM)

故障时间

2026-09-10 学习窗口内连续注入(本集群 compile/interactive 分区实测)。

现象

注入 实测现象
--constraint=nonexistent_feat 提交 提交瞬间即被拒绝:Batch job submission failed: Invalid feature specification,未进入队列
作业内运行段错误程序 作业快速 FAILED,sacct ExitCode=0:11(signal 11 = SEGV)
SBATCH 脚本调用不存在的命令 作业快速 FAILED,sacct ExitCode=127:0(shell "command not found")
sbatch -w 忙碌节点 作业 PD,squeue REASON=ReqNodeNotAvail
--mem=300M 运行内存吞噬脚本 memhog.py 节点 cgroup v1 memory.limit_in_bytes 实测被置为 450MB;超限后 OOM killer 击杀,sacct State=OUT_OF_MEMORY,ExitCode=0:125

影响范围

均为单作业级故障,不影响其他作业与节点;OOM 场景由 cgroup 隔离保证仅击杀本作业进程,无跨作业波及。

根因原理

  1. 提交端校验 vs 排队端匹配:Slurm 26.05 对"节点上根本不存在的 feature"在提交时即校验拒绝(预期中的 BadConstraints 长期 PD 未出现——这是版本行为差异知识点);而"节点存在但当前不可用(down/drain/占用)"的约束则通过调度器排队表达为 ReqNodeNotAvail。
  2. ExitCode 三段式语义:格式 <step>:<exit>;被信号击杀时显示 0:<signal>——SEGV=0:11、SIGKILL 类(OOM/超时)常见 0:9/0:125;脚本自身 exit 127 = 命令不存在。0:125 是 slurmstepd 对 OOM 击杀的规范化退出码,不是应用退出码。
  3. cgroup v1 内存硬限:申请 --mem=300M 后,实测 cgroup limit 为 450MB(Slurm 按申请值 + 步骤开销冗余设置),进程 RSS 超限即触发内核 OOM killer,slurmstepd 感知后标记 OUT_OF_MEMORY——内存超限是"必死"而非"可能死",与无 cgroup 部署的"节点整体 OOM"有本质区别。

证据摘要

sbatch: error: Batch job submission failed: Invalid feature specification
sacct:  JobID State ExitCode  →  <segv-job> FAILED 0:11
        JobID State ExitCode  →  <nofound-job> FAILED 127:0
squeue: <job> PENDING ReqNodeNotAvail
[node] cat /sys/fs/cgroup/slurm/.../memory.limit_in_bytes → 450MB(申请 --mem=300M)
sacct:  <oom-job> OUT_OF_MEMORY 0:125
dmesg/节点日志: memory cgroup out of memory: Killed process ... (memhog.py)

解决方案

  • 非法约束:修正 --constraint 为节点实际定义的 feature(scontrol show node | grep AvailableFeatures)。
  • SEGV/127:修复应用本身;SEGV 可结合节点 journalctl -k(segfault 栈)与 core dump 定位。
  • ReqNodeNotAvail:sinfo -N -o "%N %T %E" 查目标节点状态,DRIVEN by down/drain 则等恢复或改节点。
  • OOM:按 --mem 实际放大申请值,或代码层修内存泄漏;不要靠放宽 cgroup 解决。

验证结果

  • 修正约束后作业正常排队/运行;SEGV/127 作业以预期 ExitCode 终止并可在 sacct 审计;OOM 复跑被稳定击杀且仅限本作业进程;队列与节点终检归零。

预防建议

  1. 提交前脚本内嵌约束校验(比照 sinfo --Format=AvailableFeatures),把提交端报错挡在 IDE/CI 层。
  2. 用户培训 ExitCode 速查:0:11=SEGV、127:0=命令不存在、0:125=OOM,sacct 审计字段直接进值班手册。
  3. 关键长任务默认加 --requeue + checkpoint,避免瞬时异常造成返工。
  4. 内存申请惯例:申请值 = 程序峰值 × 1.2~1.5 安全系数,用 sacct --format=MaxRSS 回归校准。

来源:/home/rain/Documents/slurm/slurm_study/slurm_study_plan/阶段5_故障排查/作业异常故障报告.md | 最后更新:2026-09-10 20:53(由 build/sync.py 同步,请勿在站点侧修改)