服务质量 (QOS)

可以为提交到 Slurm 的每个作业指定服务质量 (QOS)。QOS 在 Slurm 数据库中使用 sacctmgr 命令定义。作业通过在 sbatchsallocsrun 命令中使用 "--qos=" 选项来请求 QOS。

内容

对作业的影响

与作业相关的 QOS 将在三个关键方面影响作业:调度优先级、抢占和资源限制。

作业调度优先级

作业调度优先级由多个因素组成,如 priority/multifactor 插件所述。其中一个因素是 QOS 优先级。每个 QOS 在 Slurm 数据库中定义,并包括一个相关的优先级。请求并被允许使用 QOS 的作业将在作业的 多因素优先级计算中纳入与该 QOS 相关的优先级。

要启用多因素优先级计算中的 QOS 优先级组件,必须在 slurm.conf 文件中定义 "PriorityWeightQOS" 配置参数,并分配一个大于零的整数值。

作业的 QOS 仅在加载多因素插件时影响其调度优先级。

作业抢占

Slurm 提供两种方式让排队作业抢占正在运行的作业,释放正在运行作业的资源并将其分配给排队作业。有关详细信息,请参见 抢占描述

抢占方法由 slurm.conf 中定义的 "PreemptType" 配置参数决定。当 "PreemptType" 设置为 "preempt/qos" 时,排队作业的 QOS 将用于确定其是否可以抢占正在运行的作业。需要注意的是,用于确定作业是否有资格进行抢占的 QOS 是与作业相关的 QOS,而不是 分区 QOS

QOS 可以被分配(使用 sacctmgr)一个可以抢占的其他 QOS 列表。当有一个排队作业的 QOS 被允许抢占另一个 QOS 的正在运行作业时,Slurm 调度器将抢占正在运行的作业。

QOS 选项 PreemptExemptTime 指定在考虑抢占之前的最小运行时间。QOS 选项优先于同名的全局选项。具有 PreemptExemptTime 的分区 QOS 优先于具有 PreemptExemptTime 的作业 QOS,除非作业 QOS 启用了 OverPartQOS 标志。

资源限制

每个 QOS 被分配一组限制,这些限制将应用于作业。这些限制反映了在 Slurm 数据库中定义的用户/账户/集群/分区关联施加的限制,并在 资源限制页面中描述。当为 QOS 定义了限制时,它们将优先于关联的限制。

分区 QOS

可以将 QOS 附加到分区。这意味着该分区将具有与 QOS 相同的所有限制。这并不将作业与 QOS 关联,也不会赋予作业任何分配的 QOS 的优先级或抢占特性。作业可以单独请求相同的 QOS 或不同的 QOS 以获得这些特性。然而,分区 QOS 限制将覆盖作业的 QOS。如果希望相反,可以使用 Flags=OverPartQOS 配置作业的 QOS,从而反转优先级顺序。

此功能可用于实现真正的“浮动”分区,其中分区可以访问有限数量的资源,而不限制使用哪些节点来获取资源。这是通过将所有节点分配给分区,然后配置一个将 GrpTRES 设置为所需资源限制的分区 QOS 来实现的。

注意:大多数 QOS 属性是使用 sacctmgr 命令设置的。然而,将 QOS 设置为分区 QOS 是通过在相关分区的 slurm.conf 中的 QOS= 选项来完成的。QOS 应在分配为分区 QOS 之前使用 sacctmgr 创建。可以在不删除 slurm.conf 中的附件的情况下删除附加到分区的 QOS。这不推荐,并可能导致意外行为。

相对 QOS

从 Slurm 23.11 开始,可以配置 QOS 包含相对资源限制,而不是绝对限制,通过设置 Flags=Relative。当设置此标志时,所有资源限制将被视为可用资源总量的百分比。高于 100 的值将被解释为 100%。内存限制应设置为没有单位。尽管默认单位(MB)将被显示,但限制将作为百分比强制执行(1MB = 1%)。

注意:当 Flags=Relative 被添加到 QOS 时,必须重新启动或重新配置 slurmctld 以使标志生效。

通常,相对 QOS 的限制将相对于整个集群中的资源进行计算。例如,cpu=50 将被解释为集群中所有 CPU 的 50%。

然而,当相对 QOS 也被分配为分区 QOS 时,将适用一些独特条件:

  1. 限制将相对于分区的资源进行计算;例如,cpu=50 将被解释为与该分区相关的所有 CPU 的 50%。
  2. 只能有一个分区将此 QOS 作为其分区 QOS。
  3. 作业将不被允许将其用作普通 QOS。
    注意:为了避免意外的作业提交错误,建议不要将相对分区 QOS 添加到任何基于关联的实体。

其他 QOS 选项

  • Flags 由 slurmctld 使用,以覆盖或强制某些特性。要清除先前设置的值,请使用修改命令并将新值设置为 -1。
    有效选项包括:
    • DenyOnLimit 如果设置,使用此 QOS 的作业在提交时将被拒绝,如果它们不符合 QOS 的 'Max' 限制作为独立作业。 当其他作业被考虑时,超过这些限制的作业,但在单独考虑时符合限制的作业将不会被拒绝。相反,它们将挂起,直到资源可用(默认情况下没有 DenyOnLimit)。 组限制(例如 GrpTRES)也将被视为 'Max' 限制(例如 MaxTRESPerNode),如果作业违反了作为独立作业的限制,则将被拒绝。 这目前仅适用于 QOS 和关联限制。
    • EnforceUsageThreshold 如果设置,并且 QOS 也具有 UsageThreshold,任何提交此 QOS 的作业如果低于 UsageThreshold 将被保留,直到其公平份额使用量超过阈值。
    • NoDecay 如果设置,此 QOS 将不会被 slurm.conf 的 PriorityDecayHalfLife 或 PriorityUsageResetPeriod 设置衰减其 GrpTRESMins、GrpWall 和 UsageRaw。这允许 QOS 提供聚合限制,一旦消耗,将不会自动补充。这样的 QOS 将作为对有权访问它的关联的时间限制资源配额。账户/用户的使用仍将对使用 QOS 的关联进行衰减。可以增加 QOS 的 GrpTRESMins 和 GrpWall 限制,或将 QOS 的 RawUsage 值重置为 0(零),以再次允许提交此 QOS 的作业运行(如果因 QOSGrp{TRES}MinutesLimit 或 QOSGrpWallLimit 原因而挂起,其中 {TRES} 是某种可跟踪资源)。
    • NoReserve 如果设置此标志并使用回填调度,使用此 QOS 的作业将不会在回填调度的资源分配图中保留资源。此标志旨在与可能被所有其他 QOS 关联的作业抢占的 QOS 一起使用(例如与“待命” QOS 一起使用)。如果此标志与不能被所有其他 QOS 抢占的 QOS 一起使用,可能会导致较大作业的饥饿。
    • OverPartQOS 如果设置,使用此 QOS 的作业将能够覆盖请求分区的 QOS 限制。
    • PartitionMaxNodes 如果设置,使用此 QOS 的作业将能够覆盖请求分区的 MaxNodes 限制。
    • PartitionMinNodes 如果设置,使用此 QOS 的作业将能够覆盖请求分区的 MinNodes 限制。
    • PartitionTimeLimit 如果设置,使用此 QOS 的作业将能够覆盖请求分区的 TimeLimit。
    • Relative 如果设置,QOS 限制将被视为集群或分区的百分比,而不是绝对限制(数字应小于 100)。在将 Relative 标志添加到 QOS 后,控制器应重新启动或重新配置。
      如果这用作分区 QOS:
      1. 限制将相对于分区的资源进行计算。
      2. 只能有一个分区将此 QOS 作为其分区 QOS。
      3. 作业将不被允许将其用作普通 QOS。
    • RequiresReservation 如果设置,使用此 QOS 的作业在提交作业时必须指定一个保留。此选项在限制使用可能具有更大抢占能力或额外资源的 QOS 仅在保留内使用时非常有用。
    • UsageFactorSafe 如果设置,并且 AccountingStorageEnforce 包含 Safe,作业将只能在作业能够在应用 UsageFactor 的情况下完成时运行。
  • GraceTime 抢占宽限时间将延长至被选中进行抢占的作业。
  • UsageFactor 一个浮点数,作为作业的 TRES 使用量(例如 RawUsage、TRESMins、TRESRunMins)的一部分。例如,如果使用因子为 2,则作业运行每个 TRESBillingUnit 秒将计为 2。如果使用因子为 0.5,则每秒仅计为一半的时间。设置为 0 将不会增加作业的时间使用量。

  • 使用因子仅适用于作业的 QOS,而不适用于分区 QOS。

    如果 UsageFactorSafe 标志 设置,并且 AccountingStorageEnforce 包含 Safe,作业将只能在作业能够在应用 UsageFactor 的情况下完成时运行。

    如果 UsageFactorSafe 标志 设置,并且 AccountingStorageEnforce 包含 Safe,作业将能够在不应用 UsageFactor 的情况下被调度,并且能够在不被由于限制而终止的情况下运行。

    如果 UsageFactorSafe 标志 设置,并且 AccountingStorageEnforce 不包含 Safe,作业将能够在不应用 UsageFactor 的情况下被调度,并且可能由于限制而被终止。

    请参见 slurm.conf 手册页中的 AccountingStorageEnforce

    默认值为 1。要清除先前设置的值,请使用修改命令并将新值设置为 -1。

  • UsageThreshold 一个浮点数,表示允许运行作业的最低公平份额。如果一个关联低于此阈值并且有待处理的作业或提交新作业,这些作业将被保留,直到使用量回升到阈值以上。使用 sshare 查看系统上的当前份额。

配置

总结上述内容,QOS 及其相关限制是在 Slurm 数据库中使用 sacctmgr 工具定义的。QOS 仅在加载多因素优先级插件并在 slurm.conf 文件中定义了非零的 "PriorityWeightQOS" 时影响作业调度优先级。QOS 仅在 slurm.conf 文件中将 "PreemptType" 定义为 "preempt/qos" 时决定作业抢占。为 QOS 定义的限制(如上所述)将覆盖用户/账户/集群/分区关联的限制。

QOS 示例

QOS 操作示例。所有 QOS 操作均使用 sacctmgr 命令完成。由于可用的限制和选项数量庞大,'sacctmgr show qos' 的默认输出非常长,因此最好使用格式选项来过滤显示。

默认情况下,当集群添加到数据库时,会创建一个名为 normal 的默认 qos。

$ sacctmgr show qos format=name,priority
      Name   Priority
---------- ----------
    normal          0

添加一个新的 QOS

$ sacctmgr add qos zebra
 添加 QOS(s)
  zebra
 设置
  描述    = QOS 名称

$ sacctmgr show qos format=name,priority
      Name   Priority
---------- ----------
    normal          0
     zebra          0

设置 QOS 优先级

$ sacctmgr modify qos zebra set priority=10
 修改的 qos...
  zebra

$ sacctmgr show qos format=name,priority
      Name   Priority
---------- ----------
    normal          0
     zebra         10

设置其他一些限制

$ sacctmgr modify qos zebra set GrpTRES=cpu=24
 修改的 qos...
  zebra

$ sacctmgr show qos format=name,priority,GrpTRES
      Name   Priority       GrpTRES
---------- ---------- -------------
    normal          0
     zebra         10        cpu=24

将 QOS 添加到用户账户

$ sacctmgr modify user crock set qos=zebra

$ sacctmgr show assoc format=cluster,user,qos
   Cluster       User                  QOS
---------- ---------- --------------------
canis_major                          normal
canis_major      root                normal
canis_major                          normal
canis_major     crock                zebra

用户可以属于多个 QOS

$ sacctmgr modify user crock set qos+=alligator
$ sacctmgr show assoc format=cluster,user,qos
   Cluster       User                  QOS
---------- ---------- --------------------
canis_major                          normal
canis_major      root                normal
canis_major                          normal
canis_major     crock       alligator,zebra

最后,删除一个 QOS

$ sacctmgr delete qos alligator
 删除 QOS(s)...
  alligator

最后修改于 2025 年 3 月 17 日