---
title: 【P2P带宽】开启IOMMU导致ACS启动，导致跨环PIX链路带宽值低
description: "Atlas 200T A2 Box16/Atlas 200I A2 Box16 异构子框的PIX链路（即PCIe Switch，NPU1->PCIE -> PCIE SWITCH -> PCIE -> NPU2）带宽性能低于预期，且单向带宽和双向带宽几乎一致。"
url: https://www.hiascend.com/document/detail/zh/mindcluster/latest/toolbox/toolboxug/toolboxug_0254.html
sourcePath: /source/zh/mindcluster/2610/toolbox/toolboxug/toolboxug_0254.html
indexId: f3bd9562d9dd3344d826912b882ea9f4045b2a985bad2c04d1051b6012872eaf65
---
# 【P2P带宽】开启IOMMU导致ACS启动，导致跨环PIX链路带宽值低

#### 问题现象

Atlas 200T A2 Box16/Atlas 200I A2 Box16 异构子框的PIX链路（即PCIe Switch，NPU1->PCIE -> PCIE SWITCH -> PCIE -> NPU2）带宽性能低于预期，且单向带宽和双向带宽几乎一致。


#### 可能原因

- 原因一：开启PCIe ACS功能，导致PIX链路带宽性能低
  PCIe ACS功能简介：ACS（Access Control Services）协议通过设置相关的Control Bit能够决定一个TLP可以被正常路由、阻塞或者重定向。ACS可以应用于RCs，Switches和Multi-Function Devices。如果单功能设备支持SR-IOV功能，则ACS可以将该设备当成多功能设备，并开启某些ACS功能。通过在PCIe Switch上开启ACS服务，可以禁止P2P发送，强制PCIe Switch将所有地址的访问请求送到RC，从而避免peer-to-peer访问的风险。

- 原因二：开启iommu，强制开启PCIe ACS功能，导致PIX链路带宽性能低
  关闭ACSCtl后，发现PIX链路带宽还是很低。通过分析内核代码，发现可能与iommu有关。在detect_intel_iommu函数中通过调用pci_request_acs打开了ACS功能。即启动项开启iommu时强制开启ACS。


#### 确认方法（原因一）

执行lspci -s ${NPU的PCIe BDF号} -vvv | grep ACSCtl命令，查看ACSCtl是否为关闭状态，关闭时显示为减号。


#### 解决措施（原因一）

若不为减号，则需要关闭。关闭脚本如下：
```
for pdev in `lspci -vvv|grep -E "^[a-f]|^[0-9]|ACSCtl"|grep ACSCtl -B1|grep -E "^[a-f]|^[0-9]"|awk '{print $1}'`
do
setpci -s $pdev ECAP_ACS+06.w=0000
done
```


#### 确认方法（原因二）

执行lspci -vvv命令，发现有IOMMU group信息，说明开启了iommu。


#### 解决措施（原因二）

1. 在/etc/default/grub文件中的 “GRUB_CMDLINE_LINUX” 配置项里，删除 “intel_iommu=on” 和 “iommu=pt”，并添加 “intel_iommu=off”。
2. 执行update-grub命令，然后重启操作系统。
3. 【可选】在BIOS中，将“Intel(R) VT for Directed I/O (VT-d)”设置为“Disable”。
4. 重启操作系统后确认iommu是否关闭。
  执行dmesg | grep -i dmar命令，确认IOMMU为disabled。

  执行lspci -vvvv命令，确认无IOMMU group信息。

5. 重新测试PIX链路带宽。
