环境准备
系统:centos7.6
slurm版本:19.05.2-1
NFS服务端、NIS服务端、slurmctld、slurmdbd、slurmd部署在control节点,slurmd部署在compute[1-2],数据库部署在compute2节点。
配置centos环境
配置网卡开机自启
# 将ONBOOT=no这一项改为ONBOOT=yes$ vim etc/sysconfig/network-scripts/ifcfg-ens33$ service network restart
配置DNS
$ vim etc/NetworkManager/NetworkManager.conf# 在[main]下,添加dns=no
添加DNS地址
$ vim etc/resolv.conf# 添加 namesever 8.8.8.8# 添加 nameserver 114.114.114.114
关闭防火墙
$ systemctl disable firewalld
关闭selinux
$ vi etc/selinux/config# 将SELINUX的值设置为disabled,下次开机则不会自启
配置ssh免密登录
# 安装ssh服务$ yum install openssl openssh-server -y# 配置ssh服务$ vim /etc/ssh/sshd_config# 设置PermitRootLogin=yes# 设置PasswordAuthentication=yes# 设置PubkeyAuthentication=yes# 生成密钥对$ ssh-keygen -t rsa# 导入公钥$ cat id_rsa.pub >> ~/.ssh/authorized_keys# 注意.ssh文件夹700权限和文件.ssh/authorized_keys的600权限# 重启sshd服务$ systemctl restart sshd# 克隆机器、配置ip、hostname、hosts# 克隆2台机器作为compute[1,2],克隆的机器注意mac要不一样,否则会出现不能上网问题。
配置固定ip
$ vim etc/sysconfig/network-scripts/ifcfg-ens33# 修改BOOTPROTO=static# 修改IPADDR=192.168.145.100# 修改NETMASK=255.255.255.0# 修改GATEWAY=192.168.145.2
配置hosts文件
$ vim etc/hosts# 增加 192.168.145.100 control# 增加 192.168.145.101 compute1# 增加 192.168.145.102 compute2
配置主机名
$ vim etc/hostname# 修改主机名# 重启生效$ reboot
配置NFS环境
服务端部分
# 安装$ yum install nfs-utils rpcbind -y# 自动启服务$ systemctl enable rpcbind$ systemctl enable nfs-server$ systemctl enable nfs-lock$ systemctl enable nfs-idmap# 启动服务$ systemctl start rpcbind$ systemctl start nfs-server$ systemctl start nfs-lock$ systemctl start nfs-idmap# 配置共享目录$ vim /etc/exports# 添加 home 192.168.145.0/24(rw,sync,no_root_squash)# 使其生效exportfs -a
客户端部分
# 安装$ yum install nfs-utils -y# 检查服务端共享目录$ showmount -e 服务器地址# 配置NFS开机自动挂载$ vim etc/fstab# 添加 服务器地址:目录 客户端目录 nfs defaults 0 0# 手动临时挂载$ mount -t nfs 服务器地址:目录 客户端目录
配置NIS环境
NIS服务端环境
# 安装$ yum install ypserv ypbind yp-tools rpcbind -y# 添加NIS域名$ vim etc/rc.d/rc.local# 添加nisdomainname nisdomain# 不重启则需要执行$ nisdomainname nisdomain# 添加用户# 创建域用户$ useradd -s bin/bash nisuser# 设置密码$ passwd nisuser# 创建用户组$ groupadd nisgroup# 将用户添加到组中$ usermod -G nisgroup nisuser# 配置NIS客户端权限# 在配置文件中添加权限$ vim etc/ypserv.conf# 添加 192.168.145.0/24:*:*:none# 初始化NIS数据库以及启动NIS服务# 自启动NIS服务$ systemctl enable rpcbind$ systemctl enable yppasswdd$ systemctl enable ypserv# 启动NIS服务$ systemctl start rpcbind$ systemctl start yppasswdd$ systemctl start ypserv# 初始化NIS数据库$ usr/lib64/yp/ypinit -m# 每次修改用户后,更新数据库$ make -C /var/yp# 初始化数据库后重启服务$ systemctl restart rpcbind$ systemctl restart yppasswdd$ systemctl restart ypserv# 检查服务是否启动rpcinfo -p localhost
NIS客户端环境
# 安装客户端$ yum install ypbind yp-tools rpcbind -y# 添加NIS域# 在网络中添加NIS域,同NIS服务器配置方法# 使用authconfig-tui配置客户端$ authconfig-tui# 选中NIS, Shadow Passwords ,Local authorization is sufficient# 设置NIS Settings# 启动服务$ systemctl enable rpcbind$ systemctl enable ypbind$ systemctl start rpcbind$ systemctl start ypbind# 检测yptest# 注意点/etc/ypserv.conf 是NIS服务端配置文件,可以控制NIS客户端是否可以访问NIS服务器。/etc/hosts 记录主机和IP地址对应关系,如果没有DNS系统,则NIS服务器的hosts文件需要存放每一台NIS客户端的主机记录。
安装slurm
安装epel-release
yum install -y epel-release
安装配置munge
# 安装$ yum install munge munge-libs munge-devel -y# 生成munge.key$ create-munge-key# 分发key给客户端,可以使用md5sum工具校验各个节点key是否一致$ scp /etc/munge/munge.key root@compute1:/etc/munge$ scp etc/munge/munge.key root@compute2:/etc/munge# 启动munge服务$ systemctl enable munge$ systemctl start munge# 测试munge -n | ssh 客户端主机名 unmunge
安装slurm
# slurm 版本19.05.2-1$ yum --nogpgcheck localinstall slurm-*# 创建目录$ mkdir -p var/spool/slurm/d# 配置slurm.conf文件,参考官网在线配置。# 服务端开启服务$ systemctl enable slurmctl$ systemctl enable slurmd$ systemctl start slurmctl$ systemctl start slurmd# 客户端开启$ systemctl enable slurmd$ systemctl start slurmd# 不成功可以使用slurmd -Dcv切换前台模式查看原因$ slurmd -Dcv
搭建slurmdbd环境
mysql服务端安装
# 下载$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar# 解压缩$ tar -xvf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar# 安装common、libs、client、server$ rpm -ivh mysql-community-client-8.0.16-2.el7.x86_64.rpm --nodeps --force$ rpm -ivh mysql-community-libs-8.0.16-2.el7.x86_64.rpm --nodeps --force$ rpm -ivh mysql-community-common-8.0.16-2.el7.x86_64.rpm --nodeps --force$ rpm -ivh mysql-community-server-8.0.16-2.el7.x86_64.rpm --nodeps --force# 查看安装好的mysql$ rpm -qa | grep mysql# 初始化mysql服务端# 初始化mysql,需要root账户$ mysqld --initialize# 更改所有者,所属组$ chown mysql:mysql var/lib/mysql -R# 启动服务$ systemctl enable mysqld$ systemctl start mysqld
设置mysql远程账户
# 查看初始密码$ cat var/log/mysqld.log | grep password# 登录$ mysql -u -root -p# 修改初始密码ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';# 创建远程账号create user 'mouse'@'%' IDENTIFIED WITH mysql_native_password BY '123456';# 为远程账户授权grant all privileges on *.* to 'mouse'@'%' with grant option;# 刷新生效flush privileges;# 配置客户端# 安装$ rpm -ivh mysql-community-client-8.0.16-2.el7.x86_64.rpm --nodeps --force# 检查rpm -qa | grep mysql
为slurmdbd创建数据库
create database slurm_acct_db;
配置slurmdbd
# 修改slurmdbd.conf文件,参考官方文档。# 启动slurmdbd服务$ systemctl enable slurmdbd$ systemctl enable slurmdbd# 将集群加入作业$ sacctmgr add cluster 集群名
Slurm 测试指令
slurm测试
# 显示所有Compute Nodesscontrol show nodes# 如果Compute Nodes的State=DOWN,则如下执行,将状态变成IDLE:scontrol update nodename=cas01 state=resume# 简单测试执行srun -N4 hostname# 查看节点scontrol show nodes# 显示作业数量scontrol show jobs# 使用脚本sbatch -N2 script-file
常见API
sacct
被用来汇报工作或者解释激活的或完成的工作的信息的工作步骤。salloc
被用来实时的分配给一个工作任务资源。经常地这被用来分配资源并生成一个Shell(命令解释程序)。这个Shell程序然后被用来执行srun
命令运行平行的任务们。sattach
被用来将标准输入输出以及错误的附加的信号能力附着于目前正在执行的工作或工作步骤。这既可以被附着也可以将其从多任务线程中分离。sbatch
被用来提交一段工作脚本以进行后续的执行,这个脚本经常性地包括一个或多个srun
命令去运行平行任务。sbcast
被用来将一个文件从当地硬盘转移到当地硬盘上被分配到这个工作的节点上。这可以被用来高效地使用(diskless)不怎么使用硬盘的计算节点或相对于一个共享文件系统而言提供更好的性能。scancel
被用来取消一个挂起或正在执行的工作或工作步骤。他能够被用来发送任意信号给所有与正在执行的工作或工作步骤相关的进程。scontrol
是管理性的工具用来视察并或修改slurm状态。记住许多scontrol命令只能被管理员root权限执行。sinfo
记录了由slurm管理的(partition)分区和节点的状态,它有广泛多样的如过滤、排序、格式化等的选项。smap
记录了由slurm管理的工作、分区和节点的状态信息,但图像化显示的信息业反映了网络拓扑结构。strigger
被用来设置、获得或视察事件触发器。事件触发器包括了诸如节点going down(挂死)或工作任务接近了它们的限制事件。sview
是一个图像化的用户界面用来获得并更新由slurm管理的工作、分区以及节点的状态信息。
OpenMPI
什么是MPI
MPI 的全称是 Message Passing Interface,即消息传递接口。它是一种用于编写并行程序的标准,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性,有 MPICH、OpenMPI 等一些具体的实现,提供 Fortran、C、C++ 的相应编程接口。MPI 的目标是高性能,大规模性,和可移植性。MPI 在今天仍为高性能计算的主要模型。
MPI 的工作方式很好理解,我们可以同时启动一组进程,在同一个通信域中不同的进程都有不同的编号,程序员可以利用 MPI 提供的接口来给不同编号的进程分配不同的任务和帮助进程相互交流最终完成同一个任务。
安装OpenMPI
$ yum install openmpi3.x86_64 openmpi3-devel.x86_64 gcc gcc-c++ make
测试
# 当前账户要有各个节点ssh公钥
# 不建议用root账户,若使用,则需要--allow-run-as-root参数
$ mpirun -H compute1,compute2,control hostname
例子hello_c.c
#include <stdio.h>#include "mpi.h"int main(int argc, char* argv[]){int rank, size, len;char version[MPI_MAX_LIBRARY_VERSION_STRING];MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Get_library_version(version, &len);printf("Hello, world, I am %d of %d, (%s, %d)\n",rank, size, version, len);MPI_Finalize();return 0;}
编译并执行
$ make$ ./hello_c




