跳转到内容

集群手册/SLURM

来自维基教科书,开放世界中的开放书籍

集群是一个需要控制和管理的资源网络,以实现无错误的过程。节点必须能够相互通信,通常分为两类 - 登录节点(也称为主节点或服务器节点)和工作节点(也称为客户端节点)。通常用户无法直接访问工作节点,但可以在所有节点上运行程序。通常有几个用户为自己申领资源。因此,这些资源的分配不能由用户自己设置,而是根据特定的规则和策略进行。所有这些任务都由作业和资源管理系统 - 批处理系统来处理。

批处理系统概述

[编辑 | 编辑源代码]

批处理系统是管理资源的服务,也是用户的接口。用户发送作业 - 带有执行和所需资源和条件描述的任务。所有作业都必须由批处理系统管理。批处理系统的主要组件是服务器和客户端。服务器是主要组件,提供用于监控的接口。服务器的主要任务是将资源管理到注册的客户端。客户端的主要任务是执行待处理的程序。客户端还会收集有关程序过程和系统状态的所有信息。这些信息可以根据请求提供给服务器。批处理系统的第三个可选组件是调度程序。一些批处理系统内置了调度程序,但都提供了将外部调度程序集成到系统中的选项。调度程序根据某些规则设置:谁、何时以及可以使用多少资源。具有上述所有组件的批处理系统是 SLURM,本节将介绍其背景信息以及安装和使用说明。Qlustar 也集成了 SLURM。

SLURM 基础

[编辑 | 编辑源代码]

SLURM(Simple Linux Utility for Resource Management)是一个免费的批处理系统,集成了作业调度程序。SLURM 由劳伦斯利弗莫尔国家实验室、SchedMD、Linux Networx、惠普和布尔集团于 2002 年联合开发而成。很快,100 多名开发人员参与了该项目。这些努力的结果是一个软件,该软件用于 TOP-500 列表中的许多高性能计算机(也是目前最快的 天河二号[1])。SLURM 的特点是容错能力非常高、可扩展性和效率高。守护进程(参见第 5.3 节)有备份,以及各种动态响应错误的选项。它可以管理超过 100,000 个作业,每秒高达 1000 个作业,每秒可以执行高达 600 个作业。目前未使用的节点可以关闭以节省电力。此外,SLURM 具有相当高的跨多种操作系统的兼容性。最初为 Linux 开发,今天支持更多平台:AIX、*BSD(FreeBSD、NetBSD 和 OpenBSD)、Mac OS X、Solaris。也可以将不同的系统交叉链接并在其上运行作业。对于调度,已经开发出了一个成熟的概念,并具有多种选项。通过策略选项,可以生成许多级别,每个级别都可以管理。因此,可以集成一个数据库,其中可以记录用户组和项目,这些组和项目受其自身规则约束。用户还可以根据其所属的组或项目来分配权利。SLURM 是一个正在开发的活跃项目。2010 年,开发人员创建了 SchedMD 公司,并为 SLURM 提供付费支持。S

SLURM 的核心是两个守护进程[2] - slurmctldslurmd。两者都可以有备份。顾名思义,Controldaemon 运行在服务器上。它初始化、控制和记录资源管理器的所有活动。该服务分为三个部分 - 作业管理器,它管理等待作业的队列;节点管理器,它保存节点的状态信息;分区管理器,它分配节点。第二个守护进程运行在每个客户端上。它执行来自 slurmctldsrun 的所有指令。使用特殊命令 scontrol,客户端会进一步将其状态信息扩展到服务器。如果连接建立,则可以从服务器访问各种 SLURM 命令。其中一些理论上可以从客户端调用,但通常仅在服务器上执行。

图 5.1:具有两个最重要服务的 SLURM 基础设施。

在图 5.1 中,举例说明了一些命令。下面将详细解释五个最重要的命令。

此命令显示节点和分区信息。使用其他选项可以过滤和排序输出。

清单 5.1 sinfo 命令的输出。
$ sinfo
PARTITION   AVAIL   TIMELIMIT   NODES   STATE   NODELIST
debug*         up    infinite       1   down*   worker5
debug*         up    infinite       1   alloc   worker4

PARTITION 列显示了分区名称。星号表示默认名称。AVAIL 列指的是分区,可能显示为 updownTIME LIMIT 显示用户指定的时间限制。如果没有指定,则认为值为无限。STATE 表示列出节点的 NODES 状态。可能的状态为 ,其中相应的缩写如下:alloccompdonwdraindrngfailfailgidleunk。星号表示未收到节点的反馈。NodeList 显示配置文件中设置的节点名称。该命令可以接受多个选项,一方面可以查询附加信息,另一方面可以根据需要格式化输出。完整列表 - https://computing.llnl.gov/linux/slurm/sinfo.html PARTITION 列显示了分区名称。星号表示默认名称。AVAIL 列指的是分区,可能显示为 updownTIME LIMIT 显示用户指定的时间限制。如果没有指定,则认为值为无限。STATE 表示列出节点的 NODES 状态。可能的状态为 ,其中相应的缩写如下:alloccompdonwdraindrngfailfailgidleunk。星号表示未收到节点的反馈。NodeList 显示配置文件中设置的节点名称。该命令可以接受多个选项,一方面可以查询附加信息,另一方面可以根据需要格式化输出。完整列表 - https://computing.llnl.gov/linux/slurm/sinfo.html

使用此命令,您可以交互式地发送作业和/或分配节点。

清单 5.2 交互式 srun 使用。

$ srun -N 2 -n 2 hostname 在此示例中,您要执行 2 个节点,总共 (不是每个节点) 2 个 CPU hostname

清单 5.3 带有某些选项的 srun 命令。

$ srun -n 2 --partition=pdebug --allocate 使用 –allocate 选项,您可以分配预留的资源。在这种情况下,可以运行程序,这些程序不会超出注册资源的范围。
选项完整列表 - https://computing.llnl.gov/linux/slurm/srun.html

scancel

[edit | edit source]

此命令用于中止作业或一个或多个作业步骤。作为参数,您传递要停止的作业的 ID。允许取消哪些作业取决于用户的权限。

清单 5.4 带有某些选项的 scancel 命令。

$ scancel --state=PENDING --user=fuchs --partition=debug 在示例中,您要取消所有处于 状态、属于用户 fuchs 且位于分区 debug 中的作业。如果您没有权限,输出将相应显示。
选项完整列表 - https://computing.llnl.gov/linux/slurm/scancel.html

squeue

[edit | edit source]

此命令显示作业特定的信息集。同样,可以控制输出和有关附加选项的信息范围。

清单 5.5 squeue 命令的输出。
$ squeue
JOBID PARTITION    NAME  USER ST TIME NODES NODELIST(REASON)
    2     debug script1 fuchs PD 0:00     2 (Ressources)    
    3     debug script2 fuchs  R 0:03     1 worker4

JOBID 表示作业的识别号码。NAME 列显示作业对应的 ID 名称,并且可以手动修改或扩展。ST 是作业的状态,例如示例中的 PD - R - (还有许多其他状态)。相应地,TIME 下的计时器仅对状态设置为 的作业运行。此时间没有限制,而是作业的当前运行时间。如果作业处于挂起状态,计时器将保持在 0:00。作业未运行的原因将在下一列中显示。在 NODES 下,您可以看到作业所需的节点数量。当前作业只需要一个节点,而等待的作业需要两个节点。最后一列还显示了作业未运行的原因,例如 (Ressources)。要获取更详细的信息,必须传递其他选项。
完整列表 - https://computing.llnl.gov/linux/slurm/squeue.html

scontrol

[edit | edit source]

此命令用于查看或修改一个或多个作业的 SLURM 配置。大多数操作只能由 root 执行。您可以直接在调用后写入所需的选项和命令,或者单独调用 scontrol 并继续在此上下文中工作。

清单 5.6 使用 scontrol 命令。
$ scontrol
scontrol: show job 3
JobId=3 Name=hostname

   UserId=da(1000) GroupId=da(1000)

   Priority=2 Account=none QOS=normal WCKey=*123

   JobState=COMPLETED Reason=None Dependency=(null)

   TimeLimit=UNLIMITED Requeue=1 Restarts=0 BatchFlag=0 ExitCode=0:0

   SubmitTime=2013-02-18T10:58:40 EligibleTime=2013-02-18T10:58:40

   StartTime=2013-02-18T10:58:40 EndTime=2013-02-18T10:58:40

   SuspendTime=None SecsPreSuspend=0

   Partition=debug AllocNode:Sid=worker4:4702

   ReqNodeList=(null) ExcNodeList=(null)

   NodeList=snowflake0

   NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqS:C:T=1:1:1

   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0

   Features=(null) Reservation=(null) 
scontrol: update JobId=5 TimeLimit=5:00 Priority=10

此示例显示了从上下文中使用该命令的方式。可以使用特定的查询设置要获取的信息量。
完整选项列表 - https://computing.llnl.gov/linux/slurm/scontrol.html

操作模式

[edit | edit source]

基本上有两种操作模式。您可以从服务器以交互方式调用已编译的程序。在这里,您可以提供一些选项,例如程序要运行的节点数和进程数。编写作业脚本要便宜得多,在作业脚本中,可以清楚地保留选项或对其进行注释。以下部分提供了交互模式中选项的语法和语义,并解释了作业脚本。

交互式

[edit | edit source]

这里的关键命令是 srun。因此,您可以以交互方式执行作业并分配资源。后面跟着传递给批处理系统的选项。有一些选项的值是在 SLURM 中为环境变量设置的(请参阅第 5.3 节)。

作业脚本

[edit | edit source]

作业脚本是一个文件,例如包含 shell 命令。没有输入或输出参数。在作业脚本中,环境变量直接设置。因此,需要用 #SBATCH 标记行。以井号开头的其他行是注释。作业脚本的主要部分是程序调用。但是,可以选择传递与交互模式类似的其他参数。

清单 5.7 作业脚本示例。
#!/bin/sh

# Time limit in minutes.
#SBATCH --time=1
# A total of 10 processes at 5 knots
#SBATCH -N 5 -n 10
# Output after job.out, Errors after job.err.
#SBATCH --error=job.err --output=job.out

srun hostname

该脚本按通常方式调用,并运行所有包含的命令。一个作业脚本可以包含多个程序调用,甚至来自不同程序的调用。每个程序调用都可以附加冗余选项,这些选项可以覆盖环境变量。如果没有进一步的说明,脚本开头指定的选项将适用。

安装

[edit | edit source]

安装 SLURM 与其他软件一样,可以通过完成的 Ubuntu 包安装,也可以手动安装,但手动安装要复杂得多。对于当前版本,仍然没有完成的软件包。如果不需要下面列出的新版本的优势,则旧版本就足够了。以下各节提供了两种方法的说明。2.5.3 版本中的改进

  • 消除了作业依赖项中的竞争条件
  • 有效清理已终止的作业
  • 正确处理 glibgtk
  • 修复了针对较新编译器的错误
  • 更好的 GPU 支持

软件包

[edit | edit source]

预制软件包包含版本 2.3.2。使用

$ apt-get install slurm-llnl 您下载了该软件包。在第二步中,必须创建一个配置文件。有一个网站接受手动输入并自动生成该文件 - https://computing.llnl.gov/linux/slurm/configurator.html。在这种情况下,只需要调整机器名称。最重要的是,此文件必须在所有客户端和服务器上完全相同。守护程序会自动启动。使用 sinfo,您可以快速检查一切是否正常。

手动

[edit | edit source]

通过链接,您可以下载包含最新版本(2.5.3)的存档。必须解压缩该存档。

$ wget http://schedmd.com/download/latest/slurm-2.5.3.tar.bz2 $ tar --bzip -x -f slurm*tar.bz2 此外,还必须调用配置。指示没有选项就足够了,但是,应确保服务器和客户端上的目录相同,因为否则必须在每个客户端上单独安装它。如果 gccmake 可用,则安装 SLURM。

$ ./configure --prefix=/opt/slurm_2.5.3 $ make $ make install 与上一节一样,即使手动安装,也必须创建配置文件(请参阅上面的链接)。需要调整机器名称。ReturnToService 选项应设置为 2。否则,在节点出现故障后,即使该节点再次可用,也不会再招募它。此外, 应该被选中。

Munge

Munge 是一种高度可扩展的身份验证服务。它需要客户端节点仅响应来自“真实”服务器的请求,而不是来自任何服务器的请求。为此,必须生成一个密钥并将其复制到所有关联的客户端节点和服务器。Munge 可以像往常一样安装。为了使身份验证请求正确执行,所有机器上的时钟必须同步。为此,ntp 服务就足够了。相对误差在 Munge 的容差范围内。作为服务器,SLURM 服务器也应该被注册。
安装 Munge 后,将添加一个系统用户,该用户是在配置文件中指定的(默认情况下为 slurm)。

$ sudo adduser --system slurm 目标是每个用户都可以从其工作目录提交作业并执行 SLURM 命令。这要求在 /etc/environment 中定制 PATH。添加以下路径

/opt/slurm_2.5.3/sbin: 该路径当然是指 SLURM 安装的目录,也可能有所不同。现在,用户可以从任何目录调用 SLURM 命令。但是,这不包括 sudo 命令,因为它们不从环境变量路径读取。为此,您使用以下方法

$ sudo $(which <SLURM-Command>) 使用 which,您可以获取从修改后的环境变量读取的命令的完整路径。将此路径传递给 sudo 命令。这可能很有用,因为在手动安装后,两个守护程序都必须手动启动。在服务器上执行 slurmctld,在客户端机器上执行 slurmd。使用附加选项 -D -vvvv,您可以更详细地查看错误消息(如果有错误)。-D 表示调试,-v 表示 。连接的“v”越多,输出越详细。

调度程序

[edit | edit source]

调度器是一种仲裁逻辑,用于控制作业的时间顺序。本节介绍 SLURM 的内部调度器及其各种选项。还涵盖了潜在的外部调度器。

内部调度器

[编辑 | 编辑源代码]

在配置文件中,可以定义三种方法 -

这种方法基于 FIFO 原则,无需进一步干预。

回填过程是一种高效分配的 FIFO。当作业需要当前空闲的资源,并且排在其他作业之后时,而这些作业的资源要求目前无法满足,则会优先考虑“次要”作业。用户定义的时间限制是相关的。

图 5.2:FIFO 和回填策略的影响。


在图形 [fig:schedul] 中,左侧显示了初始情况,其中有三个作业。作业 1 和作业 3 只需要一个节点,而作业 2 需要两个节点。最初,两个节点均未处于繁忙状态。按照 FIFO 策略,作业 1 会被执行并阻塞一个节点。另外两个作业必须在队列中等待,尽管仍然有一个节点可用。按照回填策略,作业 3 将优先于作业 2,因为作业 3 所需的资源当前是空闲的。这里非常重要的是规定的时间限制。作业 3 在作业 1 完成之前完成,因此如果两个节点都可用,它不会阻止作业 2 的执行。如果作业 3 具有更长的超时时间,则不会优先考虑该作业。

集群调度只在应用程序被接受时才有一种应用,即资源不会被独占分配(必须指定选项 –shared)。此时,它会在时间片之间切换。集群调度会导致在尽可能相同的时间段内处理所属进程,从而减少上下文切换。SchedulerTimeSlice 选项以秒为单位指定时间段的长度。如果多个进程争用资源,则可以在此时间片内使用 builtinbackfill 调度。在旧版本(低于 2.1)中,分配遵循循环轮询原则。
要使用集群调度,至少要设置三个选项

PreemptMode             = GANG
SchedulerTimeSlice      = 10
SchedulerType           = sched/builtin

默认情况下,4 个进程能够分配相同的资源。使用选项

Shared=FORCE:xy 可以定义数字

但是,SLURM 的调度功能并不局限于这三种策略。借助 选项,可以改进和调整每种策略,以满足用户和管理员的需求。策略是一种适用于任何作业、用户或组或项目的规则。在大型系统中,当每个用户都有自己的一组特定规则时,很快就会变得混乱。因此,SLURM 还通过 MySQL 或 PortgreSQL 支持数据库连接。要使用数据库,需要为 SLURM 显式配置它们。在 SLURM 部分,需要设置某些选项,以便将策略规则应用于定义的组。详细描述 - https://computing.llnl.gov/linux/slurm/accounting.html

调度中的大多数选项都针对作业的优先级。SLURM 使用一种复杂的计算方法来确定优先级 - 。五个因素在计算中发挥作用 - (等待作业的等待时间)、(已分配资源和已使用资源之间的差值)、(已分配节点的数量)、(分配给节点组的一个因素)、(服务质量因素)。这些因素中的每一个也将获得权重。这意味着某些因素被定义为更占主导地位。总的优先级是加权因素的总和( 值介于 0.0 和 1.0 之间)

Job_priority =
    (PriorityWeightAge) * (age_factor) +
    (PriorityWeightFairshare) * (fair-share_factor) +
    (PriorityWeightJobSize) * (job_size_factor) +
    (PriorityWeightPartition) * (partition_factor) +
    (PriorityWeightQOS) * (QOS_factor)

可以在此处找到有关因素及其组成的详细描述:https://computing.llnl.gov/linux/slurm/priority_multifactor.html
特别有趣的是 QoS ()-因素。使用它的前提是,并且 PriorityWeightQOS 不为零。用户可以为每个作业指定一个 QoS。这会影响调度、上下文跳转和限制。允许的 QoS 在数据库中以逗号分隔列表的形式指定。该列表中的 QoS 可以被相关组的用户使用。默认值 normal 不会影响计算。但是,如果用户知道他的作业特别短,他可以如下定义他的作业脚本

#SBATCH --qos=short 此选项会提高作业的优先级(如果配置正确),但在其 QoS 中描述的时间限制后会取消它。因此,人们应该现实地考虑。可用的 QoS 可以使用以下命令显示

$ sacctmgr show qos QoS 的默认值如下所示:[3]

表 5.1:QoS 的默认值。
QoS 每个作业的墙上时间限制 每个作业的 CPU 时间限制 QoS 的总节点限制 每个用户的节点限制
short 1 小时 512 小时
normal(Standard) 4 小时 512 小时
medium 24 小时 32
long 5 天 32
long_contrib 5 天 32
support 5 天


这些值可以通过管理员在配置中更改。示例

MaxNodesPerJob=12 完整列表 - https://computing.llnl.gov/linux/slurm/resource_limits.html

外部调度程序

[edit | edit source]

SLURM 与各种其他调度程序兼容 - 这包括 Maui、Moab、LSF 和 Catalina。如果应该集成外部调度程序,则在配置文件中应选择 Builtin

Maui 是 Adaptive Computing 提供的免费调度程序。[4]) Maui 的开发始于 2005 年。注册后,该软件包可以在制造商方面下载。该版本需要 Java 安装。Maui 具有许多策略和调度选项,但现在由 SLURM 本身提供。

Moab 是 Maui 的继任者。自 Maui 项目启动以来,Adaptive Computing 已在 Moab 名称下并根据商业许可开发了该软件包。Moab 的扩展性比 Maui 更好。该产品还提供付费支持。

LSF - Load Sharing Facility - 是 IBM 的商业软件。该产品不仅适用于 IBM 计算机,还适用于具有 Windows 或 Linux 操作系统的系统。

Catalina

Catalina 是一个持续多年的项目,目前有一个预发布版本。它包含 Maui 的许多功能,支持网格计算,并允许在特定时间后保证可用节点。使用它需要 Python。

结论

[edit | edit source]

该产品可以轻松使用。SLURM 的开发适应了当前的需求,因此它不仅可以用于小规模(少于 100 个核心),还可以用于领先的高可扩展架构。这得益于 SLURM 的可靠性和先进的容错功能。SLURM 的调度程序选项几乎满足所有需求,不需要扩展。总的来说,SLURM 是一款非常棒的最新软件。

参考文献

[edit | edit source]
  1. [foot:top500]http://www.top500.org/system/177999
  2. [foot:daemon] daemon - disk and execution monitor - On UNIX, a utility running in the background
  3. http://www.umbc.edu/hpcf/resources-tara/scheduling-policy.html
  4. http://www.adaptivecomputing.com/products/open-source/maui/
华夏公益教科书