基于队列的公平共享

在队列配置中设置优先级时,高优先级队列会尝试分派尽可能多的作业,然后再允许低优先级队列分派任何作业。 将阻塞优先级较低的队列,直到优先级较高的队列无法再分派任何作业为止。 但是,可能需要优先考虑降低优先级队列,并规范来自队列的作业流。

基于队列的公平共享通过在队列上实施软作业槽限制,允许对每个队列进行灵活的槽分配,作为绝对队列优先级的替代方法。 这允许您组织工作的优先级并调整从队列中分派的作业数,以便没有任何单个队列垄断集群资源,从而使其他队列等待分派作业。

您可以通过配置等待从每个队列分派的作业的比率来平衡队列之间作业槽的分布。 然后, LSF 会尝试从每个队列分派特定百分比的作业,并且不会尝试首先完全排出最高优先级的队列。

当队列竞争时,每个队列的已分配插槽将保留在已配置的共享的限制内。 如果池中只有一个队列具有作业,那么该队列可以使用所有可用资源,并且可以跨其可能在其上运行作业的所有主机使用该队列。

管理队列池

您可以将队列配置到池中,该池是使用同一主机集的一组指定队列。 池有权使用可用作业槽的片。 您可以根据需要配置任意数量的池,但每个池必须使用同一组主机。 集群中可能存在不属于任何池但共享池所使用的某些主机的队列。

LSF 如何为队列池分配插槽

在作业调度期间, LSF 根据队列有权使用的共享对每个池中的队列进行排序。 正在运行的作业 (或正在使用的作业槽) 的数目保持在为队列指定的百分比级别。 当队列没有暂挂作业时,剩余的槽将重新分发到池中作业处于暂挂状态的其他队列。

每个池中的插槽总数是常量; 它等于正在使用的插槽数加上可用插槽数,以达到在 lsb.hosts (MXJ) 或 lsb.resources 中为主机或主机组配置的最大作业插槽数限制。 队列正在使用的槽的累积用于对队列进行排序以进行分派。

作业限制和主机限制由调度程序实施。 例如,如果 LSF 确定队列有资格运行 50 个作业,但该队列的作业限制为 40 个作业,那么将运行不超过 40 个作业。 其余 10 个作业插槽将在属于同一池的其他队列之间重新分发,或者使它们可供配置为使用它们的其他队列使用。

正在使用的累积槽数

当队列运行分配给它们的作业时, LSF 会累积每个队列已使用的插槽,并随着时间推移衰减此值,以便每个队列分配的插槽数不会超过应有的数量,并且池中的其他队列有机会运行它们的作业份额。

与其他调度策略的交互

  • 参与基于队列的公平共享池的队列不能是先发制人的或可先发制人的。
  • 不应在使用基于队列的公平共享的队列中配置插槽预留 (SLOT_RESERVE)。
  • 基于跨队列用户的公平共享 (FAIRSHARE_QUEUES) 可以撤销基于队列的公平共享的分派决策。 基于用户的跨队列公平共享队列不应成为基于队列的公平共享池的一部分。
  • 为同一队列定义 SLOT_RESERVEBACKFILL (在 lsb.queues中) 时,队列中的作业无法使用同一队列中其他作业保留的槽进行回填。

示例

使用两个主机的三个队列,每个队列的最大作业插槽限制为 6 ,总共 12 个要分配的插槽:
  • queue1共享要分配的插槽的 50% = 2 * 6 * 0.5 = 6 slots
  • queue2共享要分配的插槽的 30% = 2 * 6 * 0.3 = 3.6 = 4 slots
  • queue3共享要分配的插槽的 20% = 2 * 6 * 0.2 = 2.4 = 3 slots; 但是,由于总数不能超过 12 个,queue3实际上仅分配了 2 个插槽。
使用两个主机的四个队列,每个队列的最大作业插槽限制为 6 ,总共 12 个插槽;queue4不属于任何池:
  • queue1共享要分配的插槽的 50% = 2 * 6 * 0.5 = 6
  • queue2共享要分配的插槽的 30% = 2 * 6 * 0.3 = 3.6 = 4
  • queue3共享要分配的插槽的 20% = 2 * 6 * 0.2 = 2.4 = 2
  • queue4与其他队列共享无插槽

queue4导致插槽总数小于可用和正在使用的插槽总数。queue1,queue2queue3属于该池的资源。 池可能将其所有份额用完queue4,并且池中的作业将保持暂挂状态。

queue1,queue2queue3属于一个池,queue6,queue7queue8属于另一个池,并且queue4queue5不属于任何池:
LSF 将两个池中的队列从高优先级队列排序到低优先级队列 (queue1最高和queue8最低):
queue1 -> queue2 -> queue3 -> queue6 -> queue7 -> queue8
如果队列属于池,那么将首先从优先级最高的队列分派作业。 不属于任何池的队列 (queue4queue5) 将根据其优先级合并到此有序列表中,但 LSF 会从非池队列中分派尽可能多的作业:
queue1 -> queue2 -> queue3 -> queue4 -> queue5 -> queue6 -> queue7 -> queue8