LSF实践专题(30):在LSF集群通过Guaranteed SLA进行资源定向规划

目录

设置标记——service class

设置标记对应的资源池

对资源池的实际应用

总结


集群里的计算资源比较抢手时,我们希望为一些未来要执行的、需要周期性运行的重要作业或工作预留一些计算资源,让这些作业不会因为其他低优先级的作业更早地占用了资源,而无法及时开始执行。

对于这类需求,我们之前介绍过的preemption抢占功能以及reservation资源预留功能都可以在一定程度上满足,但是,这两个功能都是基于队列实现的。

我们可以给不同的部门或者不同的工作组设置不同的队列,让他们将作业提交到相应队列里。但是有的时候,同一个部门或工作组的作业也有不同的目的和规划:有些是常规作业,有些是需要及时运行的高优先级作业。

对于这种情况,如果我们为同一个部门或者工作组设置多个不同的队列,虽然可以应对,但是会带来集群结构更加复杂、不便于管理以及使用中容易出现混乱等弊端。

通过LSF中的Guanranteed SLA功能,可以为指定队列中带有特殊标记的作业预留一部分资源,即使是来自于同一个队列,但是没有对应标记的作业,也无法使用这些预留资源。

设置标记——service class

在配置文件lsb.serviceclasses里面,可以定义service class,我们可以用这些service class将不同的作业应用进行分类,并对这些类别进行不同的管理和设置。

设置service class后,我们可以在提交作业时,使用bsub的-sla选项来为作业指定属于哪一个service class。例如:

图片

我们可以通过bjobs -l看到,作业的基础信息中会显示出作业所属的service class:

图片

我们可以为每一个service class设置一些过滤器,只允许提交到某个队列以及属于某个project的作业,才可以指定这个service class。

图片

在service class的配置里面,将GOALS设置为[guarantee],然后在ACCESS_CONTROL中配置只有指定的队列和projects中的作业(也可以只限制一个),才可以绑定到当前service class。

如果不写ACCESS_CONTROL,则没有限制,任何作业都可以绑定到当前的service class。

使用bsla命令,可以查看每个sla的设置情况。

图片

因为sla1设置了ACCESS_CONTROL为queues[q1]和projects[proj1],所以,只有同时属于队列q1和指定了proj1的作业,才可以用bsub的-sla命令绑定到sla1上,否则会被拒绝。

图片

我们还可以在service class中设置auto attach的属性,有了这个属性,所有满足某个service class全部ACCESS_CONTROL的作业,都会自动绑定到这个service class下。

例如,当前的sla1没有设置auto attach,所以,我们即使提交了一个满足ACCESS_CONTROL的作业,也并不会绑定到sla1上:

图片

现在我们为sla1配置上auto attach,并且执行badmin mbdrestart让其生效:

图片

图片

图片

这次我们再提交一个作业到队列q1并且指定proj1后,这个作业就自动绑定到sla1上了,不需要专门通过-sla选项来指定。

设置标记对应的资源池

接下来我们就可以为不同的service class类别来设置资源池,准备各种计算资源的预留计划了。

在lsb.resources配置文件中,通过GuaranteedResourcePool字段来定义资源池,我们可以为每一个资源池划分一组计算资源,然后分配给一个或多个service class使用,只有这些service class绑定的作业才可以根据分配方案使用这些资源,其他作业不能随便使用。

图片

在每个资源池中,基础的参数有以下几个。

🔺 NAME:指定资源池的名称。

🔺 TYPE:表示资源池中的是哪种资源。可以配置的内容有slots,hosts和package。

其中,slots是指将指定数量的slots作为资源放入资源池,并且将这些slots在各个service class之间进行分配;hosts指的是将整个host作为资源放入资源池,分配时也是以host为单位整个分配;package比较特殊,需要用户自己指定一个多种资源的组合,每一份这个组合就是一份资源,分配时也是以每份资源为单位。例如:

图片

我们指定了type为package,在package 后就是每个package的标准,这里设置的是2个slots加上4096MB内存组成一个package,假设当前的机器有32个slots,64GB内存,那么就是16个package,如果有32个slots和128GB内存,虽然内存比16*4GB多,但是slots只有16*2,所以也仍然只是16个package,多余的64GB内存则不在资源池里面,可以随意使用。

凡是在资源池里面分配给不同service class的计算资源,普通的没有绑定对应service class的作业都不能使用,但是没有在资源池里的资源则不受限制。

🔺 HOSTS:是指从哪些host上抽出对应的资源进行分配,如果指定的host上面的资源是多余分配到资源池的,比如host上有32个slots,但是我们只给sla1分配16个,sla2分配8个,那剩下的8个则不在资源池里,属于可以自由使用的资源,不论是绑定了service class的作业,还是没有绑定的作业都可以使用。可以指定多个host或者hostgroup群组。

🔺 DISTRIBUTION:用于设定分配配额和比例,可以像图中一样直接写分配的配额个数,也可以写成百分比的形式,对资源池里所有的资源按照百分比进行分配,例如:

图片

🔺 RES_SELECT:是辅助HOSTS来选择从哪些节点上抽取资源放入资源池的,可以在HOSTS指定的范围内抽取有特定资源的节点。

🔺 LOAN_POLICIES:用于指定借用规则。如果不配置这个参数,资源池内分配给不同service  class的资源只能由绑定了对应service class的作业使用。如果配置了LOAN_POLICIES,则可以让指定的队列中的作业在对应service class没有pending作业的情况下,借用资源池里面的资源,用以在绑定的service class的作业频率比较低的环境中,更加有效地利用集群内的资源。

除了指定哪些队列可以借用,还可以通过RETAIN和DURATION来进一步限制借用行为。RETAIN可以配置保留多少资源,比如,资源池里分配的资源是10个slots,LOAN_POLICIES配置了RETAIN[5],则表示最多可以借用5个slots出去,也就是必须保证资源池里有5个slots用于指定的service class。DURATION则表示如果想要借用资源池的资源,借用的作业必须指定runlimit,并且runlimit的时长必须小于DURATION中定义的时间长度。

对资源池的实际应用

下面我们来看一下实际的例子。 

假设我们的资源池配置如下:

图片

通过bresources -lmg可以看到当前生效的资源池有哪些,如下所示:

图片

我们看到,因为在HOSTS中指定了malpha1,所以只有这台机器的资源会被用于资源池,这台机器上一共是32个slots,所以RESOURCE SUMMARY中显示TOTAL是32,因为没有slots被作业使用,所以FREE也是32。

而GUARANTEE CONFIGURED显示的是分配给所有service class的slots的数量总和,因为我们分配了16个给sla1,8个给sla2,所以这里显示24。

现在我们先提交一批没有绑定service class的作业。

图片

我们看到,32个作业只能运行8个,没有运行的作业,pending reason显示是因为slots被预留给了guarantee。

我们再看一下bresources -lmg的显示:

图片

因为被没有绑定service class的作业使用了8个slots,所以FREE变成了24,但是绑定的service class没有USED。

我们再投几个作业到sla2:

图片

我们看到,sla2的ACCESS CONTROL是队列q2,并且没有配置auto attach,因此我们提交作业到q2并且用-sla指定到sla2上:

图片

绑定到sla2的作业仍然只能运行8个,因为我们只分配了8个slots给sla2:

图片

我们看一下此时的bresources -lmg:

图片

可以看到sla2对应的地方,显示GUARANTEE USED是8。

现在我们把没有绑定sla的作业杀掉,那么sla2上的作业同样可以使用没有分配给sla1的那部分资源。

图片

现在sla2的作业又拿到了8个slots,全部运行起来,即bresources -lmg:

图片

现在,sla2的GUARANTEE USED仍然显示是8,但是TOTAL USED显示16,表示sla2的作业使用了8个分配给sla2的slots,加上8个没有分配给任何service class的slots。

现在我们将作业杀掉,并且给资源池加上LOAN_POLICIES:

图片

在LSF10.1的最新版本的SPK中,RETAIN被重命名为IDLE_BUFFER,使用方法是一样的,并且RETAIN也仍然有效,但是在重启mbatchd服务的时候会收到一个提示信息,表示RETAIN已经改为了IDLE_BUFFER。

图片

我们看到,配置了q3中的作业可以借用资源池中分配但未使用的资源,但是加入了DURATION[10]和IDLE_BUFFER[4]的限制。

我们先向队列q3提交一批作业:

图片

因为没有runlimit,所以仍然只运行了8个作业,没有借用成功,我们再提交一批带有runlimit 10以内的作业到q3:

图片

这一次运行了20个作业,加上刚才的8个,一共用了28个slots。我们看一下bresources -lmg:

图片

我们看到现在FREE变为了4个,但是GUARANTEE USED是0,因为都是被没有绑定service class的作业借用的,剩下了4个是因为IDLE_BUFFER配置了4,即最少保留4个slots不被借用出去。

总结

通过Guaranteed SLA,管理员可以对集群内的资源做更加细致和指向性的管理,让集群内的资源得到更加合理和高效的利用。

欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。

HPC常青园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ivyent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值