许可证指南

许可证概述

Slurm 可以通过在调度时将可用许可证分配给作业来帮助软件许可证管理。如果许可证不可用,作业将保持待处理状态,直到许可证变得可用。Slurm 中的许可证本质上是共享资源,意味着配置的资源不绑定到特定主机,而是与整个集群相关联。

Slurm 中的许可证可以通过两种方式进行配置:

  • 本地许可证: 本地许可证是使用配置的 slurm.conf 本地于集群的。
  • 远程许可证: 远程许可证由数据库提供,并使用 sacctmgr 命令进行配置。远程许可证具有动态特性,因为在运行 sacctmgr 命令时,slurmdbd 会更新所有分配了许可证的集群。

本地许可证

本地许可证在 slurm.conf 中使用 Licenses 选项定义。

slurm.conf:

Licenses=fluent:30,ansys:100

可以使用 scontrol 命令查看已配置的许可证。

$ scontrol show lic
LicenseName=ansys
    Total=100 Used=0 Free=100 Remote=no
LicenseName=fluent
    Total=30 Used=0 Free=30 Remote=no

请求许可证是通过使用 -L 或 --licenses 提交选项来完成的。

$ sbatch -L ansys:2 script.sh
提交的批处理作业 5212

$ scontrol show lic
LicenseName=ansys
    Total=100 Used=2 Free=98 Remote=no
LicenseName=fluent
    Total=30 Used=0 Free=30 Remote=no

许可证也可以使用 --tres-per-task 选项请求作业提交。如果使用这种方法,许可证还必须在 slurm.conf 的 AccountingStorageTRES 选项中定义。

slurm.conf:

Licenses=fluent:30
AccountingStorageTRES=license/fluent

使用 --tres-per-task 提交选项请求许可证。

$ sbatch --tres-per-task=license/fluent:4 script.sh
提交的批处理作业 6482

$ scontrol show lic
LicenseName=fluent
    Total=30 Used=4 Free=26 Reserved=0 Remote=no

远程许可证

远程许可证 提供与第三方许可证管理器的任何集成。创建这些许可证时使用的“Server”和“ServerType”参数仅用于信息目的,并不意味着与这些服务器的任何自动许可证管理。系统管理员有责任实现与这些系统所需的任何集成。例如,这将包括确保只有通过 Slurm 请求远程许可证的用户可以从许可证服务器签出许可证,或确保 Slurm 的许可证计数与许可证服务器保持同步(参见 动态许可证)。

用例

某个站点有两个许可证服务器,一个提供 100 个由 FlexNet 提供的 Nastran 许可证,另一个提供 50 个来自 Reprise License Management 的 Matlab 许可证。该站点有两个集群,分别命名为“fluid”和“pdf”,专门用于运行使用这两种产品的仿真作业。管理者希望在集群之间平均分配 Nastran 许可证的数量,但将 70% 的 Matlab 许可证分配给“pdf”集群,其余 30% 分配给“fluid”集群。

为用例配置 Slurm

在这里我们假设两个集群已使用 sacctmgr 命令正确配置在 slurmdbd 中。

$ sacctmgr show clusters format=cluster,controlhost
   Cluster     ControlHost
---------- ---------------
     fluid     143.11.1.3
       pdf     144.12.3.2

使用 sacctmgr 命令添加许可证,指定许可证的总数和应分配给每个集群的百分比。这可以通过一步或多步过程完成。

一步:

$ sacctmgr add resource name=nastran cluster=fluid,pdf \
  count=100 allowed=50 server=flex_host servertype=flexlm type=license
 添加资源
  nastran@flex_host
   Cluster - fluid	50
   Cluster - pdf	50
 设置
  Name           = nastran
  Server         = flex_host
  Description    = nastran
  ServerType     = flexlm
  Count          = 100
  Type           = License

多步:

$ sacctmgr add resource name=matlab count=50 server=rlm_host \
  servertype=rlm type=license
 添加资源
  matlab@rlm_host
 设置
  Name           = matlab
  Server         = rlm_host
  Description    = matlab
  ServerType     = rlm
  Count          = 50
  Type           = License

$ sacctmgr add resource name=matlab server=rlm_host \
  cluster=pdf allowed=70
 添加资源
  matlab@rlm_host
   Cluster - pdf	70
 设置
  Name           = matlab
  Server         = rlm_host
  Count          = 50
  LastConsumed   = 0
  Flags          = (null)
  Type           = License

$ sacctmgr add resource name=matlab server=rlm_host \
  cluster=fluid allowed=30
 添加资源
  matlab@rlm_host
   Cluster - fluid	30
 设置
  Name           = matlab
  Server         = rlm_host
  Count          = 50
  LastConsumed   = 0
  Flags          = (null)
  Type           = License

现在 sacctmgr 命令将显示许可证的总数。

$ sacctmgr show resource
      Name     Server     Type  Count LastConsumed Allocated ServerType                Flags
---------- ---------- -------- ------ ------------ --------- ---------- --------------------
   nastran  flex_host  License    100            0       100     flexlm
    matlab   rlm_host  License     50            0       100        rlm
$ sacctmgr show resource withclusters
      Name     Server     Type  Count LastConsumed Allocated ServerType    Cluster  Allowed                Flags
---------- ---------- -------- ------ ------------ --------- ---------- ---------- -------- --------------------
   nastran  flex_host  License    100            0       100     flexlm      fluid       50
   nastran  flex_host  License    100            0       100     flexlm        pdf       50
    matlab   rlm_host  License     50            0       100        rlm      fluid       30
    matlab   rlm_host  License     50            0       100        rlm        pdf       70

现在可以使用 scontrol 命令在两个集群上查看已配置的许可证。

# 在集群 "pdf" 上:
$ scontrol show lic
LicenseName=matlab@rlm_host
    Total=35 Used=0 Free=35 Reserved=0 Remote=yes
    LastConsumed=0 LastDeficit=0 LastUpdate=2023-02-28T17:01:44
LicenseName=nastran@flex_host
    Total=50 Used=0 Free=50 Reserved=0 Remote=yes
    LastConsumed=0 LastDeficit=0 LastUpdate=2023-02-28T17:01:44

# 在集群 "fluid" 上:
$ scontrol show lic
LicenseName=matlab@rlm_host
    Total=15 Used=0 Free=15 Reserved=0 Remote=yes
    LastConsumed=0 LastDeficit=0 LastUpdate=2023-02-28T17:01:44
LicenseName=nastran@flex_host
    Total=50 Used=0 Free=50 Reserved=0 Remote=yes
    LastConsumed=0 LastDeficit=0 LastUpdate=2023-02-28T17:01:44

在向远程许可证提交作业时,必须使用名称和服务器。

$ sbatch -L nastran@flex_host script.sh
提交的批处理作业 5172

许可证的百分比和数量可以如下所示进行修改:

$ sacctmgr modify resource name=matlab server=rlm_host set \
  count=200
 修改服务器资源 ...
  matlab@rlm_host
  Cluster - fluid	- matlab@rlm_host
  Cluster - pdf	- matlab@rlm_host

$ sacctmgr modify resource name=matlab server=rlm_host \
  cluster=pdf set allowed=60
 修改服务器资源 ...
  Cluster - pdf	- matlab@rlm_host

$ sacctmgr show resource withclusters
      Name     Server     Type  Count LastConsumed Allocated ServerType    Cluster  Allowed                Flags
---------- ---------- -------- ------ ------------ --------- ---------- ---------- -------- --------------------
   nastran  flex_host  License    100            0       100     flexlm      fluid       50
   nastran  flex_host  License    100            0       100     flexlm        pdf       50
    matlab   rlm_host  License    200            0        90        rlm      fluid       30
    matlab   rlm_host  License    200            0        90        rlm        pdf       60

许可证可以在集群上或全部删除,如下所示:

$ sacctmgr delete resource where name=matlab server=rlm_host cluster=fluid
 删除资源 ...
 删除资源 ...
  Cluster - fluid	- matlab@rlm_host

$ sacctmgr delete resource where name=nastran server=flex_host
 删除资源 ...
  nastran@flex_host
  Cluster - fluid	- nastran@flex_host
  Cluster - pdf	- nastran@flex_host

$ sacctmgr show resource withclusters
      Name     Server     Type  Count LastConsumed Allocated ServerType    Cluster  Allowed                Flags
---------- ---------- -------- ------ ------------ --------- ---------- ---------- -------- --------------------
    matlab   rlm_host  License    200            0        60        rlm        pdf       60

从 Slurm 23.02 开始,新增的 Absolute 标志可用,指示每个集群允许的许可证值应被视为绝对许可证计数,而不是百分比。

以下是使用此标志进行许可证管理的一些简要示例。

$ sacctmgr -i add resource name=deluxe cluster=fluid,pdf count=150 allowed=70 \
  server=flex_host servertype=flexlm flags=absolute
 添加资源
  deluxe@flex_host
   Cluster - fluid	70
   Cluster - pdf	70
 设置
  Name           = deluxe
  Server         = flex_host
  Description    = deluxe
  ServerType     = flexlm
  Count          = 150
  Flags          = Absolute
  Type           = Unknown

$ sacctmgr show resource withclusters
      Name     Server     Type  Count LastConsumed Allocated ServerType    Cluster  Allowed                Flags
---------- ---------- -------- ------ ------------ --------- ---------- ---------- -------- --------------------
    deluxe  flex_host  License    150            0       140     flexlm      fluid       70             Absolute
    deluxe  flex_host  License    150            0       140     flexlm        pdf       70             Absolute

$ sacctmgr -i update resource deluxe set allowed=25 where cluster=fluid
 修改服务器资源 ...
  Cluster - fluid	- deluxe@flex_host

$ sacctmgr show resource withclusters
      Name     Server     Type  Count LastConsumed Allocated ServerType    Cluster  Allowed                Flags
---------- ---------- -------- ------ ------------ --------- ---------- ---------- -------- --------------------
    deluxe  flex_host  License    150            0        95     flexlm      fluid       25             Absolute
    deluxe  flex_host  License    150            0        95     flexlm        pdf       70             Absolute

这也可以通过在 slurmdbd.conf 中添加 AllResourcesAbsolute=yes(并重启 SlurmDBD 以使更改生效)来设定为所有新创建许可证的默认值。

动态许可证

从 Slurm 23.02 开始,远程许可证的 LastConsumed 字段旨在定期更新来自许可证服务器的活动使用计数。以下是 FlexLM 的 lmstat 命令的示例脚本 - 可以轻松构建类似的脚本以适用于其他许可证管理堆栈。

#!/bin/bash

set -euxo pipefail

LMSTAT=/opt/foobar/bin/lmstat
LICENSE=foobar

consumed=$(${LMSTAT} | grep "Users of ${LICENSE}"|sed "s/.*Total of \([0-9]\+\) licenses in use)/\1/")

sacctmgr -i update resource ${LICENSE} set lastconsumed=${consumed}

当通过 sacctmgr 更改 LastConsumed 值时,更新会自动推送到 Slurm 控制器。它们将使用此值计算 LastDeficit 值 - 该值指示从集群的角度来看有多少许可证“消失”,并需要暂时保留。

例如,在此集群中可用 100 个“foobar”许可证,并且我们在“blackhole”集群上分配了 80 个:

$ sacctmgr add resource foobar count=100 flags=absolute cluster=blackhole allowed=80
 添加资源
  foobar@slurmdb
   Cluster - blackhole	80
 设置
  Name           = foobar
  Server         = slurmdb
  Description    = foobar
  Count          = 100
  Flags          = Absolute
  Type           = Unknown
您想要提交更改吗?(您有 30 秒的时间来决定)
(N/y): y
$ scontrol show license
LicenseName=foobar@slurmdb
    Total=80 Used=0 Free=80 Reserved=0 Remote=yes
    LastConsumed=0 LastDeficit=0 LastUpdate=2023-02-28T16:36:55

现在,我们的 cron 作业进来并将 LastConsumed 值更新为 30,而集群尚未将任何许可证分配给作业:

$ sacctmgr -i update resource foobar set lastconsumed=30
 修改服务器资源 ...
  foobar@slurmdb
  Cluster - blackhole	- foobar@slurmdb
$ scontrol show license
LicenseName=foobar@slurmdb
    Total=80 Used=0 Free=70 Reserved=0 Remote=yes
    LastConsumed=30 LastDeficit=10 LastUpdate=2023-02-28T16:39:27

请注意,集群现在计算出有 10 个许可证的赤字,并注意到它目前只能调度最多 70 个许可证。集群知道目前有多达 20 个许可证被保留给其他集群或外部使用。然而,由于 LastConsumed 设置为 30,这意味着还有 10 个许可证“失控”,其使用情况无法被计算。因此,集群必须不将这些许可证分配给任何待处理作业,因为作业可能无法获得所需的许可证。

如果进一步更新(可能通过 cron 驱动)现在将 LastConsumed 计数减少到 10,则赤字现在被认为已经消失,集群将再次使所有 80 个分配的许可证可用:

$ sacctmgr -i update resource foobar set lastconsumed=20
 修改服务器资源 ...
  foobar@slurmdb
  Cluster - blackhole	- foobar@slurmdb
$ scontrol show license
LicenseName=foobar@slurmdb
    Total=80 Used=0 Free=80 Reserved=0 Remote=yes
    LastConsumed=20 LastDeficit=0 LastUpdate=2023-02-28T16:44:26

最后修改于 2024 年 5 月 9 日