单个LSF集群可以支持数万个以上计算节点,完全能满足绝大多数计算集群的需要。LSF同时还提供了多集群(Multi-Cluster)的功能,可以将分散在不同地域的多个LSF集群组成逻辑上一个统一的计算集群,从而实现计算资源的充分利用。国内目前使用LSF多集群的案例并不多,但在国外已经有不少实际案例。例如欧洲的飞机制造商Airbus,就使用了多达几十个集群的LSF多集群。在考虑使用LSF多集群时,除了LSF层面的设置,还需要考虑存储、统一账号管理、网络带宽等问题,本文暂不涉及这些方面。
先来了解一下LSF多集群的一些基本概念。
提交集群:是指根据需要会将作业转发到其它LSF集群去运行的集群,也称为本地集群(local cluster)。
执行集群:是指实际运行提交集群转发过来的作业的集群,也称为远端集群(remote cluster)。
转发模式:LSF有两种实现多集群的模式,分别是转发模式(forwarding model)和租赁模式(leasing model)。转发模式是指将作业从本地集群发送到远端集群去执行;租赁模式是指将远端集群的节点加入到本地集群来运行作业,看起来像是本地集群增加了远端集群的部分节点一样。LSF已经逐渐放弃了租赁模式,在未来版本将会彻底废弃,所以本文只介绍转发模式。
LSF多集群的配置和使用过程
1. 在lsf.conf配置文件中,确保各个集群的LSF daemon监听端口相同(可以根据实际情况调整监听端口的值,大多数情况下直接使用默认值就可以):
-
LSF_LIM_PORT
-
LSF_RES_PORT
-
LSB_MBD_PORT
-
LSB_SBD_PORT
2. 在各个集群的lsf.shared文件中,需要配置各个集群名和管理节点名:
Begin Cluster
ClusterName Servers
lsfcluster1 (host1 host2)
lsfcluster2 (hosta hostb)
End Cluster
注释:
-
上述配置可以写两个或更多个LSF集群;
-
默认情况下,在lsf.shared文件中是没有Servers这一列的,需要手工添加;
-
Servers一列配置的是各个LSF集群的管理节点,填写的主机名需要在各个集群都能被正确解析。
3. 在提交集群(lsfcluster1)配置发送队列:
Begin Queue
PRIORITY = 30
QUEUE_NAME = sendqueue
USERS = all
# HOSTS = none
HOSTS = host1 host2
SNDJOBS_TO = recvqueue@lsfcluster2
DESCRIPTION = the queue that sends jobs to remote cluster
End Queue
注释:
-
队列名称可以任意填写;
-
SNDJOBS_TO = recvqueue@lsfcluster2表示作业将会被发送到lsfcluster2集群的recvqueue队列运行;
-
如果HOSTS = none,表示发到这个队列的作业都会被转发到lsfcluster2运行,即本地集群不为该队列提供任何计算节点;如果为HOSTS配置了具体的节点,作业会优先在这些节点上运行,只有当这些节点没有空闲slots时,作业才会被转发到远端lsfcluster2集群去运行。
4. 在执行集群(lsfcluster2)配置接收队列:
Begin Queue
QUEUE_NAME = recvqueue
PRIORITY = 40
NICE = 10
USERS = all
HOSTS = all
RCVJOBS_FROM = lsfcluster1
DESCRIPTION = the queue that receives jobs from remote cluster
End Queue
注释:
-
队列名称需要与提交集群lsfcluster1上的队列设置保持一致(lsfcluster1上发送队列设置了SNDJOBS_TO = recvqueue@lsfcluster2,因此lsfcluster2的接收队列名需要是recvqueue);
-
RCVJOBS_FROM = lsfcluster1,表示接受来自lsfcluster1集群的作业;
-
执行集群本地也可以提交作业到这个队列运行。
5. 配置生效后可以用lsclusters和bclusters命令查看各集群状态:
在提交集群lsfcluster1查看状态:
$ lsclusters
CLUSTER_NAME STATUS MASTER_HOST ADMIN HOSTS SERVERS
lsfcluster1 ok host1 lsfadmin 6 4
lsfcluster2 ok hosta lsfadmin 2 2
$ bclusters
[Job Forwarding Information ]
LOCAL_QUEUE JOB_FLOW REMOTE CLUSTER STATUS
sendqueue send recvqueue lsfcluster2 ok
在执行集群lsfcluster2查看:
$ lsclusters
CLUSTER_NAME STATUS MASTER_HOST ADMIN HOSTS SERVERS
lsfcluster2 ok hosta lsfadmin 2 2
lsfcluster1 ok host1 lsfadmin 6 4
$ bclusters
[Job Forwarding Information ]
LOCAL_QUEUE JOB_FLOW REMOTE CLUSTER STATUS
recvqueue recvqueue - lsfcluster1 ok
注释:当bclusters输出状态为ok的时候,表示两个集群连通正常。
6. 默认情况下,lshosts和lsload命令不显示对方集群的节点信息,如果希望lshosts和lsload命令可以看到对方集群的节点,只要在lsf.cluster.<cluster_name>文件进行如下配置即可:
(假设修改的是lsfcluster1集群的lsf.cluster.lsfcluster1文件)
Begin RemoteClusters
CLUSTERNAME EQUIV
lsfcluster2 Y
End RemoteClusters
这样配置后,在lsfcluster1集群中运行lshosts和lsload命令就能看到lsfcluster2集群的节点信息了。
查看本地集群节点信息:
$ lshosts lsfcluster1
HOST_NAME type model cpuf ncpus maxmem maxswp server RESOURCES
host1 X86_64 PC6000 116.1 8 15.5G 5.9G Yes (mg awshost)
host2 X86_64 PC6000 116.1 8 15.5G 5.9G Yes (bigmem awshost)
host3 X86_64 PC6000 116.1 8 7.5G 5.9G Yes (rhel6)
host4 X86_64 PC6000 116.1 8 7.5G 5.9G Yes (bigmem rh30)
$ lsload lsfcluster1
HOST_NAME status r15s r1m r15m ut pg ls it tmp swp mem
host1 ok 0.0 0.0 0.1 0% 0.0 1 179 39G 5.9G 7G
host2 ok 0.0 0.0 0.1 0% 0.0 0 252 39G 5.9G 7G
host3 ok 0.0 0.0 0.1 0% 0.0 1 0 26G 5.9G 14.7G
host4 ok 0.0 0.0 0.1 0% 0.0 0 253 48G 5.9G 14.9G
查看远端集群节点信息:
$ lshosts lsfcluster2
HOST_NAME type model cpuf ncpus maxmem maxswp server RESOURCES
hosta X86_64 Intel_EM 60.0 16 46.9G 63.9G Yes (rh30)
hostb X86_64 Intel_EM 60.0 8 47.1G - Yes ()
$ lsload lsfcluster2
HOST_NAME status r15s r1m r15m ut pg ls it tmp swp mem
hosta ok 0.0 0.0 0.0 0% 0.0 0 65 484G 63.9G 45G
hostb ok 0.0 0.5 0.2 1% 0.0 1 3 342G 0M 39.7G
查看所有集群的全部节点信息:
$ lshosts
HOST_NAME type model cpuf ncpus maxmem maxswp server RESOURCES
hosta X86_64 Intel_EM 60.0 16 46.9G 63.9G Yes (rh30)
hostb X86_64 Intel_EM 60.0 8 47.1G - Yes ()
host1 X86_64 PC6000 116.1 8 15.5G 5.9G Yes (mg awshost)
host2 X86_64 PC6000 116.1 8 15.5G 5.9G Yes (bigmem awshost)
host3 X86_64 PC6000 116.1 8 7.5G 5.9G Yes (rhel6)
host4 X86_64 PC6000 116.1 8 7.5G 5.9G Yes (bigmem rh30)
$ lsload
HOST_NAME status r15s r1m r15m ut pg ls it tmp swp mem
hosta ok 0.0 0.0 0.0 0% 0.0 0 65 484G 63.9G 45G
hostb ok 0.0 0.5 0.2 1% 0.0 1 3 342G 0M 39.7G
host1 ok 0.0 0.0 0.1 0% 0.0 1 179 39G 5.9G 7G
host2 ok 0.0 0.0 0.1 0% 0.0 1 0 26G 5.9G 14.7G
host3 ok 0.0 0.0 0.1 0% 0.0 0 253 48G 5.9G 14.9G
host4 ok 0.0 0.0 0.1 0% 0.0 0 253 39G 5.9G 7G
7. 提交作业测试:
在提交集群lsfcluster1向发送队列sendqueue提交一个作业:
$ bsub -q sendqueue sleep 10000
Job <1234> is submitted to queue <sendqueue>.
$ bjobs -l 1234
Job <1234>, User <lsfadmin>, Project <default>, Status <RUN>, Queue <sendqueue>, Comman
d <sleep 10000>
Sat Jan 15 14:27:00: Submitted from host <host1>,
CWD </lsf/lsfcluster1/conf>;
Sat Jan 15 14:31:26: Job <1234> forwarded to cluster <lsfcluster2> as Job <4321>;
Sat Jan 15 14:31:27: Started 1 Task(s) on Host(s) <hosta@lsfcluster2>, Allo
cated 1 Slot(s) on Host(s) <hosta@lsfcluster2>, Execut
ion Home </home/lsfadmin>, Execution CWD <lsf/lsfcluster1/conf>;
在执行集群查看该作业运行情况,注意在执行集群该作业的JOB ID是4321:
$ bjobs -l 4321
Job <4321>, User <lsfadmin>, Project <default>, Status <RUN>, Queue <recvqueue>, Comman
d <sleep 10000>
Sat Jan 15 15:42:36: Submitted from host <host1@lsfcluster1:1234>, CWD </lsf/lsfcluster1/conf>;
Sat Jan 15 15:42:36: Job <1234> of cluster <lsfcluster1> accepted as Job <4321>;
Sat Jan 15 15:42:37: Started 1 Task(s) on Host(s) <hosta>, Allocated 1 Slot
(s) on Host(s) <hosta>, Execution Home </home/lsfadmin>, E
xecution CWD </lsf/lsfcluster1/conf>;
可以发现,lsfcluster1的sendqueueu队列里的作业1234被转发到lsfcluster2的recvqueue队列执行了,在lsfcluster2该作业的作业号是4321。
至此,我们配置了一个基本的LSF多集群并验证了其基本使用。
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。