Slurm工作负载优先级(一)
默认情况下,slurm采用先进先出(FIFO)为基础分配作业优先级。关于优先级调度的配置文件放在slurm.conf,可以使用PriorityType来配置优先级。slurm通过使用插件机制,来实现不同工作负载的使用。
# slurm.conf 默认配置,表示先进先出
PriorityType=priority/basic
slurm中常用的工作负载优先级有四种,分别是多因素作业优先级、经典公平分享优先级、深度遗忘公平份额因子、公平树公平分享算法。
多因素作业优先级
首先什么是多因素?主要包含九个影响因子,有作业时长、关联因素、已经分配和已经消耗资源差异、作业大小、用户自定义因素、分区、TRES类型、服务质量。当有多个作业到来的时候,影响调度决策的有六个方面:
1、可以抢占的作业
2、提前预定的作业
3、分区的优先级
4、作业的优先级
5、作业提交时间
6、作业编号
作业优先级 有一个记录公式,通常是每一个影响因素一个权重,计算加权因素和,作业优先级表示为
Job_priority =
site_factor +
(PriorityWeightAge) * (age_factor) +
(PriorityWeightAssoc) * (assoc_factor) +
(PriorityWeightFairshare) * (fair-share_factor) +
(PriorityWeightJobSize) * (job_size_factor) +
(PriorityWeightPartition) * (partition_factor) +
(PriorityWeightQOS) * (QOS_factor) +
SUM(TRES_weight_cpu * TRES_factor_cpu,
TRES_weight_<type> * TRES_factor_<type>,
...)
- nice_factor
其中,影响因子都是浮点数,范围是0.0 ~ 1.0
。权重是32位的无符号整数。其中,Job_priority数值越大,表示的作业优先级越大,越早被安排。
等待时间因子(age_factor):等待时间越长,因子越大,但是当等待时长超过当前集群设置的最大工作时长时,就会将改作业kill掉。slurm.conf中的PriorityMaxAge字段,表示作业可以配置的长度。
关联因素(assoc_factor):为每个关联分配一个整数优先级。
作业大小因子(job_size_factor):作业大小因子跟作业申请的节点数、CPU核数、内存大小有关。可以根据 slurm.conf 文件中的 PriorityFavorSmall 布尔值的状态将此因子配置为支持较大或较小的作业。当 PriorityFavorSmall 为 NO 时,作业越大,其作业大小因子就越大。请求计算机上所有节点的作业将获得作业大小因子1.0。当 PriorityFavorSmall 布尔值为 YES 时,单个节点作业将接收1.0作业大小因子。简言之PriorityFavorSmall,主要表示小作业优先。
用户自定义优先级:可以通过特权用户设置自己的优先级来控制优先级大小。
分区优先级因子(partition_factor):通过对节点分区设置一个整数优先级,表示该作业的优先级,优先级越高,请求就更容易在此分区中进行。
服务质量因子(QOS_factor):为每个服务质量QOS分配一个优先级,来确保对应的资源限制,最大作业等等。
站点因子:通过scontrol设置站点优先级,可以通过site_factor插件来根据请求的资源设置优先级。
TRES因子(TRES_factor_):每种 TRES 类型都有自己的作业优先级因子,它表示给定分区中请求/分配的 TRES 类型的数量。对作业请求/分配给定 TRES 类型的次数越多,该作业的作业优先级就越高。
公平分配因子(fair-share_factor):作业优先级的公平共享组件影响用户的排队作业根据其已分配的计算资源和其作业已消耗的资源的比例计划运行的顺序。公平份额因素用于确定排队作业的优先级,以便首先安排那些服务不足的收费帐户的作业,而对长时运行作业帐户收费的作业则安排在计算机空闲时。
slurm提供一个优先级权重管理程序,称之为*sprio*
,同时也是一个命令行工具。
通过结果可以看出,目前系统中只支持多因素调度,也就是PriorityType=priority/multifactor
。主要参数如下表:
参数名称 | 参数含义 |
---|---|
PriorityType | 优先级类型,包括多因素,基础类型(FIFO) |
PriorityCalcPeriod | 以分钟为单位的时间段重新计算优先级 |
PriorityUsageResetPeriod | 时间间隔内,优先级重置为0 |
PriorityFavorSmall | 小作业优先 |
PriorityMaxAge | 作业到达队列的最大等待时间 |
PriorityWeightAge | 作业等待时间权重 |
PriorityWeightAssoc | 关联因素权值 |
PriorityWeightFairshare | 共享因子权重 |
PriorityWeightJobSize | 作业大小权重 |
PriorityWeightPartition | 分区优先级权重 |
PriorityWeightPartition | QOS服务质量权重 |
PriorityWeightTRES | TRES优先级权重 |
经典公平分享优先级
公平分享算法,在slurm.conf配置PriorityFlags=NO_FAIR_TREE使用。简单的理解,表示将计算资源的一部分分配给不同的项目。通过资源分配给账户,账户又有子账户的限制,实现了资源的进一步细分。
从官网了解到,用户的规范化共享如下:
S = (Suser / Ssiblings) *
(Saccount / Ssibling-accounts) *
(Sparent / Sparent-siblings) * ...
S -是用户的规范化份额,介于 0 和 1 之间
Suser -是分配给用户的帐户份额数
Ssiblings -是分配给允许向帐户收费的所有用户的份额总数(包括 S用户)
Saccount -是分配给该账户的母账户的份额数量
Ssibling-accounts -是分配给母账户所有子账户的份额总数
Sparent -是分配给父母的祖父母账户的份额数量
Sparent-siblings -是分配给祖父母账户所有子账户的份额总数
规范化用法
1、分配给每个作业的处理器*秒数被实时跟踪。如果只考虑固定时间段内的使用情况,则计算用户的规范化使用情况将是一个简单的商数:
UN = Uuser / Utotal 。其中Uuser是给定帐户中所有用户作业在固定时间段内消耗的处理器*秒数
Utotal是同一时间段内整个集群使用的处理器*秒总数。
2、Slurm使用情况指标
Slurm 使用情况指标基于半衰期公式,该公式有利于最新的使用情况统计信息。过去基于单个衰减因子 D 的使用情况统计信息的重要性降低:
UH = Ucurrent_period + (D * Ulast_period) + (D * D * Uperiod_2) + …
名称解释:
UH 历史用法是否受半衰期衰减的影响
Ucurrent_period 是当前测量期间收取的使用量
Ulast_period 是上一个测量周期内收取的使用量
Uperiod-2 是倒数第二个测量周期内收取的使用量
D 是介于 0 和 1 之间的衰减因子,可提供 基于优先级衰减半衰期设置的半衰期衰减,在 slurm.conf 文件中。在不累积额外使用量的情况下,用户的 UH一段时间后,使用量将衰减到其原始值的一半的优先级衰变半衰期秒数。
简化的公平分享公式
F = 2(-U/S/d)
其中F 是公平份额因素;S 是规范化的份额;U 是半衰期衰减的归一化用法因素;d 是公平共享阻尼因子(配置参数,默认值为 1)。
可以这样理解,公平份额因素的范围从零到一,其中一代表工作的最高优先级。公平份额因子 0.5 表示用户的作业使用了已分配的计算机部分。公平份额因子高于 0.5 表示用户的作业消耗的份额少于其分配的份额,而低于 0.5 的公平份额因子表示用户的作业消耗的计算资源超过其分配的份额。
账户层次下的公平分享机制
上面介绍了一种方法,系统根据分配给该用户的计算机部分以及该用户在特定帐户下运行的所有作业的历史使用情况来计算用户作业的优先级。这里考虑另一方面,就是允许作业的公平共享因子受到交付给从同一帐户提取的其他用户的作业的计算资源的影响。
一个理解是如果给定帐户有两个成员,并且其中一个用户在该帐户下运行了许多作业,则未运行任何作业的用户提交的作业的作业优先级将受到负面影响。
在下面的示例中,当用户 3 使用账户 C 提交其第一个作业时,他们将希望其作业的优先级反映交付给账户 B 的所有资源。他们不在乎用户 1 已经用完了分配给账户 B 的很大一部分周期,而用户 2 尚未在账户 B 之外运行作业。如果用户 2 使用账户 B 提交作业,用户 3 使用账户 C 提交作业,则用户 3 希望他们的作业在用户 2 的作业之前安排。
因此,slurm提供了一个基于账户的公平共享公式
F = 2**(-UE/S) ,其中UE = UAchild + ((UEparent - UAchild) * Schild/Sall_siblings)
UE:是子用户或儿童帐户的有效使用
UAchild:是子用户或子帐户的实际使用情况
UEparent:是母帐户的有效使用
Schild:是分配给子用户或子帐户的份额
Sall_siblings:是分配给父帐户的所有子帐户的份额
此公式仅适用于 root 以下的第二层帐户,到子帐户,然后是孙子帐户,依此类推。
UAchild:是子用户或子帐户的实际使用情况
UEparent:是母帐户的有效使用
Schild:是分配给子用户或子帐户的份额
Sall_siblings:是分配给父帐户的所有子帐户的份额
此公式仅适用于 root 以下的第二层帐户,到子帐户,然后是孙子帐户,依此类推。