ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

HPC高性能计算架构设计:计算、存储、网络与调度实战指南

HPC高性能计算架构设计:计算、存储、网络与调度实战指南 简介这份《HPC高性能计算架构设计》文档面向从事高性能计算、集群运维与架构选型的工程师及科研人员系统梳理了HPC从基础概念到落地实践的关键知识。内容涵盖HPC系统的计算、存储、网络与集群软件四大组成从并行任务关系角度区分高吞吐计算与分布计算并详解X86处理器、Linux系统、刀片构建、IB与10GE互联等主流技术特点同时介绍MPI节点、胖节点与GPU加速节点的差异以及单节点性能计算公式、Linpack基准测试与DIMM内存类型等实用要点。资源包为1个docx文档约979KB结构紧凑便于按章节查阅与整理笔记。目前已有225人学习下载适合希望快速建立HPC架构全局认知、补充性能评估与硬件选型思路的读者参考。1. 从一份 .docx 说起HPC 高性能计算架构设计到底在解决什么问题如果你在机房待过凌晨三点大概率见过这种场面几十台服务器风扇狂转作业队列排到明天早上而某个 CFD 算例才跑了 7%。这时候你打开一份叫《HPC高性能计算架构设计.docx》的文档里面写着“计算、存储、网络三大子系统协同优化”——每个字都认识但落到自己机柜里就是另一回事。HPC 高性能计算架构设计本质是在算力、延迟、成本三者之间做工程取舍用什么样的计算节点、配什么互联、挂什么存储、怎么调度才能让作业跑得完、跑得快、还跑得起。它适合正在从“堆机器”转向“搭体系”的运维工程师、做仿真/训练的平台开发者以及需要给老板解释“为什么不能再加两百台机器”的技术负责人。架构设计不是画一张拓扑图就完事它决定了你未来三年扩容时是加一个机柜还是重做整个集群。2. 计算节点选型从 CPU 主频到 GPU 拓扑的硬账2.1 先算清楚你的作业到底吃哪一口HPC 作业分两类一类是强依赖单核主频和内存带宽的比如大量串行前处理、部分结构求解器另一类是能铺开到几千核的比如显式动力学、蒙特卡洛、大模型训练。架构设计第一步不是选品牌是拿真实作业做 profiling。常见做法是挑三个典型算例用perf stat和nvidia-smi dmon各跑一遍记录 IPC、内存带宽利用率、GPU SM 占用率。如果 CPU 侧 IPC 低于 1.0 且内存带宽跑满说明你缺的是带宽不是核数如果 GPU 利用率长期低于 60%瓶颈大概率在数据供给或通信。我一般会按下面这张表做初筛把作业特征映射到节点形态作业特征推荐节点形态关键参数常见误配高主频串行/小规模并行双路高主频 CPU大内存主频 ≥ 3.5GHz内存通道插满盲目上 GPU 导致闲置大规模 MPI 并行双路多核 CPU 高速互联核数 64~128NUMA 平衡忽略 NUMA 导致跨节点延迟GPU 加速训练/仿真4~8 卡 GPU 节点NVLink 拓扑、PCIe 代际用 PCIe Switch 冒充全互联混合负载异构节点池 调度标签按队列打标签所有节点同构浪费预算这张表不是拍脑袋是血泪经验曾经把一批高主频作业扔到 GPU 节点上结果 GPU 全程摸鱼CPU 侧因为主频低反而更慢最后只能改调度标签。2.2 用一段脚本把节点画像跑出来选型不能靠猜下面这段 Python 脚本在每类候选节点上跑一次输出关键指标方便横向对比。它不依赖特定厂商工具只用psutil和pynvml。import psutil import pynvml import time def profile_node(duration30): 采集节点 CPU/内存/GPU 基础画像 pynvml.nvmlInit() gpu_count pynvml.nvmlDeviceGetCount() # CPU 主频与核数 freq psutil.cpu_freq() cores psutil.cpu_count(logicalFalse) logical psutil.cpu_count(logicalTrue) # 内存带宽粗估用 memcpy 测有效带宽 import numpy as np a np.ones((1024, 1024, 64), dtypenp.float64) b np.empty_like(a) t0 time.time() for _ in range(5): np.copyto(b, a) bw (a.nbytes * 5 * 2) / (time.time() - t0) / 1e9 print(f物理核: {cores}, 逻辑核: {logical}, 当前主频: {freq.current:.0f} MHz) print(f内存有效带宽粗估: {bw:.1f} GB/s) for i in range(gpu_count): h pynvml.nvmlDeviceGetHandleByIndex(i) name pynvml.nvmlDeviceGetName(h) mem pynvml.nvmlDeviceGetMemoryInfo(h) print(fGPU{i}: {name}, 显存: {mem.total/1024**3:.1f} GB) pynvml.nvmlShutdown() if __name__ __main__: profile_node()逻辑说明psutil拿 CPU 拓扑和主频numpy的连续拷贝用来粗估内存带宽——虽然不如 STREAM 精确但足够在选型阶段区分“带宽够不够”。pynvml只读 GPU 型号和显存不跑计算避免干扰。参数上duration目前没用到实际可以扩展成持续采样a的 shape 按节点内存调整太小测不出带宽太大会 OOM一般取物理内存的 1/8 左右。跑完把输出贴到选型表里比看厂商 PPT 靠谱。2.3 GPU 拓扑别让 NVLink 变成摆设如果你选 GPU 节点必须看拓扑。同样是 8 卡NVLink 全互联和 PCIe Switch 互联在 AllReduce 场景下差出 3 倍以上。用nvidia-smi topo -m看矩阵如果卡间是NV4以上且没有SYS绕路才算合格。常见坑是买了 8 卡机但只插了 4 条 NVLink 桥剩下 4 卡走 PCIe训练时梯度同步直接拖垮。架构设计阶段就要在文档里写死GPU 节点必须全互联PCIe 代际不低于 Gen4否则不验收。3. 存储与网络把数据喂到计算节点嘴里3.1 并行文件系统选型Lustre、GPFS 还是本地 NVMe 缓存HPC 存储分三层本地 NVMe 做 scratch、并行文件系统做共享、归档存储做冷数据。架构设计最容易翻车的是把共享存储当本地盘用。Lustre 和 GPFS 都是成熟方案选哪个看团队运维习惯Lustre 生态开放调优参数多GPFS 商业支持好但授权成本高。如果作业有大量小文件随机读两者都头疼这时候本地 NVMe 缓存层就是后悔药。我一般按这个顺序定存储架构统计作业的 IO 模式顺序大文件、小文件随机、还是混合。顺序大文件为主并行文件系统条带数设大单文件条带 4~8 个 OST。小文件随机为主上本地 NVMe 做 burst buffer用tmpfs或bcache加速。归档层用对象存储或磁带别用并行文件系统硬扛。参数上Lustre 的stripe_count和stripe_size是必调项。stripe_size默认 1MB大文件可以调到 4MB~16MBstripe_count按文件大小和 OST 数量算一般不超过 OST 总数的 1/4否则元数据压力大。3.2 网络InfiniBand 还是 RoCE延迟和成本的平衡HPC 互联就两条路InfiniBand 和 RoCE。IB 延迟低、生态成熟但交换机和网卡贵RoCE 跑在以太网上成本低但需要无损网络配置PFC 和 ECN 调不好就丢包。架构设计阶段要算清楚如果作业是 MPI 密集型延迟敏感IB 更稳如果是存储流量为主RoCE 够用。下面这段 bash 用来在节点上快速检查 IB 或 RoCE 链路状态#!/bin/bash # 检查 IB/RoCE 链路速率与错误计数 if command -v ibstat /dev/null; then echo InfiniBand 链路状态 ibstat | grep -E State|Rate|Physical echo 错误计数 perfquery -x 2/dev/null | grep -E PortRcvErrors|PortXmitDiscards|LinkDowned else echo RoCE 链路状态 for dev in $(ls /sys/class/net/ | grep -E eth|ens|enp); do if [ -d /sys/class/net/$dev/device/infiniband ]; then echo 设备: $dev cat /sys/class/net/$dev/speed 2/dev/null ethtool -S $dev 2/dev/null | grep -E rx_discards|tx_discards|rx_errors fi done fi逻辑说明ibstat看 IB 端口状态和速率perfquery抓错误计数这两个是 IB 排障的起手式。RoCE 侧没有统一工具靠ethtool -S看丢包和错误。参数上PortRcvErrors持续增长说明线缆或光模块有问题PortXmitDiscards增长通常是拥塞要查 PFC 配置。这段脚本我一般放在节点巡检里每天跑一次提前发现链路劣化。3.3 调度器与资源标签别让作业乱跑架构设计最后要落到调度器。Slurm 是主流PBS 和 LSF 也有存量。关键不是选哪个是打标签。按节点形态打feature比如gpu-a100、highfreq、nvme-scratch作业提交时指定--constraint。常见坑是所有节点一个队列结果高主频作业被调度到低频节点GPU 作业被扔到无卡节点。架构文档里要写清楚节点必须打标签队列必须隔离否则调度器就是随机数生成器。4. 避坑与排查HPC 架构落地时最容易翻车的五件事4.1 现象作业跑着跑着变慢但 CPU/GPU 利用率都不高原因NUMA 跨节点访问。进程绑核没做内存分配跨了 NUMA 节点延迟翻倍。解决用numactl --cpunodebind0 --membind0绑核绑内存Slurm 里配TaskPlugintask/affinity。4.2 现象并行文件系统写入带宽远低于标称值原因条带数设太小或者所有客户端写同一个 OST。解决检查lfs getstripe把stripe_count调大确保客户端分散到不同 OST。如果是 GPFS看mmfsadm dump的磁盘分布。4.3 现象IB 网络延迟突然从 1.5us 跳到 10us原因交换机端口降速或光模块老化。解决跑ibstat看 Rate 是否从 100 降到 40换光模块或线缆。定期用perfquery看错误计数别等作业超时才查。4.4 现象GPU 训练比单卡还慢原因NVLink 拓扑不对或者 PCIe 带宽被其他设备抢占。解决nvidia-smi topo -m确认全互联检查是否插了 RAID 卡或网卡在同一个 PCIe Switch 下。架构设计时就要把 GPU 和高速网卡分到不同 CPU 直连通道。4.5 现象调度器显示节点空闲但作业排队不动原因节点被 drain 或标签不匹配。解决sinfo -R看 drain 原因scontrol show node看 feature 是否和作业--constraint一致。架构设计阶段就要定好标签命名规范别用gpu1、gpu2这种无意义名字。5. 用一次小规模压测验证你的架构设计架构文档写完不算完得用真实压测验证。我一般会做三组测试CPU 侧用 HPL 或 STREAM 测浮点和带宽GPU 侧用 NCCL AllReduce 测卡间通信存储侧用 IOR 测并行文件系统吞吐。下面这段 bash 是 IOR 的典型调用用来验证存储层是否达标# IOR 压测4 节点每节点 8 进程块大小 1M总数据量 64G mpirun -np 32 --hostfile hosts.txt \ ior -a POSIX -b 1m -t 1m -s 64 -i 3 -o /scratch/ior_test \ -w -r -C -Q 1 -F逻辑说明-a POSIX走 POSIX 接口-b 1m单次块大小-t 1m传输大小-s 64每个进程写 64 个块-i 3重复 3 次取稳定值-w -r先写后读-C跳过文件检查-Q 1每 1 秒输出一次进度-F每个进程独立文件。参数上-b和-t要匹配作业真实 IO 模式小文件场景把-b降到 4k大文件升到 4m。跑完看Max Write和Max Read如果低于存储标称的 70%就要回去查条带和网络。压测通过后把结果写回架构文档作为验收基线。以后扩容或换硬件先跑同一套压测对比基线别靠感觉。我自己的习惯是每季度跑一次全链路压测哪怕没变更也能提前发现光模块老化或磁盘坏道。HPC 架构设计不是一次性画图是持续验证和调优的过程。希望帮到你。本文还有配套的精品资源点击获取
返回列表