额外约束

内容

概述

可以向节点添加额外数据,作业可以请求额外约束以根据其额外数据过滤节点。默认情况下,这一功能是禁用的,但可以在 slurm.conf 中启用。警告:Slurm 的回填调度器无法准确规划请求额外约束但未立即满足的作业的节点。这意味着,节点的额外数据更频繁更改时,回填调度器的准确性会降低。

配置

  • 在 slurm.conf 中配置 SchedulerParameters=extra_constraints

节点额外数据

节点的额外数据是一个 JSON 格式的字符串。可以在 slurmd 启动时使用 --extra 标志进行初始化。例如:

slurmd --extra '{ "a": 1.23, "b": true, "c": 0, "foo": "bar", "zed": 23 }'

或者,可以使用 scontrol 更新。例如:

scontrol update nodename=node123 extra='{ "a": 1.23, "b": true, "c": 0, "foo": "bar", "zed": 23 }'

这定义了可以在 salloc、sbatch 和 srun 中通过 --extra 选项请求的特性。值可以是任何字符串、数字或布尔值。

作业提交

语法

salloc、sbatch 或 srun 的 --extra 字段是一个任意字符串,如果使用空格或某些特殊字符,则需要用单引号或双引号括起来。

如果SchedulerParameters=extra_constraints被启用,则该字符串用于根据每个节点的 Extra 字段进行节点过滤。

最基本的请求结构如下:

<key><comparison_operator><value>

键和值是任意的、非空的字符串,不能包含任何运算符的组成字符,也不能包含括号。因此,以下字符在键或值中是不允许的:

,&|<>=!()

允许使用以下比较运算符:

  • = (等于)
  • != (不等于)
  • > (大于)
  • >= (大于或等于)
  • < (小于)
  • <= (小于或等于)

如果两个数字的差小于 0.00001,则认为它们相等。数字后缀(如 kb 或 mb)不受支持。如果字母与数字交错,则键或值被视为字符串。

请求可以通过布尔运算符连接在一起。

<request><boolean_operator><request>

允许使用以下布尔运算符:

&   (与)
,   (与)
|   (或)

可以使用任意数量的括号将请求分组。在任何给定的括号级别,所有布尔运算符必须相同。不同括号级别的布尔运算符可以不同。例如,以下情况是不允许的:

a=1&b=2|c=foobar

但以下情况是允许的:

(a=1&b=2)|c=foobar

警告

空白字符没有特殊处理。任何空白字符将被视为键或值的一部分。这意味着以下内容是无效的:

--extra " (a=b)"

开头的空格被解析为请求的键。然后,开括号字符被识别为键或比较运算符的无效字符。此请求将导致作业被拒绝。然而,以下是有效的:

--extra "( a=b)"

这有一个单一的请求。键是 " a",比较运算符是 "=",值是 "b"。

同样的警告适用于单引号和双引号。这些不被视为特殊字符,因此是字符串的一部分。因此,bar 和 "bar" 不相等。

有效和无效请求

以下是一些有效请求的示例:

a=1.23
a=   b
a!=1.24
a!=1.23|foo!=blah
b=200
b=true
foo<baz
(c<=0.0001&a=1.25)|zed=23.0
((c<=0.0001&a=1.25)|zed=23.0)&(a<1|b=false|c>=0.00000001)
((c<=0.0001&a=1.25)|zed=23.0)&(a<1|b=true|c>=0.1)

以下是一些无效请求的示例:

无效的比较运算符:

a,<=6

尾随运算符:

a<=6<=

多个布尔运算符连续出现:

a=5&&&b=5
a=5|||b=5

多个比较运算符连续出现:

a====5
b<=<=5

括号内没有内容:

a=5&()

在单个括号级别使用不同的布尔运算符:

a=5&b=5|c=5
(a=1)&(b=2)|(c=3)

单个请求之间没有布尔运算符:

a=1(b=2)
(a=1)(b=2)
(((a=1)b=2))

示例

给定一个节点,其额外数据如下:

Extra={ "a": 1.23, "b": true, "c": 0, "foo": "bar", "zed": 23 }

以下 --extra 请求由该节点满足:

a=1.23
a!=1.24
a!=1.23|foo!=blah
b=200
b=true
foo<baz
(c<=0.0001&a=1.25)|zed=23.0
((c<=0.0001&a=1.25)|zed=23.0)&(a<1|b=false|c>=0.00000001)
((c<=0.0001&a=1.25)|zed=23.0)&(a<1|b=true|c>=0.1)

以下 --extra 请求未被该节点满足:

a!=1.23
b=0
b=false
foo>baz
((c<=0.0001&a=1.25)|zed=23.0)&(a<1|b=false|c>=0.00001)

提醒:为了使两个数字被视为相等,它们的差必须小于 0.0001。这就是为什么 0.0001 不被视为等于 0,因此请求 c>=0.0001 未被满足,但 0.00000001 被视为等于 0,因此请求 c>=0.00000001 被满足。

一个实际的例子可能是有一个脚本查看每个节点的负载平均值,并用当前值更新每个节点的额外属性。这将允许用户将其作业限制在负载平均值低于某个阈值的节点上。

在这个简单的例子中,集群中的三个节点正在被监控,并且额外属性被填充为它们的负载平均值。

$ scontrol show nodes node[01-03] | grep -E 'NodeName|Extra'
NodeName=node01 Arch=x86_64 CoresPerSocket=6
   Extra={ "load": 0.99 }
NodeName=node02 Arch=x86_64 CoresPerSocket=6
   Extra={ "load": 0.75 }
NodeName=node03 Arch=x86_64 CoresPerSocket=6
   Extra={ "load": 0.45 }

作业可以请求在 CPU 使用率低于一半的机器上运行。

$ sbatch -n12 --extra "load<0.5" --wrap='srun sleep 10'
提交批处理作业 11206

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
             11206     debug     wrap      ben  R       0:03      1 node03

作业还可以请求在负载值范围内的节点上运行。

$ sbatch -n12 --extra "(load<0.9&load>0.5)" --wrap='srun sleep 10'
提交批处理作业 11207

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
             11207     debug     wrap      ben  R       0:01      1 node02

最后修改于 2024 年 11 月 08 日