作业启动设计指南

概述

本指南从高层次描述了启动作业时发生的过程,包括涉及的守护进程和插件。 它描述了作业分配、步骤分配、任务启动和作业终止的过程。数万行代码的功能 在这里被简化为几页文本,因此许多细节被省略。

作业分配

该过程的第一步是创建一个作业分配,即对计算资源的声明。可以使用 sallocsbatchsrun 命令创建作业分配。sallocsbatch 命令创建资源分配,而 srun 命令将在没有现有分配的情况下创建资源分配并启动任务。这些命令中的每一个都会 根据命令行选项和环境变量填充一个数据结构以标识作业分配要求(例如节点 数量、任务数量等),并将 RPC 发送到 slurmctld 守护进程。启动作业的用户的 UID 和 GID 将包含在凭证中,稍后将用于限制对作业的访问,因此在分配中运行的进一步步骤 需要使用与创建分配时相同的 UID 和 GID 启动。如果新的作业 请求是最高优先级,slurmctld 守护进程将立即尝试为其选择资源,否则将验证 作业请求可以在某个时间得到满足并排队请求。在任何一种情况下 请求几乎会立即收到以下之一的响应:

  • 作业 ID 和资源分配规范(节点、CPU 等)
  • 作业 ID 和作业处于排队状态的通知或
  • 错误代码

为作业请求选择资源的过程涉及多个步骤, 其中一些涉及插件。过程如下:

  1. 调用 job_submit 插件以适当修改请求
  2. 验证选项对该用户是否有效(例如,有效的分区 名称、有效的限制等)
  3. 确定该作业是否为最高优先级可运行作业,如果是,则 立即尝试为其分配资源,否则仅验证如果没有其他作业存在它 可以运行
  4. 确定哪些节点可以用于作业。如果功能 规范使用排他或选项,则下面的选择过程将需要多次迭代 具有不相交的节点集
  5. 调用 select 插件为请求选择最佳资源
  6. select 插件将考虑网络拓扑和节点内的拓扑(例如插槽、核心和线程)以选择 作业的最佳资源
  7. 如果无法使用可用资源启动作业并且配置了抢占 支持,select 插件还将确定作业是否可以在抢占低优先级作业后启动。 如果可以,则根据需要启动抢占以启动作业

步骤分配

srun 命令始终用于作业步骤创建。它使用来自命令行和环境 变量的信息填充作业步骤请求 RPC,然后将该请求发送到 slurmctld 守护进程。 需要注意的是,许多 srun 选项是为作业分配准备的,并且不受作业步骤请求 RPC 支持 (例如,插槽、核心和线程信息不受支持)。如果作业步骤使用 分配给作业的所有资源,那么某些选项缺乏支持并不重要。如果希望使用 分配给作业的各种子集执行多个作业步骤,这种缺陷可能会 造成问题。还值得注意的是,用于选择作业步骤资源的逻辑相对简单,并且完全包含在 slurmctld 守护进程代码中(select 插件不用于作业 步骤)。如果由于请求 对资源的独占访问而无法立即满足请求,将发送适当的错误消息,并且 srun 命令将定期重试请求。 (注意:希望能够排队作业步骤请求以支持 作业步骤依赖性并在作业步骤启动时获得更好的性能, 但目前不支持。) 如果请求可以满足,响应将包含一个数字签名的 凭证(由 cred 插件签名),标识要使用的资源。

任务启动

srun 命令构建一个任务启动请求数据结构 ,包括凭证、可执行文件名、文件名等,并将其发送到 作业步骤分配节点零上的 slurmd 守护进程。slurmd 守护进程验证签名并将请求转发给 其他节点上的 slurmd 守护进程以启动该作业步骤的任务。消息转发的 分支度可以使用 TreeWidth 参数进行配置。每个 slurmd 守护进程测试作业 在凭证发出后是否未被取消(由于可能的竞争条件),并生成一个 slurmstepd 程序来管理作业步骤。 请注意,slurmctld 守护进程不直接参与任务 启动,以尽量减少对这一关键资源的开销。

每个 slurmstepd 程序执行单个作业步骤。 除了下面列出的功能外,slurmstepd 程序还会在不同时间执行几个 SPANK 插件功能。

  1. 执行 MPI 设置(使用适当的插件)
  2. 调用 switch 插件执行任何需要的网络配置
  3. 使用 proctrack 插件为作业步骤创建一个容器
  4. 将用户 ID 更改为用户的 ID
  5. 为任务配置 I/O(使用文件或套接字连接回 srun 命令
  6. 为任务设置环境变量,包括许多任务特定的 环境变量
  7. fork/exec 任务

作业步骤终止

作业步骤或作业可以通过多种方式终止,每种方式在执行的逻辑上略有不同。最简单的情况是任务运行 到完成。srun 将注意到任务输出的终止并通知 slurmctld 守护进程作业步骤已完成。 slurmctld 将简单地记录作业步骤终止。作业步骤也可以由用户显式取消,达到其时间限制等, 这些步骤与作业终止的步骤非常相似,下面将描述。

作业终止

作业终止可以是用户发起的(例如 scancel 命令)或系统 发起的(例如时间限制已到)。终止最终需要 slurmctld 守护进程通知分配节点上的 slurmd 守护进程 结束作业。slurmd 守护进程执行以下操作:

  1. 向任何用户任务发送 SIGCONT 和 SIGTERM 信号
  2. 如果有任何用户任务,则等待 KillWait
  3. 向任何用户任务发送 SIGKILL 信号
  4. 等待所有任务完成
  5. 执行任何 Epilog 程序
  6. slurmctld 守护进程发送 epilog_complete RPC

作业记账记录

当 Slurm 配置为使用 SlurmDBD 存储作业记录时(即 AccountingStorageType=accounting_storage=slurmdbd),每个作业会存储多个 记录。除了整个作业的记录外,还有以下类型的作业步骤条目:

  • 外部步骤 — 为每个作业创建一个步骤,只要您在 slurm.conf 中 有 PrologFlags=contain。作业中的每个节点将为外部步骤创建一个 slurmstepd 进程。 pam_slurm_adopt 使用此步骤来包含 外部连接。
  • 批处理步骤 — 为使用 sbatch 提交的作业创建的步骤。批处理主机或作业的主节点将运行一个 slurmstepd 实例用于批处理步骤,用于运行提供给 sbatch 的脚本。
  • 交互式步骤 — 为使用 salloc 提交的作业创建的步骤,当 LaunchParameters=use_interactive_step 在您的 slurm.conf 中配置时。您拥有交互 shell 的节点将运行一个 slurmstepd 实例以运行 shell 或提供给 salloc 的命令。
  • 普通步骤 — 一个作业可以有多个普通步骤,这些步骤将在 sacct 中显示为 <job_id>.<step_id>。这些步骤 在从作业内部调用 srun 时创建,创建的 slurmstepd 将运行传递给 srun 的命令。每个步骤将在步骤中的每个节点上创建一个 slurmstepd 实例,并且每个 slurmstepd 实例可以在同一步骤中运行多个任务。

最后修改于 2022 年 8 月 1 日