作业启动原理
在slurm下,用户可以在三种模式下运行作业。
-
第一种也是最简单的模式是交互模式,其中stdout和stderr实时显示在用户终端上,stdin和信号可以透明地从终端转发到远程任务。
-
第二种模式是批处理或排队模式,在这种模式下,作业将排队,直到满足资源请求,此时slurm将作为提交用户运行作业。
-
第三个模式分配模式,作业被分配给请求用户,在该模式下,用户可以通过脚本或在srun生成的子shell中手动运行作业步骤。
srun从slurmctld请求资源分配和作业步骤启动,如果请求被批准,它将用作业id、已分配节点列表、作业步骤凭据等进行响应,srun然后初始化stdio连接的侦听端口,并连接到所分配节点上的slurmd,请求启动远程进程。slurmd开始执行任务,并连接回srun进行stdout和stderr。下面将更详细地描述该过程和其他启动模式。
- 步骤一:srun连接到slurmctld请求资源
- 步骤二:slurmctld相应连接,包括节点列表,状态信息,作业步凭证等
- 步骤三:srun打开作业IO连接的侦听端口,然后将运行作业步骤请求发送到slurmd
- 步骤四:slurmd启动作业步并连接回标准输出,标准错误
交互式作业启动
交互模式以用户运行srun开始执行。srun会向slurmctld发送一个信息,来请求资源和作业步的初始化。由于资源分配优先级的问题,srun可能不会立即得到回应。当资源可用时,slurmctld向srun发送回应信息,该信息包括作业步的认证,可用节点列表等。收到回复信息后srun向slurmd发送作业步初始化请求,slurmd判断收到的请求作业是否合法,然后回复srun。每一个slurmd调用一个作业线程来处理请求,对每一个请求返回一个任务线程,任务线程连接srun主机的端口来准备stdout和stderr线程。一旦此连接成功,任务线程便开始初始化用户在计算节点上的运行环境,工作目录和所需资源等。一旦用户进程退出,任务线程便记录退出时状态然后发送任务结束信息给srun,当所有的进程结束,作业线程便退出。
最后一旦所有任务完成,srun将向slurmctld释放分配的节点,然后以适当的状态退出。当slurmctld收到通知,表示srun不再需要分配的节点时,它会发出请求,要求在分配中的每个slurmd上运行尾声。当slurmd报告结束日志成功运行时,节点将返回到分区。
交互式作业启动分析
批处理作业启动
批处理作业提交,srun给slurmctld发送一个批处理作业请求,该请求包含作业stdin/stderr的位置,当前工作目录环境,请求的节点数。slurmctld将所有的请求按照某种优先级队列规则对他们进行排序。一旦资源满足并且作业优先级当前可以执行,slurmctld将给该作业分配资源并且告诉第一个被分配的节点该作业可以开始执行。若此时作业为一个包含多个srun命令的作业脚本。计算节点上的slurmd应答slurmctld的运行作业请求、初始化作业线程、任务线程。脚本中的srun进程检测到分配给它的资源,然后开始初始化作业步,准备执行。当作业步执行完毕,脚本中的srun进程通知slurmctld并终止执行。而作业脚本此时继续执行下一条srun进程。一旦作业脚本执行完毕,运行该脚本的任务线程便收集退出状态,将任务退出信息发送给slurmctld,slurmctld到作业执行完毕,要求所有分配的节点执行epilog程序。当所有slurmd回应成功执行完毕epilog后,节点才会被归还给作业分区。
批处理作业启动实例分析:
分配式作业启动
在分配模式下,用户希望分配作业,并在该分配下以交互方式运行作业步。Srun给slurmctld发送一个分配请求,如果资源可分配,则slurmctld应答srun。Srun在用户终端产生一个shell以便其使用资源。Shell中的srun读取环境变量和用户命令,并通知slurmctld,此时执行的作业为当前作业下的一个作业步。Slurmctld记录作业步信息并返回一个作业认证。接下来Srun用和交互模式相同的方法来初始化作业步。当用户退出shell,原始的srun接收到退出状态信息,通知slurmctld作业已完成,并退出。shell退出,则认定作业执行完毕。Slurm control daemon在每一个被分配节点上运行epilog程序,当所有被分配节点运行完毕该程序,节点才会被放回分区。
分配式作业启动分析
分配资源争用情况: