概述
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 -R 或 bmod -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 |