集群智能管理与监控

  集群技术是一种通过将多台计算机(节点)联合在一起,以提供单一服务或实现高性能、高可用性和可扩展性的技术。其应用场景非常广泛,可广泛应用于科学计算、大数据处理、网络服务等领域。
  集群管理在现代 IT 基础设施中起着至关重要的作用,而其管理涉及到集群的部署、监控、维护和优化。以下是根据研究生阶段在中物院短暂的集群运维经验,相关知识整理记录如下。

Linux

Linux是一个开源、自由传播、支持多用户同时操作、多任务、支持多CPU、多线程的操作系统。集群的管理通常需要使用到 Linux 命令,包括从节点的配置、部署到日常的维护、监控和调试。所以具备一定的Linux操作系统知识非常有必要。

计算机硬件介绍

  • CPU:中央处理器。进行逻辑运算和调度其他设备工作,服务器cpu在2-4颗,单核cpu是4核,总量在16-256G左右
  • 内存条:存储临时数据。内存解决的是cpu和磁盘之间的速度不平等,cpu处理过快,磁盘速度太慢,这中间就需要搭起传输桥梁。默认下,cpu是从内存中读写数据,内存从磁盘中获取数据。
  • 显卡:处理计算机图形相关工作。
  • 主板:集成电路板,将所有元件连接在一起。BIOS则为主板设置系统。
  • 硬盘:用于存储计算机数据。

输入设备为键盘鼠标,能够发送设备;输出设备为显示屏;主机部分则为机箱,保护零件。

Linux核心命令

Linux目录结构:

  • / #根目录
  • /dev #存放抽象硬件
  • /lib #存放系统库文件
  • /sbin #存放特权级二级制文件
  • /var #存放经常变化的文件
  • /home #普通用户目录
  • /etc #存放配置文件目录
  • /boot #存放内核与启动文件
  • /bin #存放二进制文件(可执行命令)
  • /usr #存放安装程序(软件默认目录)
  • /mnt #文件挂在目录(u盘、光驱)
  • /root #特权用户目录
  • /opt #大型软件存放目录(非强制)
    其中文件有三种权限:r为可读权限;w为可写权限;x为可执行权限

Linux核心命令:

1
2
3
4
5
6
7
8
9
10
11
cd     #跳转目录
ls #列出文件夹内容
pwd #打印工作目录
su #命令用户切换
logout #退出当前的用户
mkdir #创建文件夹
touch #创建普通文件
cp #./junting1/JUNTING.txt ;复制放入其他文件夹并改名
cat #显示文件内容
echo #输出文本到终端
rm #删除;rm -f(强制删除不提示);*删除文件夹必须加上-r

如果想要查看帮助,输入q 退出。

1
2
3
#man + 命令  #查看帮助,输入q 退出
#命令 --help
#help 命令

Linux文本处理命令

1
2
3
4
5
6
grep  #搜索文本中的模式;grep -i "pattern" file.txt(在 file.txt 文件中搜索包含 pattern 的所有行)
awk #处理文本数据;awk '$1 == "value"' file.txt(打印 file.txt 中第一字段等于 value 的行)
sed #流编辑器,用于文本替换和编辑。
cut #从文本中提取字段;cut -c 4-6 alex.txt (每行从第4个切割刀第6个字符)
sort #对文本进行排序;sort -n sort.txt(针对数字从小到大排序,加个r从大到小)
uniq #删除重复行。

Linux系统和进程管理命令

1
2
3
4
5
6
ps      #显示当前进程。
top #实时显示系统资源使用情况(Git Bash 不支持)。
kill #终止进程。
uptime #显示系统运行时间(Git Bash 不支持)。
df #显示文件系统磁盘空间使用情况。
du #显示目录或文件的磁盘使用量。

Linux网络命令

1
2
3
4
ping    #检查网络连通性。
curl #下载或上传数据。
wget #下载文件。
ssh #通过 SSH 连接到远程主机。

vim编译与shell脚本

Vim 是一种高度可配置的文本编辑器,常用于编程和系统管理。它基于 vi 编辑器,提供了更多的功能和灵活性。他具有三种基本模式:

  • 普通模式
    这是 Vim 启动时的默认模式,用于导航和执行命令。可以通过按 Esc 键进入普通模式。
  • 插入模式
    在插入模式中,你可以插入和编辑文本。通过按 i、I、a、A、o、O 等键进入插入模式,按 Esc 返回普通模式。
  • 命令模式
    在命令模式中,你可以执行各种命令,如保存文件、退出 Vim 等。通过按 : 进入命令模式,输入命令后按 Enter 执行。

vim启动与保存退出的相关命令:

1
2
3
4
vim filename  #启动
:wq #保存退出
:w #只保存
:q #只退出

Shell 脚本称为bash shell 程序,本质就是将一系列 Linux 命令和控制结构组织在一起,通过脚本文件来实现自动化任务和批量处理。Shell 脚本可以包含各种 Shell 命令、条件语句、循环、函数等,用于执行复杂的操作和实现自动化功能。通常显示为 *.sh 文件。如下为shell脚本经典实例(可在window中git bash测试):

1
2
3
4
5
6
#!/bin/bash
# 获取用户输入
read -p "Enter your name: " name
read -p "Enter your age: " age
# 输出信息
echo "Hello, $name! You are $age years old."

其中#!/bin/bash是脚本文件的解释器,一种特殊注释为Shebang行(能够指定解释器,确保脚本在不同环境中的一致性,并简化脚本的执行)。它告诉操作系统在执行脚本时应该使用哪个程序来解释脚本中的命令。但他不是强制性的,它只是一个最佳实践。
运行shell脚本有两种方式

  • 直接./*.sh
  • sh *.sh

集群整机压测

Slurm调度系统

Slurm(Simple Linux Utility for Resource Management)是一个开源的、高效的集群管理调度系统,用于管理和调度大型计算集群中的计算资源。Slurm具有高可用性和可扩展性,易于使用,提供了丰富的命令行界面和API,可以为科学研究和工程计算等领域提供高效的支持。
*注:参与运维集群时,已部署好Slurm调度系统。

sinfo

集群系统中的单个计算机通常称为节点,通常通过局域网连接。sinfo是 Slurm 作业调度系统中用于查询集群状态的命令。期间我主要用它做整机测试,检测服务器的连接状态。

1
sinfo

sinfo通常包括以下字段

  • PARTITION:分区名称。分区是 Slurm 中的一个资源池,作业被调度到特定的分区中。
  • NODELIST:节点列表。显示分区中包括的所有节点的名称。
  • STATE:节点的状态。常见的状态包括
    idle #空闲,没有正在运行的作业
    drain #节点处于维护模式,暂时不接受作业。
    down* #节点无法使用,故障
    mixed #节点部分空闲,部分已分配。
    alloc #节点已分配给正在运行的作业。

如下是sinfo的示例输出,实时输出每个节点的运行状态:

1
2
3
PARTITION  AVAIL  TIMELIMIT  NODES  STATE  NODELIST
debug* up infinite 4 idle node[01-04]
compute up infinite 6 alloc node[05-10]

我们也可以使用脚本定期检查节点是否有任何故障(如 “down” 状态)是维护集群健康的重要部分。

1
2
3
4
5
#!/bin/bash
while true; do
sinfo | grep -i down
sleep 60
done

跑循环计算

考虑到实际使用中,集群可能出现间断计算使用,导致忽冷忽热,硬件可能在温度循环中变得不稳定,所以为了验证其整机的可靠性,我们采用每半个小时负载跑计算,停止半小时,再继续半小时计算,如此循环状态下,检测集群在高负载循环下能够稳定运行,并且不会因为过热而导致性能下降或硬件损坏。

  • 首先确保集群节点上已安装 stress 工具

    1
    sudo apt-get install stress
  • 设置 SSH 密钥登录
    为了无密码登录到每个节点,可以配置 SSH 密钥对

  • 编写计算脚本stress_test.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

# 节点列表,按照实际情况替换
NODES=("node1" "node2" "node3") # 替换为你的集群节点名或 IP 地址

# 负载参数
CPU_LOAD=4 # 每个节点上启动的 CPU 负载数
MEMORY_LOAD=2G # 每个节点上模拟的内存负载
DURATION=3600 # 负载持续时间(秒)

# 远程命令
STRESS_CMD="stress --cpu ${CPU_LOAD} --vm 1 --vm-bytes ${MEMORY_LOAD} --timeout ${DURATION}"

# 遍历节点并运行负载测试
for NODE in "${NODES[@]}"; do
echo "Starting stress test on ${NODE}..."

# 使用 SSH 远程执行负载测试命令
ssh "hadmin@${NODE}" "${STRESS_CMD}" &

if [ $? -ne 0 ]; then
echo "Failed to start stress test on ${NODE}"
else
echo "Stress test started on ${NODE}"
fi
done

# 等待所有后台进程完成
wait

echo "Stress testing completed on all nodes."

这个脚本会在集群中的每个节点上启动负载测试,模拟高负载情况,以帮助评估系统的稳定性和性能。你可以根据实际需求调整脚本中的节点列表、负载参数和其他设置。

  • 运行脚本
    1
    ./stress_test.sh

监控与日志管理

IPMI

在集群管理中,研究所使用到的服务器在179台左右,需要对大量服务器进行监控与管理,特别是初期硬件不太稳定,主要对硬件层面的管控。然而我们不可能一天24小时呆在机房,所以需要远程管理系统对其进行控制。
IPMI是一种用于系统管理的标准接口,可用于监控和管理计算机系统的硬件,允许管理员对服务器进行远程操控(孩子再也不用来回跑机房了~~)。
IPMI主要功能:

  • 远程监控
    1、硬件健康状态:监控系统的温度、风扇速度、电压、硬件故障等;
    3、远程管理:远程开关机:允许管理员在系统远程关闭、重启或启动服务器。
    4、远程控制:提供对服务器的远程控制,包括远程访问 BIOS 设置和操作系统。
    5、重置系统:可以远程重置系统,以解决系统挂起或崩溃问题。
  • 传感器监控
    1、温度传感器:监控 CPU、主板和其他组件的温度。
    2、风扇速度:监控风扇速度,确保散热系统正常工作。
    3、电压传感器:监控系统的电压水平,确保稳定性。
  • 日志记录:
    系统事件日志:记录硬件事件和错误,以帮助进行故障排除;
  • 远程控制台:
    提供对服务器的虚拟控制台访问,允许管理员在操作系统启动之前进行控制和操作。

IPMI 的组成:

  • BMC(Baseboard Management Controller):
    这是 IPMI 的核心组件,负责与服务器的硬件进行通信,处理传感器数据和远程管理命令。
    通常,BMC 是集成在主板上的专用微控制器。即使操作系统崩溃,BMC 仍然可以监控和管理硬件。
  • IPMI 规范:
    这是一个定义 IPMI 功能和接口的标准,规定了如何进行硬件监控和管理。
  • 管理软件:
    提供与 BMC 进行通信的工具和应用程序,允许管理员通过图形用户界面或命令行工具来管理系统

了解完IPMI强大功能,我们对其进行安装,在 Debian/Ubuntu 系统中,安装IPMI,帮助读取主板和其他传感器温度数据:

1
sudo apt-get install ipmitool

远程开关机

集群使用的IPMI默认用户名admin以及密码admin,可通过ssh经过ipmi控制,实现服务器远程开关机。命令如下:

1
2
3
ipmitool -I  lanplus -H 地址 -U admin -P admin power reset #开机
ipmitool -I lanplus -H <IPMI_IP> -U <USERNAME> -P <PASSWORD> power off
#关机

温度监控

高集中的服务器产生大量热量,所以对温度的监控十分重要。除了安装机房温度报警装置,初期还要定时监控主板温度。可以从ipmi接口获取温度信息。
编写shell脚本检测温度,它将使用 ipmitool 工具从每个节点获取主板温度,并记录到日志文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

# 节点列表,按照实际情况替换
NODES=("node1" "node2" "node3") # 替换为你的集群节点名或 IP 地址

# IPMI 配置信息
IPMI_USER="admin" # 替换为实际的 IPMI 用户名
IPMI_PASS="password" # 替换为实际的 IPMI 密码
IPMI_INTERFACE="lanplus" # IPMI 接口类型(例如 lanplus)

# 温度监控日志文件
LOGFILE="/var/log/ipmi_temp.log"

# 写入日志文件的函数
log_temp() {
local NODE=$1
local TEMP=$2
echo "$(date): ${NODE} - Temperature: ${TEMP}°C" >> "${LOGFILE}"
}

# 监控每个节点的主板温度
for NODE in "${NODES[@]}"; do
echo "Checking temperature on ${NODE}..."

# 使用 IPMI 工具获取温度信息
TEMP=$(ipmitool -I ${IPMI_INTERFACE} -H ${NODE} -U ${IPMI_USER} -P ${IPMI_PASS} sdr | grep -i "System Temp" | awk '{print $NF}' | sed 's/°C//')

if [ -z "$TEMP" ]; then
echo "Failed to get temperature from ${NODE}" >> "${LOGFILE}"
else
log_temp "${NODE}" "${TEMP}"
fi
done

echo "Temperature monitoring completed."