背景
在云上进行高性能计算的客户越来越多,利用云计算资源充足、按需使用、弹性伸缩的特点,客户不仅能快速的得到结果,而且成本很低。为了让客户能快速的部署高性能计算集群,AWS 推出了开源的 ParallelCluster 集群管理软件,该软件可以让客户在数分钟之内部署一个高性能计算集群。ParallelCluster 支持 Torque、Slurm、SGE 等调度引擎,集群的大小可以根据任务数量动态伸缩,而且支持 SPOT 实例,能最大程度的帮助客户降低成本。
在某些高性能计算场景中,客户会同时使用到 CPU 实例和 GPU 实例,这样就需要创建两个 ParallelCluster 集群,比如,一个是 c5.xlarge 集群和一个 p3.2xlarge 实例集群。并且客户的程序通常运行在一个主节点上,这就要求可以在一个主节点上提交任务到任意集群。而 ParallelCluster 则要求到两个集群的主节点上分别提交任务,这种情况下,如果客户要使用 ParallelCluster ,必须需要修改程序,不仅耗时耗力,而且需要改变用户原来的使用习惯,很难快速使用起来。
Slurm +ParallelCluster 多集群解决方案,在两个 ParallelCluster 集群前面增加一个管理节点,通过该管理节点可以提交任务到任意集群,这样,客户的程序可以运行在管理节点上,不需要做任何改变。
这种方案不仅满足了客户多种实例类型的要求,而且保留了 ParallelCluster 弹性伸缩优点,可以支持 SPOT 实例,多个集群可以通过 EFS 共享数据。目前已经有客户通过该方案在 AWS 上进行高性能计算。
Slurm +ParallelCluster 多集群解决方案
Slurm +ParallelCluster 多集群架构如下:
该方案把两个 ParallelCluster 集群的 Slurm accounting 信息存储在一个独立的管理节点(SlurmDBD 所在节点)上,并保存在 MySQL 数据库中,这样在管理节点可以提交任务到任意的集群上。
以下是 Slurm +ParallelCluster 多集群方案详细配置步骤,主要包含以下几个步骤:
使用 ParallelCluster 创建两个 slurm 集群,两个集群通过 EFS 共享数据
创建并配置 Slurm 管理节点
注册第一个 ParallelCluster 集群到管理节点
注册第二个 ParallelCluster 集群到管理节点
检查配置并提交测试任务
创建两个 ParallelCluster 集群
ParallelCluster 的安装步骤在这里不再赘述,在参考资料中有 ParallelCluster 的配置链接。
使用 ParallelCluster 创建两个集群,集群名称分别为 parallelcluster 和 pcluster2,每个节点初始配置为一个 master node 和两个 compute node。
1.创建第一个集群
配置文件中需要增加 EFS 的配置,完整的配置文件参考附录。
[efs customfs]
shared_dir = efs
encrypted = false
performance_mode = generalPurpose
复制代码
创建第一个集群:
88e9fe506815:~ liangmao$ pcluster create parallelcluster
复制代码
2.创建第二个集群
创建第二个集群时,需要在集群配置文件中指定第一个集群的 efs_fs_id,efs_fs_id 需要根据实际情况进行修改。
[efs customfs]
shared_dir = efs
encrypted = false
performance_mode = generalPurpose
efs_fs_id = fs-165884bd
复制代码
创建第二个集群:
88e9fe506815:~ liangmao$ pcluster create pcluster2
复制代码
创建 Slurm 管理节点
Slurm 管理节点需要部署在单独的服务器上,运行 SlurmDBD 进程,并且通过 Munge 进行身份认证,Slurm 管理节点可以使用 pcluster 集群的 master node 创建 AMI,再从 AMI 中创建,这样做有以下几个好处:
不用安装 Munge 和 Slurm,master node 中已经包含。
管理节点的 Slurm 和 Munge 用户的 uid 和 gid 和 pcluster 集群保持一致
不用再额外配置 Munge key,使用 pcluster 创建的 key 即可。
1.使用集群的 master node 创建 AMI
可以在管理控制台上创建 AMI:
2.使用 AMI 创建管理节点
在管理控制台上创建管理节点,使用上一步创建的 AMI。
注意:要把管理节点加入两个 slurm master 的安全组。
另外,两个 slurm master 的安全组需要增加一条规则,允许安全组内的实例互相访问。
3.在管理节点上安装和配置 MySQL
sudo yum install mysql
sudo yum install mysql-server
sudo yum install mysql-devel
service mysqld start
/usr/bin/mysqladmin -u root password <password>
chkconfig –add /etc/init.d/mysqld
chkconfig mysqld on
mysql -u root -p
create database slurm_acct_db;
create user ‘slurm’@’localhost’ identified by ‘<password>’;
create user ‘slurm’@’%’ identified by ‘<password>’;
GRANT ALL PRIVILEGES ON slurm_acct_db.* TO ‘slurm’@’localhost’;
GRANT ALL PRIVILEGES ON slurm_acct_db.* TO ‘slurm’@’%’ ;
复制代码
4.修改 SlurmDBD 配置文件/opt/slurm/etc/slurmdbd.conf
[ec2-user@ip-172-31-30-63 ~]$ more /opt/slurm/etc/slurmdbd.conf
\#
\# slurmDBD info
\#DbdAddr=192.168.80.13
DbdHost=localhost
\#DbdBackupHost=node14
DbdPort=6819
SlurmUser=slurm
\#MessageTimeout=60
\#DebugLevel=6
\#DefaultQOS=normal
**LogFile=/var/log/SlurmdbdLogFile**
PidFile=/var/run/slurmdbd.pid
PluginDir=/opt/slurm/lib/slurm
\#PrivateData=accounts,users,usage,jobs
\#TrackWCKey=yes
\#
\# Database info
**StorageType=accounting_storage/mysql**
**StorageHost=localhost**
**StoragePort=3306**
**StoragePass=<password>**
**StorageUser=slurm**
**StorageLoc=slurm_acct_db**
复制代码
5.启动 slurmdbd 进程
\#/opt/slurm/sbin/slurmdbd
复制代码
可以查看日志文件/var/log/SlurmdbdLogFile 是否有报错。
[2019-05-27T06:45:59.410] error: Processing last message from connection 10(172.31.23.185) uid(496)
[2019-05-27T06:45:59.494] error: Processing last message from connection 10(172.31.23.185) uid(496)
[2019-05-27T13:24:08.546] error: Problem getting jobs for cluster test
[2019-05-27T14:45:34.646] error: Problem getting jobs for cluster test
[2019-05-28T02:45:39.496] error: Database settings not recommended values: innodb_buffer_pool_size innodb_log_file_size innodb_lock_wait_timeout
[2019-05-28T02:45:39.537] error: chdir(/var/log): Permission denied
[2019-05-28T02:45:39.537] chdir to /var/tmp
**[2019-05-28T02:45:39.538] slurmdbd version 18.08.6-2 started**
复制代码
注:日志建议修改 innodb 的参数 innodb_buffer_pool_size innodb_log_file_size innodb_lock_wait_timeout,可以按实际要求修改。
6.修改/opt/slurm/etc/slurm.conf
测试中发现要在管理节点上执行 slurm 相关命令,会检查 slurm.conf 文件中的配置。因管理节点没有集群,可以把 ClusterName 和 ControlMachine 改成任意一个名称和地址,以免和另外两个集群冲突,并注释最后两行配置。
ClusterName=dummy
ControlMachine=dummyip
…
\#include slurm_parallelcluster_nodes.conf
\#PartitionName=compute Nodes=ALL Default=YES MaxTime=INFINITE State=UP
复制代码
注册第一个集群到管理节点
1.修改 master node slurm.conf 配置文件
修改/opt/slurm/etc/slurm.conf 配置,主要是以下几个配置,其中 ip-172-31-30-63 为管理节点的主机名。
**ClusterName=parallelcluster**
ControlMachine=ip-172-31-20-39
\# JobComp
**JobCompType=jobcomp/mysql**
**JobCompHost=ip-172-31-30-63**
**JobCompPort=3306**
**JobCompPass=<password>**
**JobCompUser=slurm**
**JobCompLoc=slurm_acct_db**
\#
\# ACCOUNTING
JobAcctGatherType=jobacct_gather/linux
\#JobAcctGatherFrequency=30
\#
**AccountingStorageType=accounting_storage/slurmdbd**
**AccountingStorageHost=ip-172-31-30-63**
复制代码
2.重启 slurmctld 进程
[root@ip-172-31-20-39 ~]# /etc/init.d/slurm stop
stopping slurmctld: [ OK ]
slurmctld is stopped
slurmctld is stopped
[root@ip-172-31-20-39 ~]# /etc/init.d/slurm start
starting slurmctld: [ OK ]
复制代码
3.查看/var/log/slurmctld.log 日志是否有报错
4.注册集群到管理节点
\#sacctmgr add cluster parallelcluster
复制代码
5.查看是否注册成功
用 sacctmgr list cluster 查看 ControlHost,ControlPort 的信息是否为空,如果为空,表示注册失败,可以尝试重启 slurmctld。
注册成功的日志如下:
检查 /var/log/slurmctld.log:
[2019-05-27T14:35:17.062] cons_res: select_p_node_init
[2019-05-27T14:35:17.062] cons_res: preparing for 1 partitions
[2019-05-27T14:35:17.062] Running as primary controller
**[2019-05-27T14:35:17.062] Registering slurmctld at port 6817 with slurmdbd.**
[2019-05-27T14:35:17.326] No parameter for mcs plugin, default values set
[2019-05-27T14:35:17.326] mcs: MCSParameters = (null). ondemand set.
复制代码
注册第二个集群到管理节点
1.修改 master node slurm.conf 配置文件
修改/opt/slurm/etc/slurm.conf 配置,主要是以下几个配置,其中 ip-172-31-30-63 为管理节点的主机名。
**ClusterName=pcluster2**
ControlMachine=ip-172-31-23-185
\# JobComp
**JobCompType=jobcomp/mysql**
**JobCompHost=ip-172-31-30-63**
**JobCompPort=3306**
**JobCompPass=slurm**
**JobCompUser=slurm**
**JobCompLoc=slurm_acct_db**
\#
\# ACCOUNTING
JobAcctGatherType=jobacct_gather/linux
\#JobAcctGatherFrequency=30
\#
**AccountingStorageType=accounting_storage/slurmdbd**
**AccountingStorageHost=ip-172-31-30-63**
复制代码
2.重启 slurmctld 进程
[root@ip-172-31-20-39 ~]# /etc/init.d/slurm stop
stopping slurmctld: [ OK ]
slurmctld is stopped
slurmctld is stopped
[root@ip-172-31-20-39 ~]# /etc/init.d/slurm start
starting slurmctld: [ OK ]
复制代码
3.查看/var/log/slurmctld.log 日志是否有报错
4.注册集群到管理节点
\#sacctmgr add cluster pcluster2
复制代码
5.查看是否注册成功
用 sacctmgr list cluster 查看 ControlHost,ControlPort 的信息是否为空,如果为空,表示注册失败,可以尝试重启 slurm。
注册成功的日志如下:
检查 /var/log/slurmctld.log:
[2019-05-27T14:42:31.654] cons_res: select_p_reconfigure
[2019-05-27T14:42:31.654] cons_res: select_p_node_init
[2019-05-27T14:42:31.654] cons_res: preparing for 1 partitions
[2019-05-27T14:42:31.654] Running as primary controller
**[2019-05-27T14:42:31.654] Registering slurmctld at port 6817 with slurmdbd.**
[2019-05-27T14:42:31.912] No parameter for mcs plugin, default values set
[2019-05-27T14:42:31.912] mcs: MCSParameters = (null). ondemand set.
复制代码
运行测试任务
登陆管理节点,执行以下脚本:
可以在管理节点上看到两个集群,并且可以把测试命令 hostname 发送到不同的集群。
作者介绍:廖良茂,AWS 解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,在国内推广 AWS 云平台技术和各种解决方案,目前专注于高性能计算领域。在加入 AWS 之前就职于微软、甲骨文公司,熟悉数据库、备份和容灾等解决方案。
本文转载自 AWS 技术博客。
原文链接:https://amazonaws-china.com/cn/blogs/china/power-high-performance-computing-in-the-cloud-with-slurm-parallelcluster-multi-cluster-solution/
评论