许可证指南
许可证概述
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 日