概述

LSF 内置了基于主机的 slots 资源,支持根据可用作业槽位放置作业。可以配置现有 LSF 资源需求,根据打包分散策略进行作业调度。

两种策略

策略 说明 作用
Packing(打包) 优先在可用槽位最少的主机上放置作业 为大型并行作业腾出空间
Spreading(分散) 优先在可用槽位最多的主机上放置作业 最大化单个作业的性能

slots 资源

概念

slots 关键字表示每个主机上的可用槽位,是一个内置的递减数值资源

工作原理

  • 当主机空闲时,slots 值等于主机的 MXJ(最大作业数)
  • 当作业占用槽位时,slots 值相应减少

示例

  • 主机 MXJ 定义为 8
  • 主机空闲时:slots = 8
  • 6 个槽位被占用后:slots = 2

使用位置

slots 资源只能在资源需求字符串的以下部分使用:

  • select[]
  • order[]

配置方法

使用 order[] 应用策略

语法 效果
order[-slots] 打包策略 - 按可用槽位最少排序
order[slots] 分散策略 - 按可用槽位最多排序

配置级别

order[] 部分可以在以下上下文中使用:

级别 配置文件 优先级
队列级别 lsb.queues 中的 RES_REQ 最低
应用级别 lsb.applications 中的 RES_REQ
作业级别 bsub -Rbmod -R 最高

注意:作业级别 order[] 覆盖应用级别,应用级别覆盖队列级别。

配置示例

队列级别:打包策略

lsb.queues 中配置:

1
2
3
4
5
6
Begin Queue
QUEUE_NAME = myqueue
...
RES_REQ    = order[-slots]
...
End Queue

验证:

1
2
3
4
5
$ bqueues -l myqueue
QUEUE: myqueue
...
RES_REQ:  order[-slots]
...

应用级别:分散策略

lsb.applications 中配置:

1
2
3
4
5
6
Begin Application
NAME       = myapp
...
RES_REQ    = order[slots]
...
End Application

验证:

1
2
3
4
5
$ bapp -l myapp
APPLICATION NAME: myapp
...
RES_REQ:  order[slots]
...

使配置生效

1
badmin reconfig

每作业排序(Per-Job Sorting)

问题背景

默认情况下,在每个调度周期中,候选主机只被选择和排序一次。这是为了提高高吞吐量计算环境的调度性能。但当单个调度周期内调度大量作业时,可能导致结果不准确,因为即使 slots 值因新作业调度而变化,主机顺序也不会改变。

解决方案:使用 !

order[] 中使用感叹号 ! 使候选主机按每个作业排序:

1
bsub -R "order[!slots]" myjob

启用配置

lsb.params 中设置:

1
SCHED_PER_JOB_SORT=Y

重新配置:

1
2
3
badmin mbdrestart
# 或
badmin reconfig

使用示例

示例一:使用打包策略队列

1
bsub -q myqueue myjob

作业受队列限制,优先使用可用槽位最少的主机。

示例二:使用分散策略应用

1
bsub -app myapp myjob

作业受应用配置文件限制,优先使用可用槽位最多的主机。

示例三:作业数组按作业排序

1
bsub -R "order[!slots]" -J "array[1-3]" myjob

3 个元素的作业数组,每个作业都请求可用槽位最多的主机,并按作业排序。

最佳实践

场景 推荐策略 配置
需要为大型并行作业预留空间 打包 order[-slots]
最大化单作业性能 分散 order[slots]
高吞吐量环境精确调度 每作业排序 order[!slots] + SCHED_PER_JOB_SORT=Y

参考资料

  1. IBM Documentation - Placing jobs based on available job slots
  2. IBM Documentation - Best practices and tips for LSF