背景
在芯片设计和HPC行业EDA软件的许可证是很昂贵的数据资源,如何高效利用许可证以及计算资源是系统管理员需要认真思考的问题。
商用解决方案
LSF是芯片和HPC行业流行的调度方案,LSF产品家族包含了许可证调度的功能。它提供了许可证管理和调度功能,且和LSF深度集成。通过两阶段调度保证每个派发的作业都能获得许可证,从而提高了许可证和计算资源的使用效率。而且还提供了按项目或集群方式分配许可证使用额度的功能。
自助解决方案
如果预算有限,也可以基于 LSF 的 elim 机制,自助解决。
elim 是LSF提供的定制外部资源机制,它允许管理员自定义外部资源,并通过LSF来进行调度和管理。
基于 elim 机制自助解决方案包括以下几个步骤:
1. 确定要管理的许可证,列出许可证的名称。
2. 在LSF配置文件中定义与各许可证对应的资源名称,以及这些资源可用的位置。
3. 按 elim 规范,编写 elim 程序。
4. 用户在提交任务时需要在 rusage 中指定资源数量。
下面详细说明各步骤的要点:
步骤1 :根据业务使用的EDA应用软件,找到软件需要的许可证名称。如果不清楚的话,可以问EDA软件厂商的技术支持人员,或者通过查看许可证服务器上许可证签出记录。
步骤2 :需要修改的LSF配置文件有两个:
1. 在 lsf.shared 文件的资源定义区段中定义每个许可证对应的资源。示例如下:
Begin Resource
RESOURCENAME TYPE INTERVAL INCREASING CONSUMABLE DESCRIPTION # keywords
lic1 Numeric 30 N () (EDA app1 license)
lic2 Numeric 30 N () (EDA app1 license)
End Resource
lic1/2 是自定义的资源名称,分别对应EDA应用1/2 的许可证;30 表示数据采样间隔为30秒;你需要根据你的实际情况进行调整。
2. 在 lsf.cluster 文件中定义资源可用的位置,也就是在哪些计算主机上可以获取(签出)许可证资源。示例如下:
Begin ResourceMap
RESOURCENAME LOCATION
lic1 ([all])
lic2 ([all])
End ResourceMap
lic1/2 是自定义的资源名称,all 表示在所有计算节点上都可以获取(签出)许可证资源。如果某个许可证只能在特定的主机上签出,就需要将 all 替换为特定的主机列表。假如lic2 只能在 host1 和 host2上签出,则相应的配置就需要修改为
lic2 ([host1 host2])
步骤 3 :编写 elim 程序。你可以使用任何语言来编写 elim 程序。通常它是一个无限循环程序,按上面的间隔时间输出资源信息。输出格式为:
资源数量 资源1名称 资源1数量 资源2名称 资源2数量 ...
elim 程序的伪代码示例:
import os
import sys
import timedef getResource()### 从许可证服务器获取指定许可证信息license['lic1'] = lic1_numlicense['lic2'] = lic2_numreturn licensewhile True:license = getResource()print(f"{len(license.keys())} { ' '.join([ f'{k} {v}' for k,v in license.items()]) }")time.sleep(30)
需要将 elim 程序拷贝到 $LSF_SERVERDIR 下并设置可执行权限。
步骤4 :用户提交任务时,需要在 bsub 时指定自定义资源和数量。示例如下:
$ bsub -R rusage[lic1=1] ...
$ bsub -R rusage[lic2=1] ...
这里需要注意几点:
1. elim 程序需要以 elim 作为开头,可以根据需要加上不同的后缀以便区分,比如 elim.lic
2. LSF 配置文件修改后需要运行以下两个命令才能激活。
lsadmin reconfig
badmin mbdrestart
3. 由于EDA应用不一定全都通过LSF来运行,或者用户在提交任务时可能没有指定 rusage ,elim 在返回许可证数量时就不能以许可证的采购数量返回,否则会导致任务被LSF派发运行后获取不到许可证的问题。而返回实际空闲许可证就会导致LSF不派发任务,但实际还有空闲许可证,从而浪费许可证的情况。可行的做法是获取实际空闲许可证,以及LSF保留的许可证,将二者相加后返回。