2026-05-30 文章

在 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