概述
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 日