选择字符串

选择字符串指定主机必须具有的特征才能与资源需求匹配。 它是根据一组资源名称构建的逻辑表达式。 将针对每个主机对选择字符串进行求值; 如果结果为非零,那么将选择该主机。 与 cu 字符串结合使用时,不会考虑不属于计算单元的主机。

语法

选择字符串可以将资源名称与逻辑运算符和算术运算符组合在一起。 非零算术值被视为逻辑 TRUE ,零被视为逻辑 FALSE。 布尔资源 (例如,用于表示 LSF 服务器主机的 服务器 ) 的值为 1 (如果为主机定义) ,零 (如果未为主机定义)。

资源名称 swapidlelogincpu 分别被接受为 swpitlsr1m 的别名。

ut 索引度量 CPU 利用率,这是运行系统和用户代码所花费时间的百分比。 未运行任何进程的主机的 ut 值为 0%; 完全装入 CPU 的主机的 ut 值为 100%。 必须将 ut 指定为 0.0 到 1.0之间的浮点数。

对于字符串资源 typemodel,特殊值 any 选择任何值, local 选择与本地主机相同的值。 例如, type == local 选择与提交作业的主机类型相同的主机。 如果作业可以在任何类型的主机上运行,请在资源需求中包含 type == any

如果未指定 type ,那么缺省值取决于命令。 对于 bhostsbsublsplacelsrunlsgrun ,缺省值为type==local除非指定了字符串或布尔资源,在这种情况下,type==any. 对于 lshosts lsload,缺省值为type==any.

小贴士 When PARALLEL_SCHED_BY_SLOT=Y in lsb.params, the resource requirement string keyword ncpus refers to the number of slots instead of the number of CPUs, however lshosts output will continue to show ncpus as defined by EGO_DEFINE_NCPUS in lsf.conf.

您还可以在资源要求的选择字符串中使用slotsmaxslots来筛选主机。 例如:

select[slots>4 && maxslots < 10 || mem > 10] order[-slots:maxslots:maxmem:ut]

指定多个 -R 选项

bsub 接受简单资源需求中选择部分的多个 -R 选项。

限制:复合资源需求不支持多个-R选项。

您可以指定多个资源需求字符串,而无需使用&&运算符。 例如:

bsub -R "select[swp > 15]" -R "select[hpux]"

LSF 将多个 -R 选项合并为一个字符串,并在可以满足所有资源需求时分派作业。 通过允许多个资源需求字符串并将其自动合并到一个字符串中, LSF 简化了多层包装程序脚本的使用。

不能在同一 -R 选项中指定多个选择部分。 使用逻辑和 (&&) 运算符在同一选择部分中指定多个选择字符串。 例如,以下命令提交名为myjob以在具有超过 15 MB 可用交换空间且最大 RAM 大于 100 MB 的主机上运行。 该作业应在主机上保留 100 MB 内存:
% bsub -R "select [swp > 15 &&  maxmem > 100]  rusage[mem = 100] " myjob

-R 选项部分的数目不受限制。

选择共享字符串资源

必须使用单引号字符 (') 围绕字符串型共享资源。 例如,使用 lsload -s 来查看为集群定义的共享资源:

lsload -s
RESOURCE                                VALUE       LOCATION
os_version                                4.2       pc36
os_version                                4.0       pc34
os_version                                4.1       devlinux4
cpu_type                                   ia       pc36
cpu_type                                   ia       pc34
cpu_type                              unknown       devlinux4

lsload -R 中使用选择字符串来指定要查看的共享资源,将共享资源值括在单引号中。 例如:

lsload -R "select[os_version=='4.2' || cpu_type=='unknown']" 
HOST_NAME       status  r15s   r1m  r15m   ut    pg  ls    it   tmp   swp   mem
pc36                ok   0.0   0.2   0.1   1%   3.4   3     0  895M  517M  123M
devlinux4           ok   0.0   0.1   0.0   0%   2.8   4     0 6348M  504M  205M
注: 根据主机状态 (bsub -R "status==ok") 保留资源时,主机状态必须是通过运行 bhosts not lsload显示的状态。

运算符

可以在选择字符串中使用这些运算符。 按优先顺序降序列出运算符。


语法 含义
(a) lsf.conf 中配置 LSF_STRICT_RESREQ=Y 时,括号之间的表达式比其他运算符具有更高的优先级。
-a

!a

a 的负数

逻辑不为: 1 if a==00 否则

a * b

a/b

ab 相乘

a 除以 b

a + b

A-b

添加 ab

a 中减去 b

a> b

a < b

a> = b

a <= b

1 如果 a 大于 b,那么 0 否则

1 如果 a 小于 b0 否则

1 如果 a 大于或等于 b,那么 0 否则

1 如果 a 小于或等于 b,那么 0 否则

a == b

a! = b

1 如果 a 等于 b,那么 0 否则

1 如果 a 不等于 b0 否则

a && b 逻辑 AND: 1 如果 ab 都非零, 0 否则
a | | b 逻辑 OR: 1 如果 ab 非零, 0 否则

示例

select[(swp > 50 && type == x86_64) || (swp > 35 && type == LINUX)]
select[((2*r15s + 3*r1m + r15m) / 6 < 1.0) && !fs && (cpuf > 4.0)]

使用关键字 "defined" 指定共享资源

可以在任何 LSF 命令的资源需求字符串中使用共享资源。 例如,在提交需要一定数量的共享临时空间的 LSF 作业时,可以按如下所示提交该作业:

bsub -R "avail_scratch > 200 && swap > 50" myjob

以上假定集群中的所有主机都有权访问共享临时空间。 仅当作业的值为"avail_scratch"资源大于 200 MB ,并转至具有至少 50 MB 可用交换空间的主机。

可以配置系统,以便只有 LSF 集群中的某些主机能够访问临时空间。 要排除无法访问共享资源的主机,必须在资源需求字符串中指定 defined (resource_name) 函数。

例如:

bsub -R "defined(avail_scratch) && avail_scratch > 100 && swap > 100" myjob

将排除无法访问临时资源的任何主机。 LSF 管理员配置哪些主机具有特定共享资源的访问权,哪些主机不具有特定共享资源的访问权。

定义的函数中受支持的资源名称

只有在 lsf.shared 中配置的资源名称 (定义了 INTERVAL 字段的动态 NUMERIC 资源名称除外 ) 才会被接受为 defined (resource_name) 函数中的自变量。

defined (resource_name) 函数中 接受以下资源名称:
  • 以下内置资源名称:
    r15s r1m r15m ut pg io ls it tmp swp mem ncpus ndisks maxmem
    maxswp maxtmp cpuf type model status rexpri server and hname
  • lsf.shared 中配置的动态数值资源名称,其中定义了间隔字段。 在缺省配置中,这些是 modecntrlit_t。)
  • 未在 lsf.shared中配置其他非内置资源名称。

指定互斥资源

可以在任何布置或调度命令 (例如 bsublsplacelsrunlsgrun) 的资源需求字符串中使用互斥资源。 互斥资源是可分配给主机的特殊资源。 此主机将不会接收作业,除非该作业显式地请求该主机。 例如,使用以下命令来提交需要独占资源 bigmem的作业:

bsub -R "bigmem" myjob

除非命令使用选项 -R 显式指定 "bigmem",否则不会将作业与 bigmem 资源一起分派至主机。

要配置互斥资源,请首先在 lsf.shared中定义静态布尔资源。 例如:

Begin Resource
...
bigmem Boolean () ()
End Resource

lsf.cluster.cluster_name (对于静态主机) 或 LSF_LOCAL_RESOURCES (对于动态主机) 的 "主机" 部分中,将资源分配给主机。 以感叹号 (!) 作为资源名称的前缀,以指示该资源对于主机是互斥的。 例如:

Begin Host
HOSTNAME   model  type  server r1m pg tmp RESOURCES       RUNWINDOW
...
hostE      !      !     1      3.5 () ()  (linux !bigmem) ()
...
End Host
 
LSF_LOCAL_RESOURCES="[resource linux] [!bigmem]"

资源需求选择字符串的严格语法

lsf.conf中配置 LSF_STRICT_RESREQ=Y 时,选择部分中的资源需求字符串必须符合更严格的语法。 严格的资源需求语法仅适用于 select 部分。 它不适用于其他资源需求部分 (orderrusagesamespancu)。 当 lsf.conf中的 LSF_STRICT_RESREQ=Y 时, LSF 将拒绝资源需求字符串,其中 rusage 部分包含不可使用的资源。

严格选择字符串语法用法说明

严格语法区分大小写。

只能使用以下运算符计算布尔变量,例如 fshpuxcs
&& || !
只能使用以下运算符计算字符串变量 (例如 type):
= == != < > <= >=
对于函数调用,括号 "()" 与资源名之间的空格无效。 例如,以下内容不正确:
defined(   mg   )
多个逻辑 NOT 运算符 (!) 无效。 例如,以下内容不正确:
!!mg
以下资源需求有效:
!(!mg)
每个部分必须至少有一个空格分隔。 例如,以下内容是正确的:
type==any rusage[mem=1024]
select[type==any] rusage[mem=1024]
select[type==any]rusage[mem=1024]
但以下内容不正确:
type==anyrusage[mem=1024]
更严格的语法仅支持单个选择部分。 以下内容在同一资源需求字符串中不受支持:
select[mem>0] select[maxmem>0]

字符串文字中不支持转义字符 (如 "\n")。

不允许在选择字符串中使用冒号 (:)。 例如,select[mg:bigmem]不正确。

infnan 可用作资源名称或资源名称的一部分。

仅支持在整个资源需求字符串周围使用单引号或双引号,而不支持在包含选择字符串的方括号内使用单引号或双引号。 例如,在 lsb.queues中,RES_REQ='swp>100'RES_REQ="swp>100"是正确的。 立场中立RES_REQ=select['swp>100']norRES_REQ=select["swp>100"]

以下是正确的 bsub 命令级别资源需求:
  • bsub -R "'swp>100'"
  • bsub -R '"swp>100"'
以下内容不正确:
  • bsub -R "select['swp>100']"
  • bsub -R 'select["swp>100"]'
不再以静默方式忽略某些不正确的资源需求。 例如,在 lsf.conf中配置 LSF_STRICT_RESREQ=Y 时,资源需求解析器将拒绝以下内容:
  • microcs73已拒绝:
    linux rusage[mem=16000] microcs73
  • select[AMD64]已拒绝:
    mem < 16384 && select[AMD64]
  • linux已拒绝:
    rusage[mem=2000] linux
  • 使用冒号 (:) 来分隔选择条件,例如linux:qscw.
  • 不支持 lsfintro(1) 联机帮助页中描述的资源需求选择字符串的受限语法。

显式和隐式选择部分

显式选择部分从部分关键字开始,在下一部分开始时结束,例如: 选择部分是select[selection_string]. 如果没有其他资源需求部分,那么隐式选择部分从资源需求字符串的第一个字母开始,并在字符串末尾结束。 如果资源需求具有其他部分,那么隐式选择部分在选择字符串之后的第一个部分的第一个字母之前结束。

所有显式部分都必须以部分关键字 (selectorderspan rusagesame) 开头。 资源需求内容包含在方括号 ([) 和 (]) 中。

隐式选择部分必须是整个资源需求规范中的第一个资源需求字符串。 显式选择部分可以出现在其他部分之后。 资源需求字符串只能有一个选择部分 (显式选择部分或隐式选择部分)。 关键字名称不正确的部分不是有效的部分。

隐式选择部分的格式必须与显式选择部分的内容相同。 例如,以下命令是正确的:
  • bsub -R "select[swp>15] rusage[mem=100]" myjob
  • bsub -R "swp > 15 rusage[mem=100]" myjob
  • bsub -R "rusage[mem=100] select[swp >15]" myjob

示例

以下示例说明了一些正确的资源需求选择字符串语法。
  • bsub -R "(r15s * 2 + r15m) < 3.0 && !(type == IBMAIX4) || fs" myjob
  • 如果交换空间等于 0 ,那么以下表示 TRUE; 如果交换空间不等于 0 ,那么表示 FALSE:
    bsub -R "!swp" myjob 
  • 选择与提交作业的主机类型相同的主机:
    bsub -R "type == local" myjob
  • 选择与提交作业的主机类型不同的主机:
    bsub -R "type != local" myjob
  • bsub -R "r15s < 1.0 || model ==local && swp <= 10" myjob

    由于 && 的优先级高于 ||,因此此示例表示:

    r15s < 1.0 || (model == local  && swp <=10)
  • 此示例具有与先前示例不同的含义:
    bsub -R "(r15s < 1.0 || model == local) && swp <= 10" myjob

    此示例表示:

    (r15s < 1.0 || model == local) && swp <= 10

检查资源需求语法

使用 BSUB_CHK_RESREQ 环境变量可根据 lsf.conf中的 LSF_STRICT_RESREQ=Y 启用的更严格语法来检查现有资源需求选择字符串的兼容性。

将 BSUB_CHK_RESREQ 环境变量设置为任何启用 bsub 的值,以检查资源需求选择字符串的语法,而无需实际提交作业以进行调度和分派。 不需要设置 LSF_STRICT_RESREQ 来检查资源需求选择字符串语法。

bsub 仅检查资源需求的选择部分。 不会检查资源需求字符串中的其他部分。

如果资源需求检查在选择字符串中检测到语法错误,那么 bsub 将返回错误消息。 例如:
bsub -R "select[type==local] select[hname=abc]" sleep 10
Error near "select": duplicate section. Job not submitted.
echo $?
255
如果找不到错误,那么 bsub 将返回成功的消息和退出代码零。 例如:
env | grep BSUB_CHK_RESREQ
BSUB_CHK_RESREQ=1
bsub -R "select[type==local]" sleep 10
Resource requirement string is valid.
echo $?
0
如果设置了 BSUB_CHK_RESREQ ,但未指定 -R,那么 LSF 会将其视为空资源需求。 例如:
bsub sleep 120
Resource requirement string is valid.
echo $?
0

可调整大小的作业

根据已合并资源需求的 select 表达式的确定,将使用主机来调度调整分配请求的大小。 例如,要在 1-100 个插槽上运行可自动调整大小的作业,但仅在类型为 X86_64的主机上运行,以下作业提交将指定此资源请求:
bsub -ar -app <appplicaion_file> -n "1,100" -R "rusage[swp=100,license=1]" myjob

每次作业在插槽中增长时,都会在指定类型的主机上请求插槽。

注: 可弹性作业不能具有复合或备用资源需求。