HPC 系列文章(4):Slurm概览

Cover

经过前一篇文章的学习,大家应该对HPC集群调度系统有了初步的认识。接下来我们将以Slurm作为调度系统进行HPC作业相关的学习,会深入介绍Slurm的架构、配置及使用。

Slurm概述

Slurm是一个可工作于各种不同规模的Linux集群之上的开源、具备容错性和高度可扩展性的集群管理和作业调度系统。作为一款集群作业调度管理系统,Slurm包含三大主要功能:

  1. 资源分配:在特定时间段内为用户分配对计算资源的独占或非独占访问权限,以便他们可以执行作业。简单的说就是为作业提供对计算资源的授权和分配。
  2. 作业管理:它提供了在分配的节点上启动、执行和监控作业(通常是并行作业)的框架。
  3. 作业调度:通过管理待处理作业的队列来仲裁资源的争用。例如根据优先级或不同当调度策略调整资源的分配顺序。

除此之外还提供了可选的插件用于计费、资源预留、多种调度策略、拓扑优化的资源选择、基于用户或账户的资源限制以及复杂的多因素作业优先级算法等功能。

Slurm架构

架构图

先来看看这张官方提供的架构图,图中描述的是单集群内Slurm核心组件的架构及依赖关系。之所以强调单集群,是因为Slurm事实上支持多集群的部署,但为了便于理解,我们这里只介绍单集群的架构,理解之后自然会对多集群部署架构有一个清晰的概念。下面我们根据该图进行详细介绍:

slurmctld

Slurm有至少一个集中管理器slurmctld用于监控资源和作业,因为slurmctld对于整个集群管理来说至关重要,所以为了保证系统的高可用,你可以选择部署多个备用的slurmctld用以容灾。绝大多数功能和状态都是由slurmctld提供和管理的,安装了slurmctld的节点我们称之为主控节点,它就像是系统中的指挥官,掌控全局信息并指挥其他程序完成作业,包含以下作用:

  • 与计算节点上的slurmd进程保持通讯,负责作业下发及状态监控,slurmctld与slurmd是一对多的关系
  • 负责集群资源的整体调度
  • 负责集群作业队列的管理
  • 收集资源使用信息,并交由slurmdbd记录
  • 提供所有功能的接口,包括节点信息、作业信息、资源信息、作业控制等等

slurmd

每个计算节点上都会运行slurmd进程,用以接收主控节点的指令并汇报节点及任务状态。具体作用:

  • 与主控节点交换数据
  • 收集本机运行状态并将数据发送给主控节点
  • 负责运行作业并在整个作业生命周期中提供管理

slurmdbd

slurmdbd是可选的,没有它slurmd的作业系统也可以正常工作,不过实际环境中它却是必不可少的,它用于提供管理账户信息、资源使用情况、作业统计报表等等功能。主要功能:

  • 账户管理
  • 生成报表
  • 计费

命令行工具

除上述组件之外,slurm还提供了很多命令行工具,其中用户工具包括:

  • sbatch:用于创建批处理作业
  • srun:用于创建交互作业
  • salloc: 用于获取作业资源分配
  • scancel:用于终止排队等候或正在运行的作业
  • sinfo: 用于报告系统状态
  • squeue: 用于报告作业状态
  • sacct:用于获取正在运行或已经完成的作业或作业步信息
  • smap和sview: 以图形方式报告系统和作业状态, 包括网络拓扑
  • sreport:提供报表信息

管理员工具包括:

  • scontrol: 用于监视和/或修改集群上的配置和状态信息。
  • sacctmgr: 数据库管理工具用于识别群集,有效用户,有效的帐户等信息。

插件

Slurm包含了调度所需的各种功能,除基本功能之外Slurm还提供了可用于轻松支持各种基础设施的通用插件机制,这允许模块化的方式配置Slurm,下面列出部分Slurm支持的插件以及它们的功能:

  • Accounting Storage: 主要用于存储有关作业的历史数据。当与slurmdbd一起使用时,它还可以提供基于限制的系统以及历史系统状态。
  • Account Gather Energy: 收集系统中每个作业或节点的能耗数据,此插件集成于Accounting Storage和Job Account Gather插件中。
  • Authentication of communications: 提供Slurm各种组件之间的认证机制。
  • Checkpoint: 提供检查机制接口
  • Cryptography (Digital Signature Generation): 用于生成数字签名的机制,验证作业步被授权在特定节点上执行。这与用于验证的插件不同,因为作业步请求是从用户的srun命令而不是直接从slurmctld守护进程发出的,该插件用于生成作业步凭证及其数字签名。
  • Generic Resources:提供用于控制如GPU、CPU等通用资源的接口。
  • Job Submit: 自定义作业提交插件。
  • Job Accounting Gather: 收集作业步资源使用情况。
  • Job Completion Logging: 负责作业终止记录,所收集的数据通常是- Accounting Storage Plugin的子集。
  • Launchers: 控制srun命令用于启动任务的机制。
  • MPI: 为各种MPI实现提供不同的钩子。例如用于设置MPI特定的环境变量。
  • Preempt: 设定作业抢占机制。
  • Priority: 为作业指定优先级。
  • Process tracking (for signaling): 提供作业进度追踪,用于信号捕获及作业信息统计。
  • Scheduler: 决定作业如何调度。
  • Node selection: 决定资源如何分配。
  • Switch or interconnect: 交换机或互连接口插件。对于大多数系统(以太网或infiniband),这不是必需的。
  • Task Affinity: 提供绑定作业的机制,并将其各个任务分配给特定的处理器。
  • Network Topology:根据网络拓扑优化资源选择。用于工作分配和高级预约。

基本概念

concept

要正确理解Slurm的工作流程,我们需要先了解一些基本概念:

  • 节点(node):每一台安装并正确配置了slurmd进程的服务器就是一个节点。安装了slurmctld的节点虽然我们称之为主控节点,但实际上它并不是我们这里讨论的节点,这里指的节点即计算资源。
  • 分区(partition):分区将一组节点组合成逻辑上的一个集合,也有人称之为“队列”,实际上节点间并没有队列的概念,所以我认为“分区”是一个更合适的翻译。
  • 作业(job):特定时间为用户进行的一次资源申请或分配即可看作一个作业。这和我们惯性思维中的作业概念并不一致,传统意义上我们总是认为作业应该是某个运行的脚本或者程序,但事实上Slurm的作业只代表一次资源申请或分配。理解这个区别将有利于你理解Slurm中一些比较高级的用法。
  • 作业步(job step):Slurm中有作业步的概念,你可以理解为子作业。这允许我们在某个作业中分步骤的细分使用计算资源。

参考文档

坚持原创技术分享,您的支持将鼓励我继续创作!