openEuler 24.03 内核与系统优化:BIOS、内核参数与中断亲和
集群交付里"系统优化"最容易被做成玄学:抄一份 sysctl 就完事。本文把 384 卡 L40S IB 集群的底层优化拆成三层——BIOS 硬件态、内核参数、中断亲和,每层讲清楚为什么调、调什么、怎么验证。
1. BIOS:先把硬件态钉死
BIOS 决定硬件的"出厂状态",系统层改不回来。统一清单(逐节点核对):
| 设置项 | 值 | 目的 |
|---|---|---|
| 工作模式 | Performance | 关闭节能,偏向性能 |
| CPU C-states | 仅 C0/C1(禁 C6+) | 降低 RDMA 时延抖动 |
| Turbo Boost | Enabled | 8468V 睿频 3.8GHz |
| Hyper-Threading | Enabled | 按业务可后续关闭对比 |
| SR-IOV / VT-d | Enabled | 支持虚拟化与 IOMMU |
| PCIe 链路速度 | Gen4 Max | 满速链路 |
| NUMA | Enabled | GPU/网卡 NUMA 亲和前提 |
| 启动模式 | UEFI | openEuler 24.03 UEFI 安装 |
验证命令(上电自检时逐台核对):
bash
dmidecode -t memory | grep -E "Size|Speed" # 24×32GB @ 4800
lspci -vvv | grep -A8 -i l40s # LnkSta: 16GT/s, x16
lspci | grep -i mellanox # 应见 7 块网卡功能判断:C-states 禁 C6 是 RDMA 集群的必选项——CPU 进入深睡眠后,网络中断处理时延从微秒级跳到毫秒级,NCCL 对时延敏感,直接表现为吞吐抖动。
2. 内核参数:为 RDMA 和集合通信让路
| 参数 | 值 | 作用 |
|---|---|---|
transparent_hugepage | madvise | 大页按需,避免 IO 路径碎片 |
vm.swappiness | 10 | 减少交换 |
kernel.numa_balancing | 0(训练节点) | 关闭自动迁移,避免 NUMA 抖动 |
| IOMMU | 按需(SR-IOV 用则开) | GDR 场景注意 DMA 映射开销 |
GDR 场景的取舍:GPUDirect RDMA 需要把 GPU 显存地址直接映射到网卡 DMA,IOMMU 开启时会有映射开销。先测再定——ib_write_bw 开/关 IOMMU 各跑一轮,用数据决定,不凭直觉。
3. 中断亲和:把网卡中断钉在正确的 CPU 上
- 网卡 MSI-X 中断默认可能散落在任意 CPU,跨 NUMA 处理中断增加时延;
- 按
nvidia-smi topo -m实测拓扑生成亲和脚本:GPU 在哪个 NUMA,对应网卡中断就绑到哪个 NUMA 的 CPU; - 关键点:按实测拓扑生成,不照抄模板——厂商布局差异会让"看起来一样的机器"实际 NUMA 归属不同。
bash
# 示例思路(按实测拓扑生成,非模板)
# 读 /proc/irq/*/smp_affinity_list,把 mlx5 中断绑定到 GPU 同侧 CPU 核
# 验证:中断集中在预期 CPU 上(mpstat -I CPU 观察)4. 优化顺序:先硬件,再内核,后应用
错误示范:先调 NCCL 参数追性能,发现抖动再回头关 C-states——变量混杂,结论失真。
正确顺序:
- BIOS 钉死硬件态(先核对,后优化);
- 内核参数与中断亲和(一次下发,全节点一致);
- 跑基线(STREAM/NCCL/IB 带宽),留存;
- 再动应用层参数(NCCL、MPI),每次只改一个变量。
5. 交付清单
- BIOS:8 项设置逐台核对,
dmidecode/lspci抽查; - 内核参数:sysctl/内核 cmdline 全节点一致(Ansible 下发);
- 中断亲和:按实测拓扑生成脚本,中断集中在 GPU 同侧 CPU;
- GDR 取舍:IOMMU 开/关实测对比,数据存档;
- 基线留存:STREAM/NCCL/IB 三份基线,作为后续变更对照。
本文基于 384 卡 L40S IB 集群交付实测整理;具体版本号与命令以现场实测为准。