范围字符串
span 字符串指定并行作业的位置。 如果省略了 span ,那么 LSF 将从可用处理器集为作业分配所需的处理器。
语法
span 字符串支持以下语法:
- 范围 [hosts=1]
- 指示分配给此作业的所有处理器必须位于同一主机上。
- span [块 = 值]
- 对于并行作业, LSF 将根据块大小向作业分配槽。 LSF 尝试在一个主机上打包尽可能多的块,然后转至下一个主机。 每个主机仅检查一次。
- span [ptile=value]
- 指示每个主机上应该分配给作业的处理器数,其中 value 是下列其中一项:
- 缺省 ptile 值,由 n 个处理器指定。 在以下示例中,作业请求每个可用主机上的 4 处理器,而不考虑该主机具有的处理器数:
span[ptile=4] - 预定义的 ptile 值,由 "!" 指定。 以下示例使用预定义的最大作业槽限制 lsb.hosts (每个主机类型/型号的 MXJ) 作为其值:
span[ptile='!']提示: 如果主机类型/型号未定义 MXJ ,那么将忽略span[ptile='!']值。限制: 在 bash 3.0下, shell 未正确解释感叹号 (!)。 要使用预定义的 ptile 值 (ptile = '!') ,请使用 + H 选项禁用 "!" bash (sh + H) 中的样式历史记录替换。 - 预定义的 ptile 值,每个主机类型或主机模型具有可选的多个 ptile 值:
- 对于主机类型,必须指定same[type]在资源需求中。 在以下示例中,作业请求类型的主机上的 8 处理器HP以及类型为主机上的 2 个处理器LINUX以及 lsb.hosts (MXJ) 中针对其他主机类型的预定义最大作业插槽限制:
span[ptile='!',HP:8,LINUX:2] same[type] - 对于主机模型,必须指定same[model]在资源需求中。 在以下示例中,作业请求模型主机上的 4 处理器PC1133以及 PC233型主机上的 2 处理器,以及 lsb.hosts (MXJ) 中针对其他主机型号的预定义最大作业插槽限制:
span[ptile='!',PC1133:4,PC233:2] same[model]
- 对于主机类型,必须指定same[type]在资源需求中。 在以下示例中,作业请求类型的主机上的 8 处理器HP以及类型为主机上的 2 个处理器LINUX以及 lsb.hosts (MXJ) 中针对其他主机类型的预定义最大作业插槽限制:
- 缺省 ptile 值,由 n 个处理器指定。 在以下示例中,作业请求每个可用主机上的 4 处理器,而不考虑该主机具有的处理器数:
- 范围 [条带]
- 对于并行作业, LSF 会跨候选主机的可用资源对作业的任务进行条带分割。
例如,如果使用以下命令提交请求四个任务的作业:
bsub -n 4 -R "span[stripe]" ./a.out任务布置取决于可用资源:
- 如果有一个候选主机,那么该主机有四个任务 (4)。
- 如果有两个候选主机,那么每个主机都有两个任务 (2, 2)。
- 如果有三个候选主机,那么一个主机有两个任务,另外两个主机各有一个任务 (2,1, 1)。
- 如果有四个候选主机,那么每个主机都有一个任务 (1,1,1 , 1)。
- span [stripe=max_tasks]
- 对于并行作业, LSF 会跨候选主机的可用资源对作业的任务进行条带分割,直至达到每个主机上指定的最大任务数。
- 范围 [hosts=-1]
禁用队列中的范围设置。 LSF 从可用处理器集为作业分配必需的处理器。
示例
以下示例适用于在具有以下空闲主机的集群中提交的作业:
bhosts
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
host1 ok - 32 0 0 0 0 0
host2 ok - 32 0 0 0 0 0
host3 ok - 32 0 0 0 0 0
host4 ok - 32 0 0 0 0 0
host5 ok - 32 0 0 0 0 0
- 提交具有条带分割的作业:
bsub -n 32 -R "span[stripe]" myjob查看具有条带分割的作业的任务分布:
bjobs JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME 118 userA RUN normal hostA 7*host1 myjob Nov 29 14:27 7*host2 6*host3 6*host4 6*host5任务将均匀分布到主机,并且任何其他任务都将分布到第一个主机。 host1 和 host2上有 7 个任务, host3, host4和 host5上有 6 个任务。
- 使用 ptile提交作业:
bsub -n 32 -R "span[ptile=8]" myjob使用 ptile查看作业的任务分布:
bjobs JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME 119 userA RUN normal hostA 8*host1 myjob Nov 29 14:29 8*host2 8*host3 8*host4任务与每个主机的精确 8 任务一起分发,但如果要分发的任务总数较少,那么最后一个主机的任务数可能少于 ptile 值。
- 根据块大小提交作业:
bsub -n 32 -R "span[block=8]" myjob根据块大小查看作业的任务分布:
bjobs JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME 120 userA RUN normal hostA 32*host1 myjob Nov 29 14:32任务打包在 8 的块中。
- 向单个主机提交作业:
bsub -n 32 -R "span[hosts=1]" myjob查看提交到单个主机的作业的任务分布:
bjobs JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME 121 userA RUN normal hostA 32*host1 myjob Nov 29 14:34将任务放入单个主机 (host1) 中。
可调整大小的作业
对于 span[hosts=1]的资源需求,调整大小请求仅限于作业的第一次执行主机上的插槽。 此行为消除了从最初分派作业时修改 span 表达式时产生的岐义。
bsub -n "1,20" -R "span[ptile=2]" sleep 10000此特殊范围行为不仅适用于调整请求大小。 仅当进行原始分配时,以及在进行额外的调整大小分配时,它才适用于可调整大小的作业。
如果每个主机只有一个插槽可用,那么将为作业分配一个插槽。
将处理具有部分填充的主机的调整大小请求,以便 LSF 不会选择作业已占用的主机上的任何插槽。 例如,通常将 ptile 功能部件与 span[ptile=1] 配合使用以调度互斥作业。
- 请求的最大插槽数,包括每个主机上的 n 个插槽,以及一个主机上的 0 和 n-1 (含) 个插槽之间的插槽
- 每个主机上的 n 个插槽,合计为小于最大值的某个值
- 14 个插槽,其中 2 个插槽位于一个主机上, 4 个插槽位于每个 3 主机上
- 4 , 8 或 12 个插槽,使每个主机分配 4 个插槽
示例
bsub -x -ar -app <appplicaion_file> -n "1,100" -R "span[ptile=1]" myjob当将其他插槽分配给正在运行的作业时,这些插槽将位于新主机上,而不是已由该作业占用。
块调度
对于对网络等待时间不特别敏感的应用程序,或者您希望获取吞吐量的位置,可以为具有特定块大小的并行作业分配插槽。 作业指定的应用程序可能正在 n 核心组上作为线程进程运行,但使用 MPI 应用程序或块之间的其他套接字连接。 LSF 将根据块大小向作业分配插槽。 LSF 尝试在一个主机上打包尽可能多的块,然后转至下一个主机。 每个主机仅检查一次。 包含插槽块的主机无关紧要。 该作业可以在任何先前作业完成后立即启动。
例如,在下面的插图中,每种颜色都表示不同的作业。 有四个 16 路作业:

对于 bsub -n 16 和 block=4,仅需要 4 x 4 插槽块。 包含插槽块的主机无关紧要。 该作业可以在任何先前作业完成后立即启动。
此打包策略受资源需求字符串的 span 部分中的关键字 block (“span[block=value]”) 支持。 还可以在 lsb.queues 和 lsb.applications中的 RES_REQ 参数中配置 “span[block=value]” 。
为作业指定块大小时, LSF 仅分配该作业的块大小的倍数。 例如,对于块大小为 4 的作业:
- bsub -n 2,13: 4 , 8 或 12 个插槽分配给作业 (大小为 4 的块)。
- bsub -n 5: 作业被拒绝。
- bsub -n 9,10: 作业被拒绝。
- bsub -n 2,3: 作业被拒绝。
- bsub -n 12: 接受作业,并分配大小为 4 的 3 块。
- bsub -n 2: 作业被拒绝。
- bsub -n 3: 作业被拒绝。
-n min,max 中的最小值将以静默方式更改为块的倍数。 例如:
bsub -n 2,8 -R span[block=4] sleep 1d
更改为:
bsub -n 4,8 -R span[block=4] sleep 1d
LSF 尝试将尽可能多的块打包到一个主机中,然后转至下一个主机。 例如,假定 host1 具有 8 个插槽, host2 具有 8 个插槽, host3 也具有 8 个插槽,其中每个主机的 2 个插槽由其他作业使用。 对于具有 -n 9 "span[block=3]”的作业,分配将为:
- host1: 6 插槽
- host2: 3 插槽
以下是如何显示主机及其静态和动态资源信息,指定作业的块大小和资源需求以及查看输出的示例:
bhosts
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
hostA ok - 8 0 0 0 0 0
hostB ok - 8 0 0 0 0 0
hostC ok - 8 0 0 0 0 0
hostD unavail - 1 0 0 0 0 0
hostE ok - 4 0 0 0 0 0
hostF ok - 4 0 0 0 0 0
bsub -n 24 -R "order[slots] span[block=4]" sleep 1d
Job <418> is submitted to default queue <normal>.
bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
418 user1 RUN normal hostE 8*hostC sleep 1d Sep 4 21:36
8*hostB sleep 1d Sep 4 21:36
8*hostA sleep 1d Sep 4 21:36
bhosts
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
hostA closed - 8 8 8 0 0 0
hostB closed - 8 8 8 0 0 0
hostC closed - 8 8 8 0 0 0
hostD unavail - 1 0 0 0 0 0
hostE ok - 4 0 0 0 0 0
hostF ok - 4 0 0 0 0 0
以下是在提交具有资源需求的作业时如何使用 “span[block=value]” 的一些其他示例:
- 要按主机类型或主机模型指定预定义的块值,请使用!:
bsub -n "2,10" –R "span[block='!'] same[type]" myjob
- 要按主机类型或主机模型指定具有可选多个块值的预定义块值,请执行以下操作:
bsub -n "2,10" –R “span[block='!',HP:8,SGI:8,LINUX:2] same[type]" myjob
如果主机类型/型号未定义 MXJ ,那么缺省预定义块值为 1。
“span[block=value]” 可由 bjobs -l, bhist -l, bqueues -l, bapp -l 和 bacct -l显示。
使用块调度功能时,请注意以下事项:
- 对于队列主机限制 (HOSTLIMIT_PER_JOB) , mbatchd 将不会拒绝具有 block=x 的作业,因为只能在调度期间获取确切的已分配主机数。
- 不能同时指定 “span[block=value]” 和 “span[ptile=value]” 。 不能同时指定 “span[block=value]” 和 “span[host=value]” ,因为范围不能接受多个条件,并且多个 -R 不支持多个范围定义。
- 对于 LSF 多集群功能,使用作业转发模型时,无法将具有 block=x 的作业转发到版本低于 9.1.2的远程集群。 使用租赁模型时,无法将具有 block=x 的作业分配给从版本低于 9.1.2的远程集群租赁的主机。