不少LSF用户都有这样的疑问:应该创建几个LSF队列,每个队列该如何设置参数?
要回答这个问题,需要对LSF队列概念、参数、调度策略有一些基本了解,也要了解公司自身业务特点和资源分配需求。
我们先来看一下LSF队列的概念。LSF队列是一个资源策略组合。简单来说,LSF队列定义了“谁”能用“哪些hosts”在“什么样的限制下”来跑计算任务。一个LSF队列至少需要设置这些参数:
-
QUEUE_NAME:队列名
-
DESCRIPTION:队列描述
-
USERS:能向该队列提交作业的用户(组)
-
HOSTS:该队列可以使用的主机(组)
-
PRIORITY:队列优先级
再加上一些资源使用限制和调度策略,就是常用的LSF队列设置了。我们来看一个实际例子:
Begin Queue
QUEUE_NAME = pdq # 队列名称为pdq
USERS = pd_users # 仅限pd_users用户组使用
HOSTS = pd_hosts # 队列使用pd_hosts主机组
PRIORITY = 100 # 队列优先级为100
FAIRSHARE = USER_SHARES[[default,1]] # 启用公平调度策略(Fairshare),各用户具有相同比重
RUNLIMIT = 240:0 # 作业最多运行时长10天
UJOB_LIMIT = 64 # 每用户最多使用64个job slots
DESCRIPTION = For physical design jobs. # 队列描述
End Queue
上面这个例子定义了一个用于接受IC设计流程中“物理设计”计算任务的队列,名为pdq,并限制了用户,以及每个用户在队列上运行的job数(最多64个slots),每个作业最多运行10天(240小时),并通过Fairshare调度策略保证资源公平使用。
这是LSF队列的基本参数,LSF还有很多队列参数用于更复杂的资源限制、作业控制和调度策略这些方面,实际上LSF 10.1在lsb.queues里可以设置的参数多达121个。在本文末尾,我们会附上队列参数列表和用途分类。
了解了LSF基本参数,我们接下来应该怎么划分队列呢?我们应该创建几个队列,分别用于什么目的呢?
这个并没有标准答案。这主要还是根据不同公司自身业务需要、团队情况、项目特点、资源情况来设计队列。
以芯片设计为例,我们可以根据团队来划分队列,例如分为前端FE、后端BE,再结合团队所在地点(假设有上海和北京两个设计团队),可以分为shfe(上海前端)、shbe(上海后端)、bjfe(北京前端)、bjbe(北京后端)这4个队列。也可以按照项目来设置队列,例如芯片1的项目设置一个队列,芯片2的项目设置一个队列。也可以按照使用的工具来设置队列,这些工具对计算资源有特殊需求,例如需要用到大内存。
可能会有人提出疑问,如果按照某种方式(例如按项目)划分了队列,如果再想按照EDA工具进一步划分(设置细粒度的资源需求和资源限制),是不是需要把队列再按工具进行拆分?这当然可以。LSF也提供了另外一种方式,即通过lsb.applications来实现这样的需求,以避免创建出太多的队列。后面我们会专门介绍LSF的application设置。
队列的创建和设置,除了要考虑业务、团队和项目特点,也要考虑资源利用率。既要限制用户和作业资源,也要共享资源。通过LSF的高级调度策略、队列优先级、主机(组)优先级等设置,充分利用计算资源,尽可能提升集群的作业吞吐量和整体内存及CPU利用率。
前面提到LSF 10.1的lsb.queues有多达121个参数可以设置,我们根据这些参数的用途进行了分类,参数详细使用方法可以参考如下链接:
LSF 10.1 lsb.queues参数列表
基本参数 |
|
资源限制参数 |
|
作业控制参数 |
|
作业类型或资源需求参数 |
|
作业运行参数 |
|
调度策略参数 |
|
公平调度(Fairshare)策略参数 |
|
抢占调度(Preemption)策略参数 |
|
预留调度(Reservation)策略参数 |
|
回填调度(Backfill)策略参数 |
|
调度性能调优参数 |
|
容器作业参数 |
|
多集群参数 |
|
Resource Connector参数 |
|
其它参数 |
|
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。