跳过正文
好早前记录的装机

好早前记录的装机

·868 字·5 分钟
Ridiculous
作者
Ridiculous
A little bit about you

以H3C UniServer R4900 G6 Ultra为例

制作启动盘
#

需要准备可引导ISO、烧录软件(RufusUltraISO)和一个U盘(最好是USB3.0)。这里选择服务器端Ubuntu Server 22.04.5 LTS(上一个Ubuntu Server长期支持版,支持到2027年4月),在Ubuntu官网获取可引导ISO文件。

接下来用烧录软件写入硬盘镜像,UltraISO注意选择写入方式为USB-HDD+,Rufus注意选择目标系统类型为BIOS或UEFI,文件系统和其他设置根据需求配置。分区类型用MBR,格式化U盘后即可写入系统镜像(约2-3分钟)。 高性能集群运维——装机

装系统
#

这里到是没有什么需要特别注意的地方,配置用户名和密码的时候记得配一个除了root以外的用户防止不知道默认root密码(这个用户也是有root权限的) 建议直接安装openssh服务 其余选择默认即可

插卡、IB、内存
#

用户手册

插GPU卡的时候一定要看机器厂商的白皮书,对主板上面每一个针脚,插线的介绍。注意哪里能碰,哪里不能碰(这个在机器上一般也会有可视化的图案提示),在拆机之前确保已经了解机器的结构。 尤其是在准备插GPU卡和拆装CPU的时候-如果需要(一般除了GPU和内存也不用自己装),GPU一定要注意有没有AB线的区分,插拔电源线的时候严禁扯电线(所有情况都是拿着塑料头进行插拔) CPU拆装 必须严格按照白皮书的介绍,有一定的拧螺丝的顺序!!!切记 如果不按文档操作,很大概率会使CPU承受散热器的重量不均匀直接压坏 主板有个纽扣电池,远程运输需要取消(会重制BIOS) 内存条按着每一个Socket均匀插上(能插满那是最好的)。插不满的话,内存条的分布要以每个CPU为中心对称分布

连接电源
#

确保每个PDU亮灯,PDU数量视情况而定,现在的机器一般会有两个,两个PDU之间互为备份

开机
#

进入BIOS,关闭超线程,设置NUMA Per Socket(如果有这个选项),设置启动的硬盘(如果未识别到,去看看文档介绍硬盘槽位是否和硬盘的属性对应,如果还是识别不到可以考虑用IPMI检测机器是否连接硬盘,也有可能是机箱里部分硬盘插槽并没有接电)

检测是否正常(IPMI、HPL、OSU、STREAM)
#

IPMI能检测硬件环境是否正常,如有不正常,一般情况会在指示灯上显示告警信息。包括硬盘灯是否亮起。网线直连在自己电脑打开IPMI,H3C的IPMI口是叫HDM。 主机箱上一般有机器的默认IP和掩码,配置自己电脑的网络为静态网络,与机器在一个局域网内,通过网线直连,浏览器输入IP地址,访问IPMI的WebGUI。 在可视化界面能看到所有接口信息以及硬件工作情况,检查无误后,开机

网络,以太网交换机配置
#

接console线

以上内容具体看交换机的网口个数,一般最右边两个网口接外网(其中一个接小盒子,一个接外网网线 小盒子要配制ip地址作为网关,否则内网无法联网)

剩余网口划分到内网,小盒子的网口也划分到内网,所以小盒子要设置成trunk

Window下使用putty检测console线缆连接,通过设备管理器查看设备名称,putty中选择serial串口线,名称输入设备管理器中对应名称,连接后回车进入交换机配置终端

windows示例

这个截图没有接console线,接上后会出现usb serial port(COMx)x视具体情况而定

在下图中输出对应COMx,Open

..
用户名和密码初始为admin,(具体情况查找官方文档)

以下为H3C交换机配置示例

需要了解的一个内容是,交换机配置一般分为[ ]< >用于区分是否进入系统配置模式

在做完所有操作后建议save保存,设置保存文件名称*.cfg,然后配置开机自动加载配置文件 startup saved-configuration <configfine>


$ Login:admin

$ Password:admin

// 进入console,打?获得帮助

$ ?

$ system-view //进入系统配置模式

$ vlan 3 //启动vlan3

$ vlan 4 //启动vlan4

$ vlan 5

$ undo vlan 5 //关闭vlan5

$ display interface GigabitEthernet 1/0/23 //查看23口配置

$ interface GigabitEthernet 1/0/23 //进入23口配置设置

$ port link-type trunk // 设置为trunk模式(可访问多个vlan)

$ port trunk permit vlan all // 设置trunk模式可以访问所有vlan

$ quit //退出23口配置设置

$ interface range GigabitEthernet 1/0/1 to GigabitEthernet 1/0/22 //进入1-22口配置设置

$ port access vlan 3 //访问vlan3

$ quit

$ display vlan 3 //检查vlan3配置

$ interface GigabitEthernet 1/0/24

$ port access vlan 4

$ quit

note : console进程有时候没退出,下次连接的时候需要把上次串口通信的进程kill才能再连上。

交换机需要改默认密码!

光口是Ten-GigabitEthernet xxxx(一般不需要)

手写的网络拓扑

网络拓扑

网络配置
#

一般在系统安装时先不配置,安装完成后通过ip link show查看网口名。通过vim /etc/netplan/50-cloud-init.yaml,配置如下:

network:
    ethernets:
        ens16f0:
            addresses:
            - <A.B.C.D>/24
            nameservers:
                addresses: []
                search: []
            routes:
            -   to: default
                via: <A.B.C.D>
    version: 2

设置root密码
#

su root
passwd root

禁用Linux kernel自动更新
#

如果不禁用的话,每次apt update后都会提示你是否需要重启服务并更新。修改/etc/apt/apt.conf.d/下的10periodic20auto-upgrades内的参数为0即可。

sudo vim /etc/apt/apt.conf.d/10periodic

更新为:

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";

sudo vim /etc/apt/apt.conf.d/20auto-upgrades

更新为:

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

值得被做的准备
#

# 禁用Linux自动休眠
echo "\$nrconf{kernelhints} = 0;" >> /etc/needrestart/needrestart.conf
echo "\$nrconf{restart} = 'l';" >> /etc/needrestart/needrestart.conf
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
# 更新apt和apt-get
apt update
apt upgrade
apt-get update
apt-get upgrade
# 安装一些必要组件
apt install git wget vim curl htop net-tools pciutils build-essential 

分盘
#

如果不识别硬盘,可能在系统安装阶段就报错block probing did not discover any disks,检查硬盘、RIAD卡是否亮灯。

lsblk # 确认新硬盘设备名称(如/dev/sdX)
sudo pvcreate /dev/sdb /dev/sdc /dev/sdd # 创建物理卷PV
sudo vgcreate vg_home /dev/sdb /dev/sdc /dev/sdd # 创建卷组VG
vgdisplay # 检查卷组信息
sudo lvcreate -l 100%FREE -n lv_home vg_home # 创建一个逻辑卷,占用卷组的全部空间
sudo mkfs.ext4 /dev/vg_home/lv_home # 格式化逻辑卷为ext4文件系统
sudo mount /dev/vg_home/lv_home /home # 挂载逻辑卷到/home
# 自动挂载
sudo blkid /dev/vg_home/lv_home # 获取逻辑卷的UUID
sudo vim /etc/fstab
>>> UUID=<UUID> /home ext4 defaults 0 2
sudo mount -a
df -a # 验证

NFS共享文件系统
#

sudo apt install nfs-kernel-server nfs-common rdma-core # 所有节点都执行

NFS服务器节点
#

sudo mkdir -p /home
sudo chmod 777 /home
sudo vim /etc/exports
>>> /home *(rw,sync,no_root_squash) 
sudo vim /etc/nfs.conf # 启用RMDA
>>> [nfsd]
>>> rdma=y
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server

客户端节点
#

sudo mount -o rdma,vers=4.2 <server_ip>:/home /home
df -h | grep /home # 检查挂载是否成功
sudo vim /etc/fstab # 设置开机自动挂载
>>> <server_ip>:/home /home nfs4 rdma,vers=4.2 0 0

验证RMDA传输:

mount | grep /home
cat /proc/fs/nfsfs/servers # 看transport列是否为rdma

InfiniBand Driver
#

驱动下载:NVIDIA InfiniBand Software | NVIDIA | NVIDIA Developer

MLNX_OFED:Linux InfiniBand Drivers

对于旧版本的IB,请务必查看Release Note确认是否支持。

查看IB设备:

lspci | grep -i mell

打开IB的opensm服务:

# 如果没有安装
sudo apt update && sudo apt upgrad -y
sudo apt install opensm infiniband-diags ibutils perftest -y
sudo systemctl start opensm
systemctl status opensm
sudo systemctl enable opensm # 开机自启

验证能否正常识别IB设备:

ibv_devinfo
ibstat

测试服务器和客户端的ib带宽:

ibv_devices # 查询设备名称, 如mlx5_0
ib_read_bw -a -d <device_name> --report_gbits # 服务器
ib_read_bw -a -F <ip_addr> -d <device_name> --report_gbits # 客户端 (-a测试所有消息大小, -F强制使用服务端连接(需要服务端先启动), --report_gbits以Gbps显示带宽结果)

简单测试:ibpingibping <ip_addr>即可

CUDA
#

安装驱动
#

查看GPU型号:lspci | grep -i nvidia

驱动下载:NVIDIA Driver

A800/V100 for CUDA12.6: Data Center Driver for Linux x64 560.35.03 | Linux 64-bit | NVIDIA

卸载驱动
#

sudo /usr/bin/nvidia-uninstall

安装CUDA
#

CUDA Toolkit:CUDA Toolkit Archive | NVIDIA Developer

CUDA:CUDA Toolkit 12.6 Update 3 Downloads | NVIDIA Developer

Benchmark
#



#MLC memory access 测试
wget https://downloadmirror.intel.com/834254/mlc_v3.11b.tgz
import sys
import os
res = []

max_cpu_channels_map = {
    # https://www.intel.com/content/www/us/en/products/sku/212282/intel-xeon-platinum-8358-processor-48m-cache-2-60-ghz/specifications.html
    'Intel(R) Xeon(R) Platinum 8358 CPU @ 2.60GHz': 8,
    # https://www.intel.com/content/www/us/en/products/sku/91754/intel-xeon-processor-e52680-v4-35m-cache-2-40-ghz/specifications.html
    'Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz': 4,
    # https://www.amd.com/en/products/cpu/amd-epyc-7742
    'AMD EPYC 7742 64-Core Processor': 8,
    # https://www.intel.com/content/www/us/en/products/sku/225916/intel-core-i912900ks-processor-30m-cache-up-to-5-50-ghz/specifications.html
    '12th Gen Intel(R) Core(TM) i9-12900KS': 2,
    # https://ark.intel.com/content/www/us/en/ark/products/81908/intel-xeon-processor-e52680-v3-30m-cache-2-50-ghz.html
    'Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz': 4,
    # https://www.intel.com/content/www/us/en/products/sku/240785/intel-xeon-6972p-processor-480m-cache-2-40-ghz/specifications.html
    'Intel(R) Xeon(R) 6972P': 12,
}
for name in os.listdir(sys.argv[1]):
    if not name.endswith('log') or not name.startswith('mlc'):
        continue
    with open(os.path.join(sys.argv[1], name)) as f:
        lines = f.readlines()
        tag = ''
        size = '?'
        clock = '?'
        num_memory = 0
        cpu_model = '?'
        sockets = 0
        for i in range(len(lines)):
            s = lines[i].strip()
            if s.startswith('*-'):
                tag = s.split('-')[1]
            if s.startswith('size: ') and tag == 'memory':
                size = s.split(':')[1].strip()
            if s.startswith('Configured Memory Speed: ') or s.startswith('Configured Clock Speed: '):
                temp = s.split(':')[1].strip()
                if temp != 'Unknown':
                    clock = int(temp.split()[0])
                    num_memory += 1
            if s.startswith('Model name:'):
                cpu_model = ':'.join(s.split(':')[1:]).strip()
            if s.startswith('Socket(s):'):
                sockets = int(s.split(':')[1].strip())
            if 'ALL Reads' in lines[i]:
                reads = float(lines[i].split(':')[1].strip())
                theory = '?'
                if cpu_model in max_cpu_channels_map:
                    cpu_channels = max_cpu_channels_map[cpu_model] * sockets
                    memory_channels = min(cpu_channels, num_memory)
                    theory = clock * 8 * memory_channels / 1000
                res.append((reads, theory, size, clock, num_memory, name))

res.sort()
for (reads, theory, size, clock, num_memory, name) in res:
    ratio = '?'
    if theory != '?':
        ratio = '{:.1f}'.format(reads / 1000 / theory * 100)
    print('all reads {:.1f} GB/s, theory {} GB/s({}%), size {}, clock {}, memory count {}, name {}'.format(reads / 1000, theory,
          ratio, size, clock, num_memory, name))

osu也可以通过spack装


最好把spack装到NFS共享的目录里,实现一机配多机,这里以/opt为例,实际安装目录视情况而定

cd /opt

sudo git clone https://github.com/spack/spack.git spack

cd spack

git checkout releases/v0.23

sudo git pull

sudo chown -R spack:spack /opt/spack/ #**一定要检查所有权限

source /opt/spack/share/spack/setup-env.sh

spack --version

# download completed

spack compiler (确保现有gcc被spack检测到)
#没有gcc则手动添加 
spack compiler find (PATH)

spack install gcc@14.2.0%gcc@(现有版本)

用oneapi装的话 spack isntall xxx%oneapi@xxx
具体编译器看spack compilers里面有的就能用
spack详细使用方法去看spack 文档

wget https://netlib.org/benchmark/hpl/hpl-2.3.tar.gz
# download hpl source code in CPU

tar -zxvf hpl-2.3.tar.gz 
cd hpl-2.3/


wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/cca951e1-31e7-485e-b300-fe7627cb8c08/intel-oneapi-base-toolkit-2025.1.0.651_offline.sh
#download intel oneapi

#installation ....

这部分内容需要打包一个docker/或者一个压缩包,不同硬件编译出来的二进制文件性能不同,但是如果只为了测试性能是否正常,打包好二进制文件直接使用即可。

测试正常后就可以投入使用了

GPU benchmark教程看下面的网址 新标签页 详细读介绍,确定GPU卡能支持该版本Benchmark https://catalog.ngc.nvidia.com/orgs/nvidia/containers/hpc-benchmarks