服务器在虚拟化或 GPU 直通(passthrough)场景里,“关 GPU 和网卡的 ACS” 主要是为了让 PCIe Peer-to-Peer(P2P)通信 能够直接进行,不被强制绕行 CPU 的 Root Complex,从而提高带宽、降低延迟,避免因 ACS 带来的隔离导致的性能下降。
一、为什么要关 ACS?
1. ACS 默认强制 P2P 流量绕行 RC(Root Complex),这会导致:
GPU 之间无法直接通信(NVLink 除外),性能大幅下降。
网卡与 GPU 之间无法直接通过 GPUDirect RDMA 通信。
2. 关闭 ACS 后,设备之间可以直接 P2P,适用于:
多卡训练(如 PyTorch、NCCL)
GPUDirect RDMA 场景(如 InfiniBand + GPU)
二、如何查看 ACS 是否开启?
系统类型 | 查看命令 |
---|---|
Linux | lspci -vvv | grep -i "ACS" 或 lspci -vvv | grep -i "acsctl" |
Windows | 使用工具如 HWiNFO64 或 PCIeTree,查看设备属性中的 ACS 字段 |
若看到 `SrcValid+` 或 `ACS Enabled`,说明 ACS 已开启。
三、如何关闭 ACS?
✅ 方法 1:BIOS 设置(推荐)
BIOS 品牌 | 路径示例 |
---|---|
Supermicro | Advanced → Chipset → North Bridge → IIO Configuration → Intel VT-d → ACS Control → Disable |
Dell | System Setup → Integrated Devices → Intel VT-d → ACS → Disable |
HPE | System Utilities → Chipset Configuration → IOMMU → ACS → Disable |
⚠️ 注意:不要关闭 VT-d(IOMMU),只关 ACS。
✅ 方法 2:Linux 下使用 `setpci`(不推荐,易失效)
查看设备地址
lspci -nn | grep -i "GPU\|Ethernet"
假设设备地址为 0000:02:00.0
setpci -s 02:00.0 220.w=0000
⚠️ 风险:重启失效,地址可能变化,建议仅用于测试。
✅ 方法 3:内核参数绕过(部分场景可用)
编辑 /etc/default/grub
GRUB_CMDLINE_LINUX="... iommu=pt pci=assign-busses"
sudo update-grub && reboot
适用于不能关 ACS 的云平台,但效果有限。
四、验证是否关闭成功
lspci -vvv | grep -i "acsctl"
若所有设备显示 `SrcValid-`,说明已关闭。
✅ 总结建议
场景 | 建议 |
---|---|
裸机多卡训练 | 直接 BIOS 关闭 ACS |
云平台(无法改 BIOS) | 使用 NCCL_P2P_DISABLE=1 或换 gloo 后端 |
GPUDirect RDMA | 必须关闭 ACS,并确保 GPU 和网卡在同一 Root Complex 下 |
如需根据具体主板或系统进一步指导,欢迎提供品牌型号或系统版本。