共享可消耗资源

CPU 管理

(免责声明:在本“CPU 管理”部分,术语“可消耗资源”不包括内存。内存作为可消耗资源的管理将在下面的单独部分中讨论。)

每个分区的 OverSubscribe 设置适用于 被选择用于调度的实体

  • 当启用 select/linear 插件时,每个分区的 OverSubscribe 设置控制节点是否在作业之间共享。

  • 当启用默认的 select/cons_tres 插件时,每个分区的 OverSubscribe 设置控制配置的可消耗资源是否在作业之间共享。 当可消耗资源(例如核心、插槽或 CPU)被共享时,意味着可以将多个作业分配给它。

下表详细描述了此新功能:

选择设置 每个分区 OverSubscribe 设置 结果行为
SelectType=select/linear OverSubscribe=NO 整个节点分配给作业。每个分区/队列中不会运行超过一个作业。
OverSubscribe=YES 默认情况下与 OverSubscribe=NO 相同。分配给作业的节点可以与其他作业共享,如果每个作业允许通过 srun --oversubscribe 选项进行共享。
OverSubscribe=FORCE 每个完整节点可以分配给多个作业,最多到每个分区/队列指定的数量(默认每个节点 4 个作业)
SelectType=select/cons_tres
加上以下之一:
SelectTypeParameters=CR_Core
SelectTypeParameters=CR_Core_Memory
OverSubscribe=NO 核心分配给作业。每个分区/队列中不会运行超过一个作业。
OverSubscribe=YES 默认情况下与 OverSubscribe=NO 相同。分配给作业的核心可以与其他作业共享,如果每个作业允许通过 srun --oversubscribe 选项进行共享。
OverSubscribe=FORCE 每个核心可以分配给多个作业,最多到每个分区/队列指定的数量(默认每个核心 4 个作业)。
SelectType=select/cons_tres
加上以下之一:
SelectTypeParameters=CR_CPU
SelectTypeParameters=CR_CPU_Memory
OverSubscribe=NO CPU 分配给作业。每个分区/队列中不会运行超过一个作业。
OverSubscribe=YES 默认情况下与 OverSubscribe=NO 相同。分配给作业的 CPU 可以与其他作业共享,如果每个作业允许通过 srun --oversubscribe 选项进行共享。
OverSubscribe=FORCE 每个 CPU 可以分配给多个作业,最多到每个分区/队列指定的数量(默认每个 CPU 4 个作业)。
SelectType=select/cons_tres
加上以下之一:
SelectTypeParameters=CR_Socket
SelectTypeParameters=CR_Socket_Memory
OverSubscribe=NO 插槽分配给作业。每个分区/队列中不会运行超过一个作业。
OverSubscribe=YES 默认情况下与 OverSubscribe=NO 相同。分配给作业的插槽可以与其他作业共享,如果每个作业允许通过 srun --oversubscribe 选项进行共享。
OverSubscribe=FORCE 每个插槽可以分配给多个作业,最多到每个分区/队列指定的数量(默认每个插槽 4 个作业)。

当配置 OverSubscribe=FORCE 时,可消耗资源将使用 最少负载 算法进行调度。因此,空闲的 CPU|核心|插槽将在忙碌的 CPU|核心|插槽之前分配给作业,并且运行一个作业的 CPU|核心|插槽将在运行两个或更多作业的插槽之前分配给作业。这与 select/linear 插件在分配“共享”节点时使用的方法相同。

请注意,“最少负载”算法的 粒度 是区分可消耗资源和线性插件的关键,当配置 OverSubscribe=FORCE 时。启用 select/cons_tres 插件时,节点的 CPU 只有在其他节点的 所有 其余 CPU 都被超额分配时才会被超额分配。因此,如果一个作业分配了节点上半数的 CPU,然后提交了一个需要超过一半 CPU 的第二个作业,则可消耗资源插件将尝试将这个新作业放置在其他忙碌的节点上,这些节点有超过一半的 CPU 可供使用。select/linear 插件只是计算节点上的作业,而不跟踪每个节点的 CPU 使用情况。

select/cons_tres 插件中的共享功能还支持新的 OverSubscribe=FORCE:<num> 语法。如果配置了 OverSubscribe=FORCE:3,并且使用可消耗资源插件和 CR_Core 或 CR_Core_Memory,则插件将在每个分区的每个 核心 上运行最多 3 个作业。如果配置了 CR_Socket 或 CR_Socket_Memory,则插件将在每个分区的每个 插槽 上运行最多 3 个作业。

多个分区中的节点

自版本 0.7.0 起,Slurm 支持在多个分区中配置节点。下表描述了在两个分区中配置的节点如何根据不同的 OverSubscribe 设置分配给作业。请注意,“共享”作业是提交到配置为 OverSubscribe=FORCEOverSubscribe=YES 的分区,并且作业请求通过 srun --oversubscribe 选项进行共享的作业。相反,“非共享”作业是提交到配置为 OverSubscribe=NO 或 OverSubscribe=YES 的分区,并且作业没有请求可共享资源。

 第一个作业“可共享”第一个作业“不可共享”
第二个作业“可共享”两个作业可以在同一节点上运行,并且可以共享资源作业不会在同一节点上运行
第二个作业“不可共享”作业不会在同一节点上运行 作业可以在同一节点上运行,但不会共享资源

下一个表包含启用 select/cons_tres 插件的几个场景,以进一步阐明当节点配置在多个分区中且分区具有不同的“OverSubscribe”策略时,节点的使用情况。

Slurm 配置 结果行为
两个 OverSubscribe=NO 分区分配相同的节点集 来自任一分区的作业将被分配给所有可用的可消耗资源。没有可消耗资源将被共享。一个节点上可以有 2 个作业在运行,每个作业可以来自不同的分区。
两个分区分配相同的节点集:一个分区是 OverSubscribe=FORCE,另一个是 OverSubscribe=NO 一个节点一次只能运行来自一个分区的作业。如果一个节点正在运行来自 OverSubscribe=NO 分区的作业,则其可消耗资源将不会被共享。如果一个节点正在运行来自 OverSubscribe=FORCE 分区的作业,则其可消耗资源可以被共享。
两个 OverSubscribe=FORCE 分区分配相同的节点集 来自任一分区的作业将被分配可消耗资源。所有可消耗资源可以共享。一个节点上可以有 2 个作业在运行,每个作业可以来自不同的分区。
两个分区分配相同的节点集:一个分区是 OverSubscribe=FORCE:3,另一个是 OverSubscribe=FORCE:5 通常与上述行为相同。然而,没有可消耗资源将运行超过来自第一个分区的 3 个作业,且没有可消耗资源将运行超过来自第二个分区的 5 个作业。一个可消耗资源最多可以同时运行 8 个作业。

请注意,“混合共享设置”配置(上表第 2 行)引入了各分区作业之间的 饥饿 可能性。如果一组节点正在运行来自 OverSubscribe=NO 分区的作业,则这些节点将继续仅对来自该分区的作业可用,即使提交到 OverSubscribe=FORCE 分区的作业具有更高的优先级。这种情况也反向适用,实际上,来自 OverSubscribe=FORCE 分区的作业更容易长时间占用节点,因为可消耗资源的“共享”提供了更多的资源可用性,以便新作业可以在现有作业“之上”开始运行。这种情况在 select/linear 插件中也会发生,因此这并不特定于 select/cons_tres 插件。

内存管理

内存作为可消耗资源的管理保持不变,可以用来防止内存的超额分配,这将导致内存页面被交换并严重降低性能。

选择设置 结果行为
SelectType=select/linear 内存分配不被跟踪。作业被分配到节点时不考虑是否有足够的空闲内存。可能会发生交换!
SelectType=select/linear 加上
SelectTypeParameters=CR_Memory
内存分配被跟踪。没有足够可用内存以满足作业内存要求的节点将不会被分配给作业。
SelectType=select/cons_tres
加上以下之一:
SelectTypeParameters=CR_Core
SelectTypeParameters=CR_CPU
SelectTypeParameters=CR_Socket
内存分配不被跟踪。作业被分配到可消耗资源时不考虑是否有足够的空闲内存。可能会发生交换!
SelectType=select/cons_tres
加上以下之一:
SelectTypeParameters=CR_Memory
SelectTypeParameters=CR_Core_Memory
SelectTypeParameters=CR_CPU_Memory
SelectTypeParameters=CR_Socket_Memory
所有作业的内存分配被跟踪。没有足够可用内存以满足作业内存要求的节点将不会被分配给作业。

用户可以通过两种方式指定作业的内存要求。srun --mem=<num> 选项可用于指定每个分配节点的作业内存要求。建议在使用 select/linear 插件时使用该选项,该插件将整个节点分配给作业。srun --mem-per-cpu=<num> 选项可用于指定每个分配 CPU 的作业内存要求。建议在使用 select/cons_tres 插件时使用该选项,该插件可以将单个 CPU 分配给作业。

每个节点或每个 CPU 的内存的默认值和最大值可以由系统管理员使用以下 slurm.conf 选项进行配置: DefMemPerCPUDefMemPerNodeMaxMemPerCPUMaxMemPerNode。用户可以在作业提交时使用 --mem--mem-per-cpu 选项来覆盖默认值,但不能超过最大值。

通过在启动任务之前将“最大数据段大小”和“最大虚拟内存大小”系统限制设置为适当的值来执行作业内存分配的强制执行。强制执行还由会计插件管理,该插件定期收集有关正在运行的作业的数据。将 JobAcctGatherJobAcctFrequency 设置为适合您系统的值。

注意:在作业提交时使用 --oversubscribe--exclusive 选项是互斥的。如果在提交作业时同时设置这两个选项,则使用的作业提交命令将失败。

最后修改于 2023 年 5 月 30 日