概述

Slurm 是一个开源的、容错的、高度可扩展的集群管理和作业调度系统,适用于大规模和小型 Linux 集群。Slurm 的运行不需要内核修改,并且相对自给自足。作为一个集群工作负载管理器,Slurm 有三个关键功能。首先,它为用户分配独占和/或非独占的资源(计算节点)访问权,以便他们在一定时间内进行工作。其次,它提供了一个框架,用于在分配的节点集上启动、执行和监控工作(通常是并行作业)。最后,它通过管理待处理工作的队列来仲裁资源的竞争。可选插件可用于计费高级预定群组调度(并行作业的时间共享)、回填调度、拓扑优化资源选择按用户或银行账户的资源限制以及复杂的多因素作业优先级算法。

架构

Slurm 有一个集中式管理器slurmctld,用于监控资源和工作。也可能有一个备份管理器在发生故障时承担这些责任。每个计算服务器(节点)都有一个slurmd守护进程,可以与远程 shell 相比较:它等待工作,执行工作,返回状态,并等待更多工作。slurmd守护进程提供容错的分层通信。还有一个可选的slurmdbd(Slurm 数据库守护进程),可用于在单个数据库中记录多个 Slurm 管理的集群的计费信息。还有一个可选的slurmrestd(Slurm REST API 守护进程),可用于通过其REST API与 Slurm 进行交互。用户工具包括srun用于启动作业,scancel用于终止排队或正在运行的作业,sinfo用于报告系统状态,squeue用于报告作业状态,以及sacct用于获取有关正在运行或已完成的作业和作业步骤的信息。sview命令以图形方式报告系统和作业状态,包括网络拓扑。还有一个管理工具scontrol可用于监控和/或修改集群的配置和状态信息。用于管理数据库的管理工具是sacctmgr。它可用于识别集群、有效用户、有效银行账户等。所有功能都有 API 可用。


图 1. Slurm 组件

Slurm 具有通用插件机制,可轻松支持各种基础设施。这允许使用构建块方法进行多种 Slurm 配置。这些插件目前包括:

  • 计费存储: 主要用于存储有关作业的历史数据。当与 SlurmDBD(Slurm 数据库守护进程)一起使用时,它还可以提供基于限制的系统以及历史系统状态。
  • 能耗收集: 收集每个作业或系统中节点的能耗数据。此插件与计费存储和作业账户收集插件集成。
  • 通信认证: 提供 Slurm 各个组件之间的认证机制。
  • 容器: HPC 工作负载容器支持和实现。
  • 凭证(数字签名生成): 用于生成数字签名的机制,该签名用于验证作业步骤是否被授权在特定节点上执行。这与用于认证的插件不同,因为作业步骤请求是从用户的 srun 命令发送的,而不是直接从 slurmctld 守护进程发送的,后者生成作业步骤凭证及其数字签名。
  • 通用资源:提供控制通用资源的接口,包括图形处理单元(GPU)。
  • 作业提交: 自定义插件,允许对作业要求在提交和更新时进行特定站点的控制。
  • 作业计费收集: 收集作业步骤资源利用数据。
  • 作业完成日志: 记录作业的终止数据。这通常是由计费存储插件存储的数据的子集。
  • 启动器: 控制 'srun' 命令用于启动任务的机制。
  • MPI: 为各种 MPI 实现提供不同的钩子。例如,这可以设置特定于 MPI 的环境变量。
  • 抢占: 确定哪些作业可以抢占其他作业以及使用的抢占机制。
  • 优先级: 在提交时为作业分配优先级,并在持续的基础上(例如,随着时间的推移)进行调整。
  • 进程跟踪(用于信号): 提供识别与每个作业相关的进程的机制。用于作业计费和信号。
  • 调度器: 插件决定 Slurm 如何以及何时调度作业。
  • 节点选择: 插件用于确定作业分配所使用的资源。
  • 站点因子(优先级): 在提交时为作业的多因素优先级分配特定的站点因子组件,并在持续的基础上(例如,随着时间的推移)进行调整。
  • 交换机或互连: 用于与交换机或互连接口的插件。对于大多数系统(以太网或 InfiniBand),这不是必需的。
  • 任务亲和性: 提供将作业及其各个任务绑定到特定处理器的机制。
  • 网络拓扑: 基于网络拓扑优化资源选择。用于作业分配和高级预定。

这些 Slurm守护进程管理的实体,如图 2 所示,包括节点,Slurm 中的计算资源,分区,将节点分组为逻辑集,作业,或分配给用户的资源,指定时间段内的分配,以及作业步骤,即作业中的(可能是并行的)任务集。分区可以视为作业队列,每个队列都有各种约束,如作业大小限制、作业时间限制、允许使用的用户等。优先级排序的作业在分区内分配节点,直到该分区内的资源(节点、处理器、内存等)耗尽。一旦作业被分配了一组节点,用户就可以以任何配置在分配内启动并行工作。例如,可以启动一个使用所有分配给作业的节点的单一作业步骤,或者多个作业步骤可以独立使用分配的一部分。Slurm 为分配给作业的处理器提供资源管理,以便可以同时提交多个作业步骤并排队,直到作业的分配内有可用资源。


图 2. Slurm 实体

可配置性

监控的节点状态包括:处理器数量、实际内存大小、临时磁盘空间大小和状态(UP、DOWN 等)。其他节点信息包括权重(在分配工作时的偏好)和特性(诸如处理器速度或类型等任意信息)。节点被分组到分区中,分区可以包含重叠的节点,因此最好将其视为作业队列。分区信息包括:名称、关联节点列表、状态(UP 或 DOWN)、最大作业时间限制、每个作业的最大节点数量、组访问列表、优先级(如果节点在多个分区中则很重要)以及共享节点访问策略,具有可选的超额订阅级别以进行群组调度(例如,YES、NO 或 FORCE:2)。位图用于表示节点,调度决策可以通过执行少量比较和一系列快速的位图操作来做出。以下是一个示例(部分)Slurm 配置文件。

#
# 示例 /etc/slurm.conf
#
SlurmctldHost=linux0001  # 主服务器
SlurmctldHost=linux0002  # 备份服务器
#
AuthType=auth/munge
Epilog=/usr/local/slurm/sbin/epilog
PluginDir=/usr/local/slurm/lib
Prolog=/usr/local/slurm/sbin/prolog
SlurmctldPort=7002
SlurmctldTimeout=120
SlurmdPort=7003
SlurmdSpoolDir=/var/tmp/slurmd.spool
SlurmdTimeout=120
StateSaveLocation=/usr/local/slurm/slurm.state
TmpFS=/tmp
#
# 节点配置
#
NodeName=DEFAULT CPUs=4 TmpDisk=16384 State=IDLE
NodeName=lx[0001-0002] State=DRAINED
NodeName=lx[0003-8000] RealMemory=2048 Weight=2
NodeName=lx[8001-9999] RealMemory=4096 Weight=6 Feature=video
#
# 分区配置
#
PartitionName=DEFAULT MaxTime=30 MaxNodes=2
PartitionName=login Nodes=lx[0001-0002] State=DOWN
PartitionName=debug Nodes=lx[0003-0030] State=UP Default=YES
PartitionName=class Nodes=lx[0031-0040] AllowGroups=students
PartitionName=DEFAULT MaxTime=UNLIMITED MaxNodes=4096
PartitionName=batch Nodes=lx[0041-9999]

最后修改于 2021 年 8 月 6 日