在 NVIDIA RTX 服务器上开启 P2P 通信:从驱动魔改到性能验证
详细介绍如何在 Debian/Ubuntu 系统下通过修改 NVIDIA 驱动内核模块,为 RTX 系列显卡开启 P2P 通信,并使用 CUDA Samples 验证传输速度。
在构建多 GPU 服务器时,NVIDIA 习惯于在消费级 RTX 系列显卡中禁用 P2P (Peer-to-Peer) 通信功能,而将其作为 A100/H100 等企业级显卡的专属特性。然而,通过修改内核模块,我们可以强制开启此功能,显著提升多卡之间的数据交换效率。
本文将基于 Debian 12/13 系统,详细介绍如何从底座驱动安装到源码魔改,最终实现 P2P 通信并验证其带宽。
一、 环境准备与基础配置
在开始之前,我们需要确保系统具备基础的构建工具,并开启 CPU 的 IOMMU 支持。
1. 安装必要工具
sudo apt update
sudo apt install -y curl gnupg
2. 开启 IOMMU (DMA Passthrough)
P2P 通信依赖于 IOMMU 的正确配置。编辑 GRUB 配置文件:
sudo nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 行,根据你的 CPU 类型添加参数:
- AMD CPU:
amd_iommu=on iommu=pt - Intel CPU:
intel_iommu=on iommu=pt
保存退出后,更新 GRUB 并重启:
sudo update-grub
sudo reboot
3. 安装构建依赖
sudo apt install -y dkms build-essential gcc make linux-headers-$(uname -r) pkg-config libglvnd-dev
二、 安装 NVIDIA 驱动底座
为了确保魔改成功,我们需要安装一个版本完全匹配的驱动底座(本文以 595.71.05 为例)。
1. 配置 NVIDIA 仓库
下载并安装 Keyring 包:
wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
注意(Debian 13 用户): 如果遇到 SHA1 限制,请编辑 /etc/apt/sources.list.d/cuda-debian12-x86_64.list,将 [arch=amd64] 改为 [trusted=yes]。
2. 安装驱动
sudo apt update
sudo apt install nvidia-driver-pinning-595.71.05 \
nvidia-open=595.71.05-1 \
nvidia-kernel-open-dkms=595.71.05-1
sudo reboot
三、 内核模块魔改 (核心步骤)
这是开启 P2P 的关键。我们将替换官方的内核源码为支持 RTX P2P 的魔改版本。
1. 准备工作
首先关闭图形界面以避免驱动被占用:
sudo systemctl isolate multi-user.target
sudo systemctl stop nvidia-persistenced
sudo rmmod nvidia_drm nvidia_modeset nvidia_uvm nvidia
2. 注入魔改源码
克隆支持 P2P 的内核模块仓库:
cd ~
git clone https://github.com/aikitoria/open-gpu-kernel-modules.git
备份并替换官方源码:
cd /usr/src/nvidia-595.71.05/
sudo mkdir -p backup
sudo mv kernel-open src backup/ # 根据实际目录结构调整
cd ~/open-gpu-kernel-modules/
sudo cp -r kernel-open src /usr/src/nvidia-595.71.05/
3. 使用 DKMS 重新编译
通过 DKMS 强制重新构建并安装模块:
sudo dkms build -m nvidia -v 595.71.05 --force
sudo dkms install -m nvidia -v 595.71.05 --force
4. 加载并验证
sudo modprobe nvidia
nvidia-smi topo -p2p r
如果输出结果显示 P2P 状态为 OK,则说明魔改成功!
四、 CUDA 性能验证
为了量化 P2P 的实际效果,我们使用 NVIDIA 官方的 p2pBandwidthLatencyTest。
1. 安装 CUDA
sudo apt-get update
sudo apt-get -y install cuda
2. 编译 P2P 测试工具
git clone https://github.com/NVIDIA/cuda-samples.git
cd ~/cuda-samples/cpp/5_Domain_Specific/p2pBandwidthLatencyTest
mkdir build && cd build
3. 解决 CMake 路径 Bug (技巧)
在某些版本的 CMake 中,即使安装了 CUDA,它也可能找不到路径。我们可以通过创建“幻想层级结构”来欺骗 CMake:
sudo mkdir -p /usr/local/cuda/targets/x86_64-linux/include
sudo mkdir -p /usr/local/cuda/targets/x86_64-linux/lib
# 将实际系统目录软链接到幻想目录
sudo ln -s /usr/include /usr/local/cuda/targets/x86_64-linux/include
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/local/cuda/targets/x86_64-linux/lib
执行编译:
cmake -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc -DCMAKE_CXX_STANDARD=17 ..
make -j$(nproc)
./p2pBandwidthLatencyTest
五、 常见问题排查
环境变量配置
如果运行工具时找不到 CUDA,请在 ~/.bashrc 中添加以下内容:
export CUDA_HOME=/usr/local/cuda-13.2
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/targets/x86_64-linux/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export CUDACXX=$CUDA_HOME/bin/nvcc
export CUDA_PATH=$CUDA_HOME/targets/x86_64-linux
export CUDAToolkit_ROOT=$CUDA_HOME/targets/x86_64-linux
恢复图形界面
完成所有测试后,可恢复图形界面:
sudo systemctl isolate graphical.target