SLURM基础:工作流、核心组件与作业状态管理

各位同学,咱们今天聊聊SLURM的底子。说白了,SLURM就是一个集群的“交通警察”,负责调度谁的车(作业)先走、走哪条路(节点)、什么时候停。我最早接触SLURM时,觉得它就是个黑盒子,直到亲手搭过几套集群,才摸清它的脾气。

SLURM工作流:作业从提交到完成

一个作业的生命周期,其实挺简单的。你提交一个脚本,SLURM先看看资源够不够,够就安排跑,跑完就收工。但这里头有几个关键节点,我一个个说。

第一步:提交作业

你用 sbatchsrun 把作业扔给SLURM。我个人习惯用 sbatch,因为它适合批处理任务。比如:

sbatch my_job.sh

这个命令会把作业信息发给中央控制器(slurmctld)。

第二步:排队等待

作业进入队列后,状态变成 PENDING。为什么排队?因为资源不够呗。你想想看,集群就100个核,你非要200个,那只能等着。我曾经遇到过一个用户,提交了1000个作业,每个都要独占整个集群,结果后面所有人的作业都卡死了。嗯,后来我给他加了资源限制。

第三步:资源分配

当资源满足时,slurmctld 会分配节点给作业。状态变成 RUNNING。分配的依据是分区(Partition)和优先级(Priority)。

第四步:作业执行

分配完成后,slurmd(每个节点上的代理)会启动你的任务。这时候你可以用 scontrol show job 查看详情。

第五步:作业结束

任务跑完,状态变成 COMPLETED。如果出错了,就是 FAILEDTIMEOUT

核心要点:整个工作流就是“提交→排队→分配→执行→结束”。记住这个流程,后面讲调度策略时你就知道每一步在干什么。

核心组件:slurmctld 和 slurmd

SLURM有两个“大脑”,一个管全局,一个管局部。

slurmctld:中央控制器

这是SLURM的主进程,运行在管理节点上。它负责:

  • 接收作业提交请求
  • 维护作业队列
  • 决定资源分配
  • 监控节点状态

说白了,它就是集群的“总指挥”。我见过有人把slurmctld跑在计算节点上,结果计算节点一重启,整个集群就瘫痪了。记住:slurmctld必须跑在可靠的管理节点上,最好做高可用。

slurmd:节点代理

每个计算节点上都有一个slurmd进程。它听命于slurmctld,负责:

  • 启动、监控、清理作业
  • 上报节点状态(负载、内存、CPU等)
  • 执行本地任务

你可以把slurmd想象成“现场执行员”。slurmctld说“在node01上跑作业”,slurmd就乖乖照做。

我的经验:如果slurmd挂了,节点会变成 DOWN 状态。我曾经排查过一个故障,发现是slurmd日志把磁盘写满了。所以,记得给日志做轮转(logrotate)。

作业状态管理:从PENDING到COMPLETED

作业状态是SLURM的核心概念。你提交作业后,可以用 squeue 查看状态。常见的状态有这些:

状态码 含义 说明
PENDING 排队中 资源不足或依赖条件未满足
RUNNING 运行中 资源已分配,任务正在执行
COMPLETED 已完成 正常结束,退出码为0
FAILED 失败 作业异常退出,退出码非0
CANCELLED 被取消 用户或管理员手动取消
TIMEOUT 超时 运行时间超过设定的时间限制
NODE_FAIL 节点故障 运行过程中节点宕机

为什么会超时?因为你在提交作业时没设好 --time 参数。我见过一个用户跑了个需要3天的任务,只给了1小时,结果跑到59分钟时被SLURM直接杀掉。嗯,这很坑。

状态转换图(用文字描述):

提交 → PENDING → RUNNING → COMPLETED
                ↓           ↓
              CANCELLED   FAILED/TIMEOUT/NODE_FAIL

避坑指南:我曾经遇到一个情况,作业状态显示 COMPLETED,但输出文件是空的。后来发现是脚本里有个 exit 0 写在了实际计算之前。所以,COMPLETED 只代表SLURM认为作业正常结束,不代表你的计算结果正确。一定要检查输出文件。

常用管理命令

这里列几个我天天用的命令:

  • squeue:查看作业队列。加 -u username 只看某个用户的作业。
  • scancel jobid:取消作业。我习惯先 squeue 查ID,再 scancel
  • scontrol show job jobid:查看作业详细信息。比如分配了哪些节点、用了多少内存。
  • sinfo:查看节点和分区状态。能快速知道哪些节点是 idle(空闲)、哪些是 down(宕机)。

举个例子,你想看作业12345的详细信息:

scontrol show job 12345

输出会告诉你作业的优先级、依赖关系、分配的资源等。我个人觉得 scontrol 是排查问题的利器。

总结一下:SLURM的工作流就是“提交→排队→运行→结束”。核心组件是slurmctld(总指挥)和slurmd(现场执行员)。作业状态有PENDING、RUNNING、COMPLETED等,每个状态都有其含义。记住这些基础,后面讲调度策略时你就能理解为什么作业会排队、为什么会被优先调度。

好了,这一章就到这里。下一章我们聊聊如何配置SLURM的调度策略,让你的集群跑得更高效。