概述
HPC 集群的底层网络通常可以用根树表示,如”胖树”网络。在树状网络中,叶节点表示主机,内部节点表示交换机。通过树结构边数越少的主机之间通信延迟越小。
对于跨多主机的作业,通常希望将网络拓扑中距离较近的主机分配给作业,以最小化作业各任务之间的通信延迟。
LSF 计算单元(Compute Unit, CU)功能使 LSF 在调度时考虑树状网络拓扑。
配置步骤
步骤一:定义计算单元类型
在 lsb.params 中配置 COMPUTE_UNIT_TYPES 参数:
1
COMPUTE_UNIT_TYPES = switch! rack building
参数说明
- 定义了三种 CU 类型:switch、rack、building
- 顺序对应网络拓扑层级:switch(最细)→ rack → building(最粗)
!标记默认 CU 类型(本例中 switch 是默认类型)- 主机包含在最低层级的 CU 中(本例中是 switch)
层级关系
1
2
3
4
building
└── rack
└── switch
└── hosts
步骤二:配置计算单元层次结构
在 lsb.hosts 的 ComputeUnit 部分配置主机组织结构:
1
2
3
4
5
6
7
8
9
10
11
Begin ComputeUnit
NAME TYPE MEMBER
s1 switch (host01 host02 host03 host04)
s2 switch (host05 host06 host07 host08)
...
r1 rack (s1 s2)
r2 rack (s3 s4)
...
b1 building (r1 r2)
b2 building (r3 r4)
End ComputeUnit
注意:与标准 LSF 主机组不同,CU 层次结构是严格的森林结构。每个 CU 和主机最多只能出现在一个父 CU 的成员列表中。
步骤三:使配置生效
1
badmin reconfig
验证配置
1
2
3
4
5
6
7
8
9
10
$ bmgroup -cu
NAME TYPE HOSTS
s1 switch host01 host02 host03 host04
s2 switch host05 host06 host07 host08
...
r1 rack s1/ s2/
r2 rack s3/ s4/
...
b1 building r1/ r2/
b2 building r3/ r4/
提交作业使用计算单元
基本用法:指定 CU 名称
CU 本质上是带有类型的 LSF 主机组,所有主机组功能都适用于 CU:
1
$ bsub -m "r1" -n 64 ./a.out
此作业请求 64 个槽位,全部必须在 CU r1 的主机上。
使用 cu[] 资源需求
使用默认 CU 类型
1
$ bsub -R "cu[]" -n 64 ./a.out
LSF 将作业放置在默认类型(本例中是 switch)的 CU 中的主机上。
指定 CU 类型
1
$ bsub -R "cu[type=rack]" -n 64 ./a.out
cu[] 关键字
| 关键字 | 说明 | 示例 |
|---|---|---|
type |
指定 CU 类型 | cu[type=rack] |
pref |
指定 CU 选择偏好 | cu[pref=maxavail] |
maxcus |
限制作业跨越的最大 CU 数量 | cu[maxcus=1] |
excl |
独占使用 CU | cu[excl] |
CU 选择偏好 (pref)
| 偏好值 | 说明 | 适用场景 |
|---|---|---|
minavail |
优先选择空闲槽位最少的 CU | 串行作业,避免 CU 碎片化 |
maxavail |
优先选择空闲槽位最多的 CU | 并行作业,最小化跨 CU 数量 |
示例
1
2
3
4
5
# 偏好空闲槽位最少的 CU(避免碎片化)
$ bsub -R "cu[pref=minavail]" ./a.out
# 偏好空闲槽位最多的 CU(减少延迟)
$ bsub -R "cu[pref=maxavail]" -n 64 ./a.out
限制 CU 数量 (maxcus)
限制作业可以跨越的 CU 数量:
1
2
3
4
5
# 限制在单个 CU 内运行
$ bsub -R "cu[maxcus=1]" ./a.out
# 最多跨越 10 个 CU
$ bsub -R "cu[maxcus=10]" ./a.out
注意:如果作业无法在指定数量的 CU 内放置,将保持 PEND 状态。
组合使用
尽可能少地使用 rack,但最多不超过 2 个:
1
$ bsub -R "cu[type=rack:pref=maxavail:maxcus=2]" -n 64 ./a.out
独占 CU (excl)
对于基准测试等需要避免其他作业干扰的场景,可以独占使用 CU。
步骤一:队列启用独占
在 lsb.queues 中配置:
1
2
3
4
5
6
Begin Queue
QUEUE_NAME = benchmark
...
EXCLUSIVE = CU[rack]
...
End Queue
此设置允许队列中的作业独占使用 rack 类型的 CU,以及更细粒度的 CU 类型和单个主机。
步骤二:提交独占作业
1
$ bsub -R "cu[type=rack:excl]" -n 64 ./a.out
作业将保持 PEND 直到 LSF 能够授予其一个或多个 rack 的独占使用权。作业运行后,其他作业不能调度到这些 rack。
配置参数汇总
| 参数 | 配置文件 | 说明 |
|---|---|---|
COMPUTE_UNIT_TYPES |
lsb.params | 定义 CU 类型层级 |
ComputeUnit section |
lsb.hosts | 定义 CU 成员结构 |
EXCLUSIVE = CU[type] |
lsb.queues | 启用队列的 CU 独占功能 |