slurm的部署

slurm的部署

找学生配了一周多,无果。各种启动失败,直到看到了 这篇文章。他说是配置的版本太多,有点乱。等有空了研究一下。整体配置流程如下:

基本环境以及文档说明 #

集群架构 #

控制结点 192.168.91.141

slurmdb结点:与控制节点共用

计算结点:c1 192.168.91.130,c2 192.168.91.131

准备工作 #

  1. 修改/etc/hosts文件,使得各个主机可以使用主机名互相访问,在每个主机上都要修改
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.91.141 sms
192.168.91.130 c1
192.168.91.131 c2
  1. 配置主机到计算结点的信任关系

    从sms到c1如下,到c2同理

# 在主机 A 中产生相应的私钥和公钥(id_rsa 和 id_rsa.pub)
ssh-keygen -t rsa
# 在主机 A 中添加自己的私钥
cd .ssh/
ssh-add id_rsa
# 备注: 如果提示 Could not open a connection to your authentication agent,终端做如下操作:
ssh-agent bash 
ssh-add id_rsa
# 将主机 A 中的公钥 id_rsa.pub 拷贝到主机 B 的 .ssh目录下
scp id_rsa.pub c1:~/.ssh/
# 备注:如果提示没有文件目录,则再主机B上执行
ssh-keygen -t rsa
# 在主机 A 上远程执行命令,在主机 B 上生成认证文件
ssh c1 'cat .ssh/id_rsa.pub >> .ssh/authorized_keys'
  1. 设置主机名
hostnamectl set-hostname ${hostname} # 每个主机改主机名,sms,c1,c2
  1. 安装epel(所有结点)
yum install -y epel-release
yum repolist # 查看有无epel.repo 无则要重新安装
  1. 关闭防火墙以及selinux(所有节点)
systemctl stop firewalld
systemctl disable firewalld.service 
vi /etc/selinux/config
# 修改SELINUX=enforcing为SELINUX=disabled
setenforce 0

配置nfs服务 #

nfs服务用来在客户机上挂载主机上的目录

NFS服务所需软件及主要配置文件: #

安装NFS服务,需要安装两个软件,分别是:

  • RPC主程序:rpcbind NFS 其实可以被视为一个 RPC 服务,因为启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! (在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的!)。
  • NFS主程序:nfs-utils 就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件。

NFS的相关文件: #

  • 主要配置文件:/etc/exports 这是 NFS 的主要配置文件了。该文件是空白的,有的系统可能不存在这个文件,主要手动建立。NFS的配置一般只在这个文件中配置即可。
  • NFS 文件系统维护指令:/usr/sbin/exportfs 这个是维护 NFS 分享资源的指令,可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享。
  • 分享资源的登录档:/var/lib/nfs/*tab 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。
  • 客户端查询服务器分享资源的指令:/usr/sbin/showmount 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。showmount 可以用来察看 NFS 分享出来的目录资源。

服务端安装NFS服务步骤: #

第一步:安装NFS和rpc。

yum install -y  nfs-utils  #安装nfs服务
yum install -y rpcbind #安装rpc服务

第二步:启动服务和设置开启启动:

注意:先启动rpc服务,再启动nfs服务。

systemctl start rpcbind    #先启动rpc服务
systemctl enable rpcbind   #设置开机启动
systemctl start nfs-server # 启动nfs服务
systemctl enable nfs-server

第三步:配置共享文件目录,编辑配置文件:

首先创建共享目录,然后在/etc/exports配置文件中编辑配置即可。

vi /etc/exports
	/opt 192.168.91.0/24(rw)
systemctl reload nfs #重新加载NFS服务,使配置文件生效

配置文件说明:

格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数) 如上,共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户,权限为只读。 请注意,NFS客户端地址与权限之间没有空格。 NFS输出保护需要用到kerberos加密(none,sys,krb5,krb5i,krb5p),格式sec=XXX none:以匿名身份访问,如果要允许写操作,要映射到nfsnobody用户,同时布尔值开关要打开,setsebool nfsd_anon_write 1 sys:文件的访问是基于标准的文件访问,如果没有指定,默认就是sys, 信任任何发送过来用户名 krb5:客户端必须提供标识,客户端的表示也必须是krb5,基于域环境的认证 krb5i:在krb5的基础上做了加密的操作,对用户的密码做了加密,但是传输的数据没有加密 krb5p:所有的数据都加密

NFS客户端挂载配置: #

**第一步:**使用showmount命令查看nfs服务器共享信息。输出格式为“共享的目录名称 允许使用客户端地址”。

showmount -e 192.168.91.141
#################################
# Export list for 192.168.91.141:
# /opt 192.168.91.0
################################

showmount命令的用法;

参数 作用
-e 显示NFS服务器的共享列表
-a 显示本机挂载的文件资源的情况NFS资源的情况
-v 显示版本号

**第二步,**在客户端创建目录,并挂载共享目录。

vim /etc/fstab  #在该文件中挂载,使系统每次启动时都能自动挂载
	192.168.91.141:/opt	/opt nfs defaults 0 0
mount -a   #使得文件/etc/fstab生效

第三步,检查

df -Th
#############################################
# Filesystem          Type      Size  Used Avail Use% Mounted on
# devtmpfs            devtmpfs  1.9G     0  1.9G   0% /dev
# tmpfs               tmpfs     1.9G     0  1.9G   0% /dev/shm
# tmpfs               tmpfs     1.9G   13M  1.9G   1% /run
# tmpfs               tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
# /dev/sda3           xfs        18G  4.6G   14G  26% /
# /dev/sda1           xfs       297M  163M  134M  55% /boot
# tmpfs               tmpfs     378M   36K  378M   1% /run/user/0
# 192.168.91.142:/opt nfs4       18G  6.0G   12G  34% /opt
##############################################

nis 配置 #

https://blog.csdn.net/davidzxyang97/article/details/118995358

nis用于管理服务器集群的账户信息。想象一下公司有100名工程师和1000台服务器, 每个工程师都有唯一的帐号和对应的密码,现在希望每个工程师都能用自己的账号登陆所有的服务器。如果手动配置的话就需要操作100 * 1000次,工作量非常大。

nis的作用就是把所有工程师的帐号密码都存在nis的master上,其余的999台服务器作为client。当工程师登陆client时,从master处获取帐号和密码。因此在nis配置好后,每次新增用户时只需要在master上配置即可,最终的工作量可以减少为100 * 1。

sms配置 #

  1. 安装以及设置

    yum install ypserv ypbind nfs-utils rpcbind -y #安装软件包
    nisdomainname nisserver # 设置nis域名
    echo 'NISDOMAIN=nisserver' >> /etc/sysconfig/network # 开机自动设置
    echo '/bin/nisdomainname nisserver' >> /etc/rc.d/rc.local # 开机自动加入nis域
    # 启动
    systemctl start rpcbind
    systemctl start yppasswdd
    systemctl start ypserv
    /usr/lib64/yp/ypinit -m # 初始化数据库
    # 按Ctrl + D,再按y确认
    
  2. 添加用户

    useradd slurm # 添加slurm要用到的slurm账户
    passwd slurm # 设置密码
    cd /var/yp
    make # 更新数据库(每次更新账户信息后都需要更新数据库)
    

    client配置 #

    yum install authconfig\*   sssd\*  krb5\*  autofs   ypbind -y
    nisdomainname nisserver # 设置nis域名
    echo 'NISDOMAIN=nisserver' >> /etc/sysconfig/network # 开机自动设置
    echo '/bin/nisdomainname nisserver' >> /etc/rc.d/rc.local # 开机自动加入nis域
    authconfig-tui # 用图形界面配置NIS
    # 第一个界面左边选择Use NIS,右边保持默认,然后next
    # 输入nis的域名(nisserver)和master的IP地址(192.168.91.141),选择OK
    # 启动服务
    systemctl start rpcbind
    systemctl start yppasswdd
    systemctl start ypserv
    yptest # 测试
    id slurm # 测试
    

munge 配置 #

  1. 安装

    yum install munge munge-libs munge-devel -y # 所有结点安装
    
  2. 主节点生成munge.key

    create-munge-key
    scp /etc/munge/munge.key root@c1:/etc/munge/
    scp /etc/munge/munge.key root@c2:/etc/munge/
    
  3. 各个结点设置文件权限以及所有者、开机自启动

    chown munge.munge /etc/munge/munge.key
    systemctl enable --now munge
    
  4. 测试

    systemctl status munge
    munge -n
    munge -n | unmunge
    munge -n | ssh c1 # 管理Node进行测试
    remunge
    

安装slurm #

如无特殊说明均在管理结点运行

  1. 编译安装包

    yum -y install mariadb mariadb-devel mariadb-server hwloc-libs hwloc-devel hdf5-devel pam-devel perl-ExtUtils-MakeMaker python3 readline-devel rpm-build# 安装依赖
    wget https://download.schedmd.com/slurm/slurm-22.05.6.tar.bz2 #其他版本的下载链接在https://www.schedmd.com/downloads.php
    rpmbuild -ta slurm-22.05.6.tar.bz2 # 编译
    # 备注: 如提示缺少库、包等,请安装对应的包后再执行上面命令。
    #       如所依赖的包安装的不全,上述命令即使没有报错,能生成RPM包,也有可能所需的功能没有。
    cd /root/rpmbuild/RPMS/x86_64/
    ls #查看生成的RPM文件
    ##########################################
    # slurm-22.08.2-1.el7.x86_64.rpm
    # slurm-libpmi-22.08.2-1.el7.x86_64.rpm
    # slurm-slurmctld-22.08.2-1.el7.x86_64.rpm
    # slurm-contribs-22.08.2-1.el7.x86_64.rpm
    # slurm-openlava-22.08.2-1.el7.x86_64.rpm
    # slurm-slurmd-22.08.2-1.el7.x86_64.rpm
    # slurm-devel-22.08.2-1.el7.x86_64.rpm
    # slurm-pam_slurm-22.08.2-1.el7.x86_64.rpm
    # slurm-slurmdbd-22.08.2-1.el7.x86_64.rpm
    # slurm-example-configs-22.08.2-1.el7.x86_64.rpm
    # slurm-perlapi-22.08.2-1.el7.x86_64.rpm
    # slurm-torque-22.08.2-1.el7.x86_64.rpm
    ##############################################
    
    # 设置slurm的yum软件仓库
    mkdir -p /opt/src/slurm # 建立YUM仓库目录
    cp /root/rpmbuild/RPMS/x86_64/*.rpm /opt/src/slurm/ # 复制前面生成的RPM文件到 /opt/src/slurm/ 目录
    cd /opt/src/slurm/ # 建立YUM仓库RPM文件索引
    createrepo .
    cat >/etc/yum.repos.d/slurm.repo<<EOF
    [slurm]
    name=slurm
    baseurl=file:///opt/src/slurm
    gpgcheck=0
    enable=1
    EOF
    
    scp /etc/yum.repos.d/slurm.repo root@c1:/etc/yum.repos.d/
    scp /etc/yum.repos.d/slurm.repo root@c2:/etc/yum.repos.d/# 为其它节点设置YUM仓库
    
    # 管理结点
    yum -y install slurm slurm-perlapi slurm-slurmdbd slurm-slurmctld
    # 计算结点
    cd /opt/src/slurm/
    yum -y install slurm slurm-perlapi slurm-slurmd
    
  2. 配置mariadb(MySQL)数据库

    Slurm支持将账户信息等记录到简单的纯文本文件中、或直接存入数据库(MySQL或MariaDB等)、或对于多集群的某个安全管理账户信息的服务。该文档采用将记账信息等存储到数据库方式。

    systemctl start mariadb
    mysql
    # 生成slurm用户,以便该用户操作slurm_acct_db数据库,其密码是123456
    create user 'slurm'@'sms' identified by '123456';
    
    # 生成账户数据库slurm_acct_db
    create database slurm_acct_db;
    # 赋予slurm从本机sms采用密码123456登录具备操作slurm_acct_db数据下所有表的全部权限
    grant all on slurm_acct_db.* TO 'slurm'@'sms' identified by '123456' with grant option;
    # 赋予slurm从system0采用密码123456登录具备操作slurm_acct_db数据下所有表的全部权限
    grant all on slurm_acct_db.* TO 'slurm'@'system0' identified by '123456' with grant option;
    
    # 生成作业信息数据库slurm_jobcomp_db
    create database slurm_jobcomp_db;
    # 赋予slurm从本机sms采用密码123465登录具备操作slurm_jobcomp_db数据下所有表的全部权限
    grant all on slurm_jobcomp_db.* TO 'slurm'@'sms' identified by '123456' with grant option;
    # 赋予slurm从system0采用密码123456登录具备操作slurm_jobcomp_db数据下所有表的全部权限
    grant all on slurm_jobcomp_db.* TO 'slurm'@'system0' identified by '123456' with grant option;
    
    \q # 退出
    systemctl enable --now mariadb #启动服务
    
  3. 配置

    Slurm配置文件主要在 /etc/slurm/ 目录下。

    • 主配置文件:/etc/slurm/slurm.conf(如不采用configless模式,则需要其他用户可读)

    内容模板可访问 https://slurm.schedmd.com/configurator.html 填写相应信息生成,然后修改:

    # slurm.conf file generated by configurator.html.
    # Put this file on all nodes of your cluster.
    # See the slurm.conf man page for more information.
    ClusterName=MyCluster
    SlurmctldHost=sms
    MpiDefault=none
    ProctrackType=proctrack/cgroup
    ReturnToService=1
    SlurmctldPidFile=/var/run/slurmctld.pid
    SlurmctldPort=6817
    SlurmdPidFile=/var/run/slurmd.pid
    SlurmdPort=6818
    SlurmdSpoolDir=/var/spool/slurmd
    SlurmUser=slurm
    StateSaveLocation=/var/spool/slurmctld
    SwitchType=switch/none
    TaskPlugin=task/affinity
    InactiveLimit=0
    KillWait=30
    MinJobAge=300
    SlurmctldTimeout=120
    SlurmdTimeout=300
    Waittime=0
    SchedulerType=sched/backfill
    SelectType=select/cons_tres
    AccountingStorageHost=sms
    AccountingStoragePass=/var/run/munge/munge.socket.2
    AccountingStorageType=accounting_storage/slurmdbd
    AccountingStorageUser=slurm
    JobCompHost=sms
    JobCompPass=123456
    JobCompType=jobcomp/mysql
    JobCompUser=slurm
    JobAcctGatherFrequency=30
    JobAcctGatherType=jobacct_gather/linux
    SlurmctldDebug=info
    SlurmctldLogFile=/var/log/slurmctld.log
    SlurmdDebug=info
    SlurmdLogFile=/var/log/slurmd.log
    NodeName=c[1-2] NodeAddr=192.168.91.[130-131] CPUs=1 State=UNKNOWN
    PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
    
    • 数据存储方式配置文件 /etc/slurm/slurmdbd.conf
    # 认证信息
    AuthType=auth/munge # 认证方式,该处采用munge进行认证
    AuthInfo=/var/run/munge/munge.socket.2 # 为了与slurmctld控制节点通信的其它认证信息
    
    # slurmDBD信息
    DbdHost=sms # 数据库节点名
    DbdAddr=sms # 数据库IP地址
    
    SlurmUser=slurm # 用户数据库操作的用户
    MessageTimeout=60 # 允许以秒为单位完成往返通信的时间,默认为10秒
    
    DebugLevel=debug5 # 调试信息级别,
    DefaultQOS=normal # 默认QOS
    LogFile=/var/log/slurm/slurmdbd.log # slurmdbd守护进程日志文件绝对路径
    PidFile=/var/run/slurmdbd.pid # slurmdbd守护进程存储进程号文件绝对路径
    
    # Database信息,详细解释参见前面slurm.conf中的
    StorageType=accounting_storage/mysql # 数据存储类型
    StorageHost=sms # 存储数据库节点名
    StorageLoc=slurm_acct_db # 存储位置
    StoragePort=3306 # 存储数据库服务端口号
    StorageUser=slurm # 存储数据库用户名
    StoragePass=123456 # 存储数据库密码
    
    • cgroup资源限制 /etc/slurm/cgroup.conf
    CgroupAutomount=yes # Cgroup自动挂载。Slurm cgroup插件需要挂载有效且功能正常的cgroup子系统于 /sys/fs/cgroup/<subsystem_name>。当启动时,插件检查该子系统是否可用。如不可用,该插件将启动失败,直到CgroupAutomount设置为yes。在此情形侠,插件首先尝试挂载所需的子系统。
    CgroupMountpoint=/sys/fs/cgroup # 设置cgroup挂载点,该目录应该是可写的,可以含有每个子系统挂载的cgroups。默认在/sys/fs/cgroup。
    # CgroupPlugin= # 设置与cgroup子系统交互采用的插件。其值可以为cgroup/v1(支持传统的cgroup v1接口)或autodetect(根据系统提供的cgroup版本自动选择)。默认为autodetect。
    
    ConstrainCores=no # 如设为yes,则容器允许将CPU核作为可分配资源子集,该项功能使用cpuset子系统。由于HWLOC 1.11.5版本中修复的错误,除了task/cgroup外,可能还需要task/affinity插件才能正常运行。默认为no。
    ConstrainDevices=no # 如设为yes,则容器允许将基于GRES的设备作为可分配资源,这使用设备子系统。默认为no。
    ConstrainRAMSpace=no # 如设为yes,则通过将内存软限制设置为分配的内存,并将硬限制设置为分配的内存AllowedRAMSpace来限制作业的内存使用。默认值为no,在这种情况下,如ConstrainSwapSpace设为“yes”,则作业的内存限制将设置为其交换空间(SWAP)限制。
    #注意:在使用ConstrainRAMSpace时,如果一个作业步中所有进程使用的总内存大于限制,那么内核将触发内存不足(Out Of Memory,OOM)事件,将杀死作业步中的一个或多个进程。作业步状态将被标记为OOM,但作业步本身将继续运行,作业步中的其它进程也可能继续运行。这与OverMemoryKill的行为不同,后者将终止/取消整个作业步。不同之处还在于,JobAcctGather轮询系统在每个进程的基础上检查内存使用情况。
    
    • 配置文件目录权限
    mkdir /etc/slurm # 如果节点没有/etc/slurm则手动建立一下
    chown slurm.slurm /etc/slurm/slurmdbd.conf
    chmod 600 /etc/slurm/slurmdbd.conf
    chown root /etc/slurm/slurm.conf
    mkdir /var/spool/slurmctld
    chown slurm.slurm /var/spool/slurmctld
    mkdir /var/spool/slurmctld
    chown slurm: /var/spool/slurmctld
    chmod 755 /var/spool/slurmctld
    touch /var/log/slurmctld.log
    chown slurm: /var/log/slurmctld.log
    touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
    chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
    
  4. 启动服务

    systemctl enable slurmdbd
    systemctl restart slurmdbd
    systemctl status slurmdbd
    systemctl enable slurmctld
    systemctl restart slurmctld
    systemctl status sllurmctld
    sacctmgr add cluster MyCluster
    
  5. 复制配置文件到计算结点,启动服务

    scp /etc/slurm/slurm.conf root@c1:/etc/slurm/slurm.conf
    scp /etc/slurm/cgroup.conf root@c1:/etc/slurm/cgroup.conf
    scp /etc/slurm/slurm.conf root@c2:/etc/slurm/slurm.conf
    scp /etc/slurm/cgroup.conf root@c2:/etc/slurm/cgroup.conf
    # 每个计算结点,如果显示路径不存在则mkdir /etc/slurm
    systemctl restart slurmd
    systemctl status slurmd
    systemctl enable slurmd
    

测试并使用slurm #