服务器集群

基本介绍

当前的服务器集群主要包括一个登陆节点 mu01(管理节点)和 20 个计算节点 cu01,cu02,...,cu20,分成两个队列

  • cu1 队列 cu01-10,cu15-20,每个节点有28核
  • cu2 队列 cu11-14,每个节点有16核

登陆节点和计算节点关系如下图(实际只部署了一个登陆节点,同时作为唯一的管理节点)

集群中两个队列的节点分别使用了不同的Intel处理器,将其与一个笔记本上较新的AMD处理器的主要指标进行对比

处理器 总核心数 主频 三级缓存 架构
Intel Xeon E5-2680 v4 28 核 2.4 GHz 35 MB Broadwell-EP (22nm)
Intel Xeon E5-2667 v4 16 核 3.2 GHz 25 MB Broadwell-EP (22nm)
AMD Ryzen 9 7940H 8 核 4.0 GHz 16 MB Zen 4 (7nm)

其中:

  • 主频:指每秒处理器执行指令的速度,高主频有利于快速执行单线程任务和串行计算。
  • 核心数:决定处理器同时执行任务的能力,多核心可加速并行计算和大规模数据处理。
  • 三级缓存:高速缓存用于存储频繁访问的数据和指令,更大缓存可降低内存访问延迟,提升处理效率。

除此之外,每一个节点的内存是256GB(DDR4),作为对比,个人笔记本的出厂配置通常只有8G或16G内存。

使用下面的命令可以测试集群的状态

1
tentakel -g allm 'df -h|grep mu01'

使用方式

关于当前服务器集群的使用:

  • 作为一个集群,所有节点之间会保持数据和用户信息的一致性:
    • 例如各个节点的/home/目录(包括其子文件夹)(总的物理空间约 16T)映射的实际是同一个物理空间
    • 还有/opt/目录(包括其子文件夹)(总的物理空间约 500G)也是同一物理空间(集群好像只保证这两个目录在所有节点上是一致的)
  • 服务器中的软件安装:
    • root 用户把多数人需要的公共软件安装在/opt/目录下
    • 名为 username 的普通用户把个人需要的软件安装在/home/username/目录下
  • 集群的登陆:
    • 可以通过 ssh 远程登陆到管理节点 mu01,在校园网内需要使用 IP 地址 XXX.XX.XXX.XXX 登陆,在校园网外无法直接登陆
    • 从管理节点 mu01 可以使用 ssh 跳转到其它计算节点,例如 ssh cu01
  • 集群的使用:
    • 使用scp/sftp或者其它方式将代码上传到管理节点
    • 在管理节点上编译C/C++/Fortran代码得到二进制程序,对于Python/MATLAB则不需要编译
    • 使用PBS作业系统提交耗时的计算任务,PBS作业系统会将计算任务分配给某个或某些空闲的计算节点
    • 不要直接在管理节点上直接执行二进制程序或脚本,因为这只是在消耗管理节点的算力!应该让计算节点负责计算

有时我们需要进行一些轻量级的计算,但是并不想将其打包为PBS作业,可以手动切换到一个空闲的计算节点中操作,使用下面的脚本可以自动查找一个空闲节点并跳转过去

goto_nodes
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

# get first free node
first_node=$(pbsnodes -l free | head -n 1 | awk '{print $1}')

# check free nodes
if [ -z "$first_node" ]; then
echo "No free nodes available."
else
echo "Connecting to $first_node..."
ssh "$first_node"
fi

软件版本

当前集群的管理节点系统为centos 7.9,计算节点系统为centos 7.3,两者之间有较大差距,可能导致问题。(甚至因为不能联网,在计算节点上的时间都是不准的)

系统自带的很多工具软件的版本偏低:

  • bash 的版本只有 4.2.46,不支持使用 oh-my-bash 进行美化;
  • git 的版本只有 1.8.3;
  • cmake 的版本只有 2.8.12;
  • tmux 的版本只有 1.8。

服务器上预装的编译器/计算软件也同样如此:

  • GNU编译器:gcc/g++/gfortran,版本只有4.8.5,这个版本的g++刚刚完全支持C++11,但是默认使用c++98标准,需要加上-std=c++11选项才能使用C++11;
  • Intel编译器:icc/icpc/ifort,版本为15.0.1;
  • MATLAB 的版本为2015b。

在服务器上使用这些软件时必须要考虑到对低版本的兼容性。 当前系统的版本已经低到不满足VSCode remote的要求,VSCode在不久后就不再对其支持。

修改密码

普通用户可以使用下面的命令修改自身密码(要先输入旧密码,再输入新密码并重复一遍新密码)

1
2
3
4
# 从管理节点mu01跳转到计算节点cu01上(或者其它任意计算节点)
ssh cu01
# 修改密码
yppasswd

这和普通Linux系统使用的passwd命令是不太一样的:因为需要修改 NIS 数据库中的密码保证在集群中所有节点上同步。

对于密码的设置,最好包括大小写字母,加上数字或特殊字符等,不要直接包含用户名生日等信息。

PBS 作业系统

基本介绍

为什么使用 PBS 作业系统? 因为默认情况下所有用户的地位平等,CPU 时间片会轮流分配给各个人的任务,这会影响了所有人的正常作业效率。 PBS系统会将各个用户提交的作业(作业通常是一些耗时的计算任务)组织为任务队列,依次执行,有效分配资源,避免相互之间的资源竞争。

下面是PBS作业系统的示意图

对于图中内容的解释:

  • PBS command: 用于提交、监视、修改和删除作业。
  • PBS_server: 提供基本的批处理服务,例如接收/创建一个批处理作业,管理维护作业队列,管理输出结果等。
  • PBS_mom: 是一个守护进程,从PBS_server接收作业后放入其自身的执行队列中等待执行。
  • Scheduler: 检查作业并分配资源,对用户提交的作业进行调度

PBS系统有多种实现,当前服务器使用的具体实现为 torque+maui。

状态查询

下面的这些命令只能在管理节点上执行。

使用下面的命令可以查询计算节点的状态

  • pbsnodes 查询所有节点的详细信息
  • pbsnodes cu01 查询 cu01 节点的详细信息
  • pbsnodes -l free 查询空闲节点列表
  • pbsnodes -l all 查询所有节点列表

节点的常见状态如下:

  • free 代表空闲状态,可接受作业
  • job-exclusive 代表正在满负荷运行作业,不可接受作业
  • offline 代表掉线状态,不可接受作业
  • down 代表关机或者故障,不可接受作业
  • down,job-exclusive 代表关机或者故障,且关闭前有作业在进行

showq 查看所有作业(正在进行的作业,闲置的作业,受阻的作业),输出形如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ACTIVE JOBS--------------------
JOBNAME USERNAME STATE PROC REMAINING STARTTIME

20408 abc Running 2 INFINITY Thu Sep 29 09:47:32

1 Active Job 2 of 540 Processors Active (0.37%)
1 of 20 Nodes Active (5.00%)

IDLE JOBS----------------------
JOBNAME USERNAME STATE PROC WCLIMIT QUEUETIME


0 Idle Jobs

BLOCKED JOBS----------------
JOBNAME USERNAME STATE PROC WCLIMIT QUEUETIME


Total Jobs: 1 Active Jobs: 1 Idle Jobs: 0 Blocked Jobs: 0

使用方式

在PBS作业系统上提交作业需要使用PBS脚本,它本质上就是一个shell脚本:

  • #开头的行被bash视作注释
  • #PBS开头的行被PBS系统识别为运行参数
  • 可以直接调用shell命令和系统命令(shell命令的规则比较奇怪,某些情况下甚至对空格是敏感的)
  • 脚本可以使用.sh.pbs后缀
  • 脚本无需使用+x赋予执行权限

关于PBS脚本编写的细节比较多,因此将其拆分出来单独整理,这里只提供一个简单的示例

demo.pbs
1
2
3
4
5
6
7
8
9
10
11
#PBS -N <jobname> # 作业的名称
#PBS -q cu2 # 指定使用某个作业队列,例如cu2
#PBS -l nodes=1:ppn=4 # 作业需要的计算资源: 1个节点,每个节点4个核心
#PBS -l walltime=24000:00:00 # 作业需要的计算时间: 申请24000小时的工作,不满足将无法继续进行计算

# 初始状态下处于用户家目录
# 这里切换到提交作业时的目录
cd $PBS_O_WORKDIR

# 启动计算程序或执行计算脚本
./a.out

在编写PBS脚本之后,使用方式如下:

  1. qsub 提交作业:使用qsub XXX.pbsqsub XXX.sh提交PBS作业,提交后会反馈一个作业号,例如20408.mu01
  2. qstat 查询作业状态:
    • qstat 查询当前用户的所有作业的状态,如果有作业会以表格形式给出,如果没有则不会返回任何信息,在正常情况下,一个作业会依次经历如下状态
      1. Q 代表正在排队
      2. R 代表正在运行
      3. E 代表正在退出
      4. C 代表任务完成
    • qstat -f id 根据作业号查询作业的详细状态,注意已经完成的作业是查询不到的信息的;
  3. qdel id删除已提交的指定作业号的作业:一般用户只能删除自己提交的作业,但作业中已经产生的输出文件不会被删除。通常不需要手动删除作业,因为作业完成后就会被自动删除,同时也查询不到了。

补充

除了PBS脚本,我们还可以在qsub命令中直接添加运行参数,命令中的运行参数优先级高于脚本中的运行参数。

PBS会实时监控作业的执行:如果作业遇到错误卡死的情况(例如MATLAB执行中遇到错误),会导致CPU空闲率过高等,如果这种异常状态超过一定的阈值,PBS会主动结束当前作业。

如果需要查看PBS历史作业的细节,可以进入下面的目录去查看日志(无需root权限)

1
cd /opt/tsce4/torque6/server_priv/accounting/