高级资源预留指南
Slurm 具有为特定用户和/或特定银行账户执行的作业预留资源的能力。 资源预留标识了该预留中的资源和预留可用的时间段。 可以预留的资源包括核心、节点、许可证和/或突发缓冲区。 包含节点或核心的预留与一个分区相关联, 并且不能跨多个分区分配资源。 唯一的例外是当 预留是通过明确请求的节点创建时。 请注意,资源预留与 Slurm 的 团体调度插件不兼容,因为无法准确预测正在运行的作业的终止时间。
请注意,预留的突发缓冲区和许可证的处理方式与预留的核心或节点有所不同。 当核心或节点被预留时,使用该预留的作业只能使用 这些资源(此行为可以使用 FLEX 标志更改),并且没有其他作业可以使用这些资源。 预留的突发缓冲区和许可证只能被与该预留相关联的作业使用,但未明确预留的许可证对任何作业都是可用的。 这消除了将许可证明确放入每个创建的高级预留中的需要。
预留只能由 root 用户或配置的 SlurmUser 使用 scontrol 命令创建、更新或销毁。 可以使用 scontrol 和 sview 命令 查看预留。此外,root 和配置的 SlurmUser 可以访问所有预留,即使他们通常没有访问权限。 各种命令的手册页包含详细信息。
预留创建
预留的一个常见操作模式是在特定时间为系统停机预留整个计算机。 下面的示例显示了在 2 月 6 日 16:00 创建全系统预留, 持续 120 分钟。 “maint”标志用于标识该预留作为系统维护的会计目的。 “ignore_jobs”标志用于指示在创建此预留时可以忽略当前正在运行的作业。 默认情况下,只有在开始时间不预计有正在运行的作业的资源可以被预留(所有正在运行的作业的时间限制将已达到)。 在这种情况下,我们可以根据需要手动取消正在运行的作业 以进行系统维护。 随着预留时间的临近, 只有能够在预留时间内完成的作业将被启动。
$ scontrol create reservation starttime=2009-02-06T16:00:00 \ duration=120 user=root flags=maint,ignore_jobs nodes=ALL 预留创建: root_3 $ scontrol show reservation ReservationName=root_3 StartTime=2009-02-06T16:00:00 EndTime=2009-02-06T18:00:00 Duration=120 Nodes=ALL NodeCnt=20 Features=(null) PartitionName=(null) Flags=MAINT,SPEC_NODES,IGNORE_JOBS Licenses=(null) BurstBuffers=(null) Users=root Accounts=(null)
这种变体是配置许可证以表示系统资源,例如全局文件系统。 系统资源可能不需要实际的许可证使用,但 Slurm 许可证可以用来防止需要该资源的作业在该资源不可用时启动。 可以为所有这些许可证创建一个预留,以便对该资源进行维护。 在下面的示例中,我们为 1000 个许可证创建一个名为 “lustre”的预留。 如果在此集群中配置了总共 1000 个 lustre 许可证, 则此预留将防止任何指定需要 lustre 许可证的作业在此预留期间被调度到此集群。
$ scontrol create reservation starttime=2009-04-06T16:00:00 \ duration=120 user=root flags=license_only \ licenses=lustre:1000 预留创建: root_4 $ scontrol show reservation ReservationName=root_4 StartTime=2009-04-06T16:00:00 EndTime=2009-04-06T18:00:00 Duration=120 Nodes= NodeCnt=0 Features=(null) PartitionName=(null) Flags=LICENSE_ONLY Licenses=lustre*1000 BurstBuffers=(null) Users=root Accounts=(null)
另一种操作模式是预留特定节点 以便于无限期研究这些节点上的问题。这也可以通过专门用于此目的的 Slurm 分区来完成,但这将无法捕捉到它们使用的维护性质。
$ scontrol create reservation user=root starttime=now \ duration=infinite flags=maint nodes=sun000 预留创建: root_5 $ scontrol show res ReservationName=root_5 StartTime=2009-02-04T16:22:57 EndTime=2009-02-04T16:21:57 Duration=4294967295 Nodes=sun000 NodeCnt=1 Features=(null) PartitionName=(null) Flags=MAINT,SPEC_NODES Licenses=(null) BurstBuffers=(null) Users=root Accounts=(null)
下一个示例是预留默认 Slurm 分区中的十个节点,从中午开始,持续 60 分钟,每天发生。该预留将仅对用户“alan”和“brenda”可用。
$ scontrol create reservation user=alan,brenda \ starttime=noon duration=60 flags=daily nodecnt=10 预留创建: alan_6 $ scontrol show res ReservationName=alan_6 StartTime=2009-02-05T12:00:00 EndTime=2009-02-05T13:00:00 Duration=60 Nodes=sun[000-003,007,010-013,017] NodeCnt=10 Features=(null) PartitionName=pdebug Flags=DAILY Licenses=(null) BurstBuffers=(null) Users=alan,brenda Accounts=(null)
下一个示例是预留 100GB 的突发缓冲区空间 从今天中午开始,持续 60 分钟。 该预留将仅对用户“alan”和“brenda”可用。
$ scontrol create reservation user=alan,brenda \ starttime=noon duration=60 flags=any_nodes burstbuffer=100GB 预留创建: alan_7 $ scontrol show res ReservationName=alan_7 StartTime=2009-02-05T12:00:00 EndTime=2009-02-05T13:00:00 Duration=60 Nodes= NodeCnt=0 Features=(null) PartitionName=(null) Flags=ANY_NODES Licenses=(null) BurstBuffer=100GB Users=alan,brenda Accounts=(null)
请注意,与预留关联的特定节点在预留创建后立即被识别。这允许 用户在预留期间准备使用的节点上准备文件。请注意,预留创建请求还可以 识别选择节点的分区或每个选择节点必须包含的 _一个_ 特性。
在较小的系统上,可能希望预留核心而不是
整个节点。
此功能允许管理员识别每个节点上要预留的核心数量,如下面的示例所示。
注意:当系统配置为使用 select/linear 插件时,不提供核心预留。
# 为用户 alan 创建一个两核心的预留 $ scontrol create reservation StartTime=now Duration=60 \ NodeCnt=1 CoreCnt=2 User=alan # 为用户 brenda 创建一个预留,在 # 节点 tux8 上有两个核心,在节点 tux9 上有四个核心 $ scontrol create reservation StartTime=now Duration=60 \ Nodes=tux8,tux9 CoreCnt=2,4 User=brenda
预留不仅可以为特定账户和 用户创建,还可以防止特定账户和/或用户使用它们。 在以下示例中,为账户“foo”创建了一个预留,但用户 “alan”被禁止使用该预留,即使使用账户 “foo”。
$ scontrol create reservation account=foo \ user=-alan partition=pdebug \ starttime=noon duration=60 nodecnt=2k,2k 预留创建: alan_9 $ scontrol show res ReservationName=alan_9 StartTime=2011-12-05T13:00:00 EndTime=2011-12-05T14:00:00 Duration=60 Nodes=bgp[000x011,210x311] NodeCnt=4096 Features=(null) PartitionName=pdebug Flags= Licenses=(null) BurstBuffers=(null) Users=-alan Accounts=foo
在创建预留时,可以请求 Slurm 包括分区中的所有 节点,通过指定 PartitionName 选项。 如果只想要该分区中的某个数量的节点或 CPU, 可以将 PartitionName 与 CoreCnt、NodeCnt 或 TRES 选项结合使用,以指定所需资源的数量。 在以下示例中,在“gpu”分区中创建了一个预留, 使用 TRES 选项将预留限制为 24 个处理器, 分布在 4 个节点之间。
$ scontrol create reservationname=test start=now duration=1 \ user=user1 partition=gpu tres=cpu=24,node=4 预留创建: test $ scontrol show res ReservationName=test StartTime=2020-08-28T11:07:09 EndTime=2020-08-28T11:08:09 Duration=00:01:00 Nodes=node[01-04] NodeCnt=4 CoreCnt=24 Features=(null) PartitionName=gpu NodeName=node01 CoreIDs=0-5 NodeName=node02 CoreIDs=0-5 NodeName=node03 CoreIDs=0-5 NodeName=node04 CoreIDs=0-5 TRES=cpu=24 Users=user1 Accounts=(null) Licenses=(null) State=ACTIVE BurstBuffer=(null) MaxStartDelay=(null)
预留使用
预留创建响应包含预留的名称。 此名称由 Slurm 根据第一个 用户或账户名称和数字后缀自动生成。为了使用该 预留,作业提交请求必须明确指定该 预留名称。作业必须完全包含在 命名的预留中。预留达到其结束时间后,作业将被取消。如果让作业在 预留结束时间后继续执行,可以在 slurm.conf 中设置配置选项 ResvOverRun 以控制作业可以继续执行的时间。
$ sbatch --reservation=alan_6 -N4 my.script sbatch: 提交批处理作业 65540
请注意,使用预留不会改变作业的优先级,但它 确实作为作业优先级的增强。 任何有预留的作业在调度资源时都被优先考虑 在同一 Slurm 分区(队列)中未与预留关联的任何其他作业之前。
预留修改
预留可以由 root 用户根据需要进行修改。 例如,可以更改其持续时间或更改授予访问权限的用户,如下所示:
$ scontrol update ReservationName=root_3 \ duration=150 users=admin 预留已更新。 bash-3.00$ scontrol show ReservationName=root_3 ReservationName=root_3 StartTime=2009-02-06T16:00:00 EndTime=2009-02-06T18:30:00 Duration=150 Nodes=ALL NodeCnt=20 Features=(null) PartitionName=(null) Flags=MAINT,SPEC_NODES Licenses=(null) BurstBuffers=(null) Users=admin Accounts=(null)
预留删除
预留在结束时间后会自动清除。 它们也可以手动删除,如下所示。 请注意,当有作业在其中运行时,预留无法被删除。
$ scontrol delete ReservationName=alan_6
注意:默认情况下,当预留结束时,预留请求将从提交到预留的任何待处理作业中删除,并将处于保持状态。使用 NO_HOLD_JOBS_AFTER_END 预留标志允许作业在预留结束后在预留之外运行。
重叠预留
默认情况下,预留不得重叠。它们必须包含 不同的节点或在不同的时间操作。如果在创建预留时未指定特定节点,Slurm 将 自动选择节点以避免重叠,并确保 在预留开始时所选节点可用。
对重叠预留的支持非常有限, 有两种特定的操作模式可用。 为了方便系统维护,可以创建一个带有“maint”标志的预留,该预留重叠现有预留。 这允许管理员轻松创建整个集群的维护 预留,而无需删除 或重新调度先前存在的预留。请求访问这些先前存在的预留的用户将被禁止 使用也在此维护预留中的资源。 例如,用户 alan 和 brenda 可能每天从中午到下午 1 点预留一些节点。如果在 12:30 PM 开始有一个维护预留覆盖所有节点,则他们在预留中可以启动的唯一作业必须在 12:30 PM 完成,当维护预留开始时。
第二个例外的操作方式与维护 预留相同,只是它不会在会计系统中记录为维护预留的节点。 在创建第二个预留时需要使用“overlap”标志。 这可能用于确保在有预留的组中为特定用户提供资源的可用性。 使用之前的示例,alan 和 brenda 有一个 10 节点的预留 持续 60 分钟,我们可能希望在时间段的前 30 分钟为 brenda 预留 4 个节点。 在这种情况下,创建一个重叠预留(总共两个预留)可能比创建三个单独的预留更简单, 部分原因是使用任何预留都需要作业指定预留名称。
- 一个持续 60 分钟的六节点预留,供 alan 和 brenda 使用
- 一个持续 30 分钟的四节点预留,供 brenda 使用
- 一个持续最后 30 分钟的四节点预留,供 alan 和 brenda 使用
如果在创建预留时使用“maint”或“overlap”标志, 可以在一个预留中创建一个嵌套的预留。 请注意,带有“maint”或“overlap”标志的预留不会被后续的 也带有“maint”或“overlap”标志的预留移除资源,因此预留的嵌套仅适用于深度为二的情况。
预留在时间中漂浮
Slurm 可用于创建具有固定未来时间段的高级预留。 这些预留不打算运行作业,而是防止在特定节点上启动长时间运行的作业。 该节点可能被置于 DRAINING 状态,以防止 任何 新作业 在此处启动。 或者,可以在节点上放置高级预留,以防止 超过某个特定时间限制的作业启动。 用户尝试使用具有漂浮开始时间的预留将被拒绝。 准备进行维护时,将节点置于 DRAINING 状态并删除先前创建的高级预留。
通过使用 TIME_FLOAT 标志值和相对于当前时间的开始时间(使用关键字 now)创建预留。 预留持续时间通常应是相对于典型作业运行时间的较大值,以避免对回填调度 决策产生不利影响。 或者,预留可以具有特定的结束时间,在这种情况下,预留的开始时间将随着时间的推移而增加,直到达到预留的 结束时间。 当当前时间超过预留结束时间时,预留将被清除。 在下面的示例中,节点 tux8 被防止启动任何超过 60 分钟时间限制的作业。 该预留的持续时间为 100(分钟)。
$ scontrol create reservation user=operator nodes=tux8 \ starttime=now+60minutes duration=100 flags=time_float
替换分配资源的预留
默认情况下,预留中的 DOWN 或 DRAINED 节点将被替换, 但分配给作业的节点不会。这种行为可以通过 REPLACE_DOWN 标志明确请求。
但是,您可以指示 Slurm 还替换分配给 作业的节点,使用新的空闲节点。这是通过在 下面的示例中使用 REPLACE 标志完成的。 其效果是始终保持一个恒定大小的资源池。 此选项不支持跨多个节点的核心预留,而是完整节点。(例如,在节点“tux1”上的 1 核心预留将在节点“tux1”宕机时移动,但包含在“tux1”上 2 个核心和“tux2”上 3 个核心的预留将不会在“tux1”宕机时移动。)
$ scontrol create reservation starttime=now duration=60 \ users=foo nodecnt=2 flags=replace 预留创建: foo_82 $ scontrol show res ReservationName=foo_82 StartTime=2014-11-20T16:21:11 EndTime=2014-11-20T17:21:11 Duration=01:00:00 Nodes=tux[0-1] NodeCnt=2 CoreCnt=12 Features=(null) PartitionName=debug Flags=REPLACE Users=jette Accounts=(null) Licenses=(null) State=ACTIVE $ sbatch -n4 --reservation=foo_82 tmp 提交批处理作业 97 $ scontrol show res ReservationName=foo_82 StartTime=2014-11-20T16:21:11 EndTime=2014-11-20T17:21:11 Duration=01:00:00 Nodes=tux[1-2] NodeCnt=2 CoreCnt=12 Features=(null) PartitionName=debug Flags=REPLACE Users=jette Accounts=(null) Licenses=(null) State=ACTIVE $ sbatch -n4 --reservation=foo_82 tmp 提交批处理作业 98 $ scontrol show res ReservationName=foo_82 StartTime=2014-11-20T16:21:11 EndTime=2014-11-20T17:21:11 Duration=01:00:00 Nodes=tux[2-3] NodeCnt=2 CoreCnt=12 Features=(null) PartitionName=debug Flags=REPLACE Users=jette Accounts=(null) Licenses=(null) State=ACTIVE $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 97 debug tmp foo R 0:09 1 tux0 98 debug tmp foo R 0:07 1 tux1
FLEX 预留
默认情况下,在预留中运行的作业必须符合预留资源的时间和 大小限制。使用 FLEX 标志,作业可以在预留开始之前启动或在结束之后继续。 如果需要且可用,它们还可以使用预留的节点以及其他节点。
请求预留的作业的默认行为是,它们必须能够在该预留的限制(时间和空间)内运行。 以下示例显示了 FLEX 标志允许作业在预留开始之前、结束之后以及在预留之外的节点上运行。
$ scontrol create reservation user=user1 nodes=node01 starttime=now+10minutes duration=10 flags=flex 预留创建: user1_831 $ sbatch -wnode0[1-2] -t30:00 --reservation=user1_831 test.job 提交批处理作业 57996 $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 57996 debug sleepjob user1 R 0:08 2 node[01-02]
磁性预留
预留的默认行为是作业必须请求一个 预留才能在其中运行。MAGNETIC 标志允许您 创建一个预留,允许作业在其中运行,而不要求它们指定预留的名称。该预留只会“吸引” 满足访问控制要求的作业。
注意:磁性预留不能“吸引”异构作业 - 异构作业仅在明确请求预留时才能在磁性预留中运行。
以下示例显示在 node05 上创建的预留。指定可以访问该预留的用户随后提交作业,作业在预留的节点上启动。
$ scontrol create reservation user=user1 nodes=node05 starttime=now duration=10 flags=magnetic 预留创建: user1_850 $ scontrol show res ReservationName=user1_850 StartTime=2020-07-29T13:44:13 EndTime=2020-07-29T13:54:13 Duration=00:10:00 Nodes=node05 NodeCnt=1 CoreCnt=12 Features=(null) PartitionName=(null) Flags=SPEC_NODES,MAGNETIC TRES=cpu=12 Users=user1 Accounts=(null) Licenses=(null) State=ACTIVE BurstBuffer=(null) MaxStartDelay=(null) $ sbatch -N1 -t5:00 test.job 提交批处理作业 62297 $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 62297 debug sleepjob user1 R 0:04 1 node05
最后一个作业完成后清除预留
预留在最后一个关联作业完成后可以自动清除。这是通过使用“purge_comp”标志来实现的。 一旦创建了预留,必须在其开始时间的 5 分钟内填充它,否则将在任何作业运行之前被清除。
预留会计
在预留中执行的作业使用适当的 用户和银行账户进行会计。如果在预留中的资源未被使用,则这些 资源将被视为由所有与该预留相关联的用户或银行账户平等使用(例如,如果两个用户有资格使用一个预留而都没有使用,则每个用户将被报告使用了一半的预留资源)。
前置和后置脚本
Slurm 支持预留的前置和后置脚本。 它们可以使用 slurm.conf 文件中的 ResvProlog 和 ResvEpilog 配置参数进行配置。 这些脚本可用于取消作业、修改分区配置等。
未来工作
在具有团体调度的分区内进行的预留假设 最高级别而不是实际的时间切片级别, 在考虑作业启动时。 这将防止某些作业的启动,这些作业将在预留给出的更少作业的情况下完成执行。
最后修改于 2024 年 8 月 2 日