作业异常故障报告(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 隔离保证仅击杀本作业进程,无跨作业波及。
根因原理¶
- 提交端校验 vs 排队端匹配:Slurm 26.05 对"节点上根本不存在的 feature"在提交时即校验拒绝(预期中的 BadConstraints 长期 PD 未出现——这是版本行为差异知识点);而"节点存在但当前不可用(down/drain/占用)"的约束则通过调度器排队表达为
ReqNodeNotAvail。 - ExitCode 三段式语义:格式
<step>:<exit>;被信号击杀时显示0:<signal>——SEGV=0:11、SIGKILL 类(OOM/超时)常见 0:9/0:125;脚本自身 exit 127 = 命令不存在。0:125 是 slurmstepd 对 OOM 击杀的规范化退出码,不是应用退出码。 - 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 复跑被稳定击杀且仅限本作业进程;队列与节点终检归零。
预防建议¶
- 提交前脚本内嵌约束校验(比照
sinfo --Format=AvailableFeatures),把提交端报错挡在 IDE/CI 层。 - 用户培训 ExitCode 速查:
0:11=SEGV、127:0=命令不存在、0:125=OOM,sacct 审计字段直接进值班手册。 - 关键长任务默认加
--requeue+ checkpoint,避免瞬时异常造成返工。 - 内存申请惯例:申请值 = 程序峰值 × 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同步,请勿在站点侧修改)