集群基本概念和操作入门

集群和个人电脑的区别

集群,即我们平时所说的“服务器”,将会是我们进行科学计算的第一劳动力。它有着和 个人计算机(PC)相似的用法,但在某些关键方面和个人计算机有本质的不同。这些 不同主要体现在:

  • 使用服务器 Linux 系统,很少用 ubuntu,系统各类软件版本较低,更新较慢, 追求运行的稳定。
  • 默认情况下图形界面为关闭状态,使用命令行跟系统进行交互,需要用户对命令行 模式有一定的熟练度。用户虽然可以使用图形界面方式连接,例如 X11 转发或者 VNC 等, 但由于其延迟较高,使用体验不好,因此还是推荐各位用户在命令行模式下操作。
  • 多用户同时在线,用户之间会相互影响,会共享部分的计算资源。用户之间也可以 相互通信。例
    write user pts/0
    hello, nice to meet you!
    ^D
    
  • 严格的权限管理,普通用户无法使用 sudo 进行权限提升,因此不能执行只有管理员 才能执行的操作,例如挂载,安装驱动,使用包管理器安装软件等。但并不意味着用户 无法安装自己需要的软件。
  • 登录和计算分离。即登录所在的机器通常不是实际运行计算程序的机器。这是集群初学者 最容易产生的误区,认为超算就是一整个资源超级多的服务器,这是不对的。

相关概念

  • 节点(node):指一台完整的主机,即通常我们说的“服务器”。根据它们的作用可分为 如下几类。
    • 登录节点:供用户进行登录的机器,可以从外界访问,用户可在上面进行一些常规 操作,例如复制文件,编译小型软件等。
    • 计算节点:主要负责服务器的所有计算任务,原则上只有计算节点才能运行用户的 计算程序,其他节点不可以。用户可以获得暂时的计算节点访问权限。根据计算的架构 还可细分为 CPU 节点,GPU 节点,胖节点等。
    • 管理节点:主要负责集群各种系统的管理,例如用户管理,调度系统的控制器,集群 全局配置。只有管理员才有权限访问。
    • 存储节点:主要负责集群的全局 IO,通常情况下集群所有节点的存储设备都放在 IO 节点上,然后由 IO 节点通过网络共享的方式挂载到其它节点。在大型超算集群中, 磁盘设备吞吐量特别大,因此需要专门用 IO 节点进行负载均衡,提高读写效率。
  • 集群(cluster):一组节点经过局域网互联形成的计算机群。节点之间相互通信具有低 延迟高速率的特点。一般的集群都至少有两种以上的网络互联:一种是管理网,速度较慢 (1000Mbps),用于系统管理(查询网络用户,同步配置文件等);另一种是计算网,速度 较快(万兆或 Infiniband),主要用户磁盘 IO 和分布式并行程序的通信(MPI)。
  • 主机名(hostname):节点的名字,用于区分是哪一台主机。一般在命令提示符(prompt) 中用户名的后面。在集群中由于有很多个节点,用户操作的时候一定要看清自己在哪。

未名教学一号的计算机互联结构

  • 登录节点:login[01-02]
  • 计算节点:cn67n[01-08],cn[68-70]n[01-14]
  • 管理节点:mgt[01-02]
  • 存储节点:io01
  • 特殊:gateway,上游网关,主要用于网络的通信或一些软件 License Manager 的 安装。

登录

Linux/MacOS

使用终端即可登录。

ssh username@address

其中 user 为用户名,address 为服务器的地址,可以是 IP 或者域名。

配置免用户名登录

  1. 新建 .ssh/config 文件
  2. 建立如下的配置
    Host pkuteach
        HostName ip_of_pkuteach
        User     username
    
  3. 更改文件权限 chmod 600 .ssh/config
  4. 下次登录即可输入 ssh pkuteach 即可

配置 SSH Key 方式登录

此内容可选。SSH Key 是除用户名密码的另一种验证方式。它实际是一种非对称密钥体质。 用户将自己的公钥放在服务器上,而私钥放在本地。验证时将这两对密钥进行匹配验证, 如果验证成功即可登录。这就意味着只要拿到了你的私钥就可以登录使用你的私钥授权 的服务器!当然也可用另一个密码将私钥保护起来(需要注意的是这并不是一个愚蠢的 行为,因为使用 SSH Key 的原因不只是免除密码登录!)

  1. 生成 SSH Key Pair(如果以前生成过就无需再次生成)
    ssh-keygen -t ed25519
    
  2. 按三下回车,确认保存位置,暂不设置密码。
  3. 将公钥 .ssh/id_ed25519.pub 上传的服务器上。
  4. 登录服务器,将 id_ed25519.pub 添加到授权的列表中。
    mkdir -p .ssh
    chmod 700 .ssh
    cat id_ed25519.pub >> .ssh/authorized_keys
    chmod 600 .ssh/authorized_keys
    
  5. 重新登录已经不需要密码。

Windows

推荐使用 MobaXterm 进行登录。在这里不讲。

调度系统

为什么要用调度系统?

为什么要用调度系统,上来就开始算不好吗?不好。作业调度系统的使用可以极大 减小用户程序之间的冲突,同时可追踪用户程序的运行情况。不过在某些执行效率方面 会略有降低。

  • 在用户程序互不影响的条件下让各个程序按照指定的规则运行,注重资源的公平 与合理的分配。
  • 用户需要做的是提交任务,告诉系统该做什么,需要多少资源,运行多长时间即可。不需要 实时盯着屏幕看,非常适合**批处理(batch)或离线(offline)**任务。
  • 实现任务和资源绑定,有利于资源的规范使用,也可以减少用户查询空余资源的痛苦。
  • 可记录用户消耗的资源数,有利于用户审计。所有大型计算集群有一套计费标准, 如果资源数量申请不合理,论文没写出来,经费却很快花光了!在收费集群上各位用户 一定要注意自己申请的资源大小,每一个 core 每一分钟都是需要花钱的。当然,在免费 的小集群上,这并不意味着用户可以为所欲为。

SLURM 结构

arch

  • slurmctld 为主要的控制进程,负责处理提交的任务,任务的调度,任务控制等。 只需要安装在控制节点上(例如管理节点),在某些系统里还会有备用的 SLURM 控制节点。
  • slurmdbd 主要负责用户审计,例如账号的管理,qos 的管理等。可能需要与数据库 进行交互(mysql, mariadb)。只需要安装在控制节点上。如果不需要审计功能可以不安装 这个模块。
  • slurmd 计算节点控制进程,每个计算节点至少会安装一个。需要和其他节点的 slurmd 以及控制进程 slurmctld 进行通讯。主要功能是接收 slurmctld 分发的任务,创建 资源池并执行任务。

SLURM 分区

partition

什么是分区?为什么要指定? 不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,进而 选择最适合自己的节点进行运算。此外,如果集群中部分机器是私有的,那么设置分区 可以使得只有部分用户能在这个分区提交 Job。总的来说,分区(Partition)可看做 一系列节点的集合。

分区的节点可重叠。

示例:SLURM 脚本和 MPI 程序

用户通过编写 SLURM 脚本来和调度系统进行交互。脚本中需要指明所需要的资源和 运行的命令。一个简单的 SLURM 脚本例子为:

#!/bin/bash
#SBATCH -J MPI_test
#SBATCH -p compute
#SBATCH -t 5:00
#SBATCH -N 2
#SBATCH --ntasks-per-node=1
#SBATCH -c 2
#SBATCH -o MPI_test.log


module add mpi/mpich/3.2.1

export OMP_NUM_THREADS=2
mpiexec -n 2 ./test
mpiexec -n 2 ./send

其中各个参数含义为:

  • -J 任务名。
  • -p 提交的分区。在这里教学一号没有指定默认分区所以必须填写。
  • -t 运行最大时间。超过这个时间程序将被强行终止。
  • -N 申请节点个数。
  • --ntasks-per-node 每个节点运行的进程个数。
  • -c 每个进程占用的 CPU 核心数,同功能选项为 --cpus-per-task
  • -o 标准输出和标准错误的重定向。由于任务交给计算节点完成,屏幕上的输出是 看不见的,因此可以用这个选项来保存输出。注意:不能保存非屏幕上的输出,例如 程序运行过程中的变量。这些输出需要手动存储。

注意:-N,--ntasks-per-node-c 这三个选项可以计算出当前任务占用的总 核心数。这里为 2x1x2=4 cores。

用户使用 src/cluster/ 下的源码可完成测试。通过

module add mpi/mpich/3.2.1

可以添加 mpich 环境。默认情况下这个环境没有被载入,无法直接使用 mpicc 等命令。

添加完毕后直接用 make 可以编译测试程序。在运行的时候载入的 MPI 模块需要和 编译时保持一致。编译时用的 mpich,运行时就不要载入 openmpi。

提交任务

使用 sbatch run.slurm 可将任务提交到 SLURM 调度系统。提交成功后会出现 Submitted Job xxx 的字样。如果提交失败需要检查 run.slurm 是否有错误。

常用命令

  • sinfo 查看目前所有节点分区情况。其中 STATE 标为 alloc 表示已经没有剩余 资源;标为 idle 的表示空闲;标为 mix 的表示有人在占用但是有剩余资源; 标为 down 表示节点无响应(可能是故障)。
  • sbatch 提交任务。后面跟着 SLURM 脚本作为参数。如果没有参数则直接从标准 输入读参数。
  • squeue 检查队列情况。只能列出正在排队或正在运行的程序。可以看到作业的拥有者, 运行状态,运行时间,占用节点数。处于运行状态的程序可查看所在计算节点,处于排队 的程序可查看没被运行的原因。
  • scancel 取消作业。用法 scancel JOBID 或 scancel -u USERNAME,可取消 某特定 ID 的作业或某个用户的全部作业。当然,非管理员不能取消别人的作业。

软件环境

使用 Environment Modules

多用户系统必然遇到的问题:用户A希望用 python=python2.7,cuda/8.0, 用户B希望用 python=python3,cuda/9.0,但这两者显然是冲突的,怎么解决?

为了满足同学们计算任务的需求,服务器中安装了各种版本的软件。 大家可在同一软件的不同版本之间切换,也可以在同一功能的不同软件之间切换, 以此来选择最合适的编程环境和运行环境。使用系统命令 module 可以快速地达到这一效果。

Environment Modules 这一工具的本质实际上是帮助你设置好某个软件运行所需要的 环境变量,它会智能地对 PATH LD_LIBRARY_PATH 等变量做出变更。

基本用法

在你使用某个软件之前,你必须通过 module 命令来配置此软件的运行环境,否则将无法使用此软件或者使用一个错误的版本。

例如,在没有载入任何 module 的情况下,输入 python 来尝试打开 python

user@login01 ~$ which python # which <COMMAND>: 查看 <COMMAND> 的完整路径
/usr/bin/python
user@login01 ~$ python
Python 2.7.5 (default, Aug  4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

注意到此时 python 命令代表系统内置的 python,而系统内置的 python 并未安装大部分科学计算库。

此时我们用 module 命令载入 anaconda

user@login01 ~$ module add anaconda/3.5.1
[user@login01 ~]$ which python
/nfs-share/software/tools/anaconda/3.5.1/bin/python
[user@login01 ~]$ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

此时使用的是集群各节点共享的 anaconda/3.5.1 中的 python,module 添加成功。

user@login01 ~$ module list             # 查看当前所载入的所有 module
user@login01 ~$ module avail            # 查看所有可用 module
user@login01 ~$ module rm <module name> # 卸载某个已载入的 module
user@login01 ~$ module purge            # 卸载全部已加载 module

结合 SLURM 脚本

module 命令仅作用在当前节点上,如果使用 SLURM 脚本提交任务,应当在脚本中添加 程序所需要的 module,确保程序可以正常运行。

#!/bin/bash
#SBATCH -J test
#SBATCH -p compute
#SBATCH -t 5:00

module add anaconda/3.5.1
module add matlab/2018a
module add mpi/mpich/3.2.1

# do your computation jobs...

一个 SLURM 的特性是它会保留提交任务时添加的 module,即执行 sbatch 提交脚本 时它会自动复制当前环境中的 module。

[user@login01 ~]$ module add anaconda/3.5.1 matlab/2018a mpi/mpich/3.2.1
[user@login01 ~]$ sbatch
#!/bin/bash
#SBATCH -o out
#SBATCH -p compute
#SBATCH -N 1

module list^D
Submitted batch job 15109
[user@login01 ~]$ cat out 
Currently Loaded Modulefiles:
 1) anaconda/3.5.1   2) mpi/mpich/3.2.1   3) matlab/2018a

定制默认 module

当你登录系统时,系统默认不载入任何 module。当 需要载入更多的 module 时,那么请直接在个人 HOME 目录下的 .bash_profile 或 .bashrc 文件的最后添加

module add <module name>

即可。每个 module 的添加单独占一行。这样每次你登录系统之后系统就会自动加载你指定的 module。

更改 .bash_profile 文件的同时,在你运行 SLURM 任务时也会自动载入这些 module, 因此无需在 SLURM 脚本中再次添加 module 命令!

自行安装软件

示例软件:htop,下载地址

在集群上是可以自行安装多数软件的,只要这类软件本质上不需要动用管理员权限就可以 自行安装。自行安装的软件一般情况下无法被别的用户使用。注意,由于硬件驱动也算 是一种特殊的软件,这种软件需要和硬件直接交互,修改系统启动时载入的模块,因此 用户不能在系统上安装驱动

包管理器的维护目录一般是 /usr,这是系统全局的静态目录,用户不具有写入权限, 因此无法使用包管理器进行安装。多数包管理器不支持更改安装位置(如 yum)。

上传

将下载的软件包上传到集群上。

scp htop-2.2.0.tar.gz pkuteach:

之后登录集群,创建新的目录 src 并解压缩。

mkdir src
cd src
tar -xzf ../htop-2.2.0.tar.gz

编译

进入源码目录进行编译

cd htop-2.2.0
./configure --prefix=$HOME
make 
make install

这里使用 --prefix 参数来重写安装位置,因为普通用户对默认安装位置没有写权限, 所以在这里把安装位置改成了 $HOME,即家目录。

测试

安装完成后,用命令 htop 即可打开软件。这是因为在 RedHat 系统中,$HOME/bin 在默认情况下正好处于 PATH 变量中。因此无需动用任何其他配置。在其他的发行版, 需要把 $HOME/bin 添加到 PATH 环境变量中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值