Linux 上强制重新协商 PCIe 速度

Linux 上强制重新协商 PCIe 速度

我正在使用 PCIe Gen 3 卡,有时它们似乎会回落到 PCIe 1 或 2 速度(根据 lspci 以及通过吞吐量观察)。

在大多数情况下,重新启动/重新启动机器时,速度会恢复到完整的 PCIe Gen 3 速度。

是否有一种侵入性较小的方法来强制在例如 RHEL6 上重新协商 PCI 链路速度(尝试将其恢复到 PCI Gen 3)?

答案1

您可以在此文件上检查您的 PCIe 能源策略:

# cat /sys/module/pcie_aspm/parameters/policy

由于 Gen3 通过 ASPM(活动状态电源管理)进行电源管理非常简单,这可能是总线问题的根本原因:吞吐量较低,因此模块降低了速度,但在以下情况下忘记再次增加速度:需要(如果需要)。您可以通过使用以下参数禁用 aspm 来强制 grub 以避免使用“powersave”或“默认”策略:

pcie_aspm=off

仅在一个内核上测试这一点,并将此选项附加到/boot/grub/grub.conf默认引导 Linux 的“kernel”行上。从 Red Hat 文档中提取的 grub 配置示例:

default=0 
timeout=10 
splashimage=(hd0,0)/grub/splash.xpm.gz 
hiddenmenu 
title Red Hat Enterprise Linux Server (2.6.18-2.el5PAE)         
root (hd0,0)         
kernel /boot/vmlinuz-2.6.18-2.el5PAE ro root=LABEL=/1 rhgb quiet pcie_aspm=off      
initrd /boot/initrd-2.6.18-2.el5PAE.img

答案2

PCIe 设置速度有一个pcie_set_speed.sh可以更改设备的目标链接速度的脚本。已在带有内核的Alma 8.9(即基于RHEL)下成功使用该脚本4.18.0-513.18.1.el8_9.x86_64

PCIe 卡中有 Xilinx Kintex-7 FPGA:

  1. FPGA PCIe IP 设置为以 4 条通道在 PCIe 2 速度下工作。
  2. PCIe 卡位于 16 通道插槽中,配备支持 PCIe 2 速度的 Intel i5-2310 CPU。

注意到 PCIe 接口以 PCIe 1 速度(2.5 GT/s)协商:

$ dump_info/dump_info_libpciaccess 
domain=0000 bus=01 dev=00 func=00
  vendor_id=10ee (Xilinx Corporation) device_id=7024 ((null)) subvendor_id=0002 subdevice_id=0009
  control: I/O- Mem+ BusMaster- ParErr- SERR- DisINTx-
  status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
  bar[0] base_addr=f0110000 size=4000 is_IO=0 is_prefetchable=1 is_64=1
  bar[2] base_addr=f0100000 size=10000 is_IO=0 is_prefetchable=1 is_64=1
  Capabilities: [40] Power Management
  Capabilities: [48] Message Signaled Interrupts
  Capabilities: [60] PCI Express v2 Express Endpoint, MSI 0
    Link capabilities: Max speed 5.0 GT/s Max width x4
    Negotiated link status: Current speed 2.5 GT/s Width x4
    Link capabilities2: Not implemented
    DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
            RlxdOrd- ExtTag+ PhantFunc- AuxPwr- NoSnoop+
    DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
  domain=0000 bus=00 dev=01 func=00
    vendor_id=8086 (Intel Corporation) device_id=0101 (Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port) subvendor_id=8086 subdevice_id=2002
    control: I/O+ Mem+ BusMaster+ ParErr- SERR- DisINTx+
    status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
    Capabilities: [88] Bridge subsystem vendor/device ID
    Capabilities: [80] Power Management
    Capabilities: [90] Message Signaled Interrupts
    Capabilities: [a0] PCI Express v2 Root Port, MSI 0
      Link capabilities: Max speed 5.0 GT/s Max width x16
      Negotiated link status: Current speed 2.5 GT/s Width x4
      Link capabilities2: Not implemented
      DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
              RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
      DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
      SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
             Slot #0 PowerLimit 0.000W; Interlock- NoCompl+

上面的输出来自dump_info_libpciaccess.c程序。它从给定的 PCI 设备开始,并沿着 PCI 拓扑向下到达根联合体。上面显示了 PCIe 设备和根联合体支持5.0 GT/s,但运行于2.5 GT/s.

pcie_set_speed.sh运行 Alex Forencich 编写的脚本时,它报告链接速度从 1 更改为 2。使用的唯一参数是要操作的 PCI 设备,因此导致 PCIe 设备尝试协商到其支持的最快链接速度:

$ sudo ~/Downloads/pcie_set_speed.sh 0000:01:00.0
Link capabilities: 02212d02
Max link speed: 2
Link status: 5041
Current link speed: 1
Configuring 0000:00:01.0...
Original link control 2: 00000002
Original link target speed: 2
New target link speed: 2
New link control 2: 00000002
Triggering link retraining...
Original link control: 50410040
New link control: 50410060
Link status: 5042
Current link speed: 2

然后dump_info_libpciaccess程序报告 PCIe 设备和根联合体已在以下位置进行协商5 GT/s

$ dump_info/dump_info_libpciaccess 
domain=0000 bus=01 dev=00 func=00
  vendor_id=10ee (Xilinx Corporation) device_id=7024 ((null)) subvendor_id=0002 subdevice_id=0009
  control: I/O- Mem+ BusMaster+ ParErr- SERR- DisINTx-
  status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
  bar[0] base_addr=f0110000 size=4000 is_IO=0 is_prefetchable=1 is_64=1
  bar[2] base_addr=f0100000 size=10000 is_IO=0 is_prefetchable=1 is_64=1
  Capabilities: [40] Power Management
  Capabilities: [48] Message Signaled Interrupts
  Capabilities: [60] PCI Express v2 Express Endpoint, MSI 0
    Link capabilities: Max speed 5.0 GT/s Max width x4
    Negotiated link status: Current speed 5.0 GT/s Width x4
    Link capabilities2: Not implemented
    DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
            RlxdOrd- ExtTag+ PhantFunc- AuxPwr- NoSnoop+
    DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
  domain=0000 bus=00 dev=01 func=00
    vendor_id=8086 (Intel Corporation) device_id=0101 (Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port) subvendor_id=8086 subdevice_id=2002
    control: I/O+ Mem+ BusMaster+ ParErr- SERR- DisINTx+
    status: INTx- <ParErr- >TAbort- <TAbort- <MAbort- >SERR- DetParErr-
    Capabilities: [88] Bridge subsystem vendor/device ID
    Capabilities: [80] Power Management
    Capabilities: [90] Message Signaled Interrupts
    Capabilities: [a0] PCI Express v2 Root Port, MSI 0
      Link capabilities: Max speed 5.0 GT/s Max width x16
      Negotiated link status: Current speed 5.0 GT/s Width x4
      Link capabilities2: Not implemented
      DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
              RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
      DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
      SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
             Slot #0 PowerLimit 0.000W; Interlock- NoCompl+

即,已成功使用脚本更改 PCIe 链路速度,而无需重新启动。

还有test_dma_bridge_parallel_streams.c为测量基于 FPGA 的 PCIe 设备实现的 DMA 吞吐量而编写的程序显示吞吐量有所增加。该程序报告过去 10 秒内实现的吞吐量。在以下示例开始时,PCIe 设备的速度为 2.5 GT/s,pcie_set_speed.sh脚本在测试运行时更改 PCIe 设备链路速度,测得的吞吐量有所增加:

  0000:01:00.0 0 -> 1 381.186 Mbytes/sec (3811835904 bytes in 9.999928 secs)
  0000:01:00.0 1 -> 0 381.186 Mbytes/sec (3811835904 bytes in 9.999928 secs)

  0000:01:00.0 0 -> 1 381.193 Mbytes/sec (3811966976 bytes in 10.000095 secs)
  0000:01:00.0 1 -> 0 381.193 Mbytes/sec (3811966976 bytes in 10.000095 secs)

  0000:01:00.0 0 -> 1 680.225 Mbytes/sec (6802243584 bytes in 9.999985 secs)
  0000:01:00.0 1 -> 0 680.226 Mbytes/sec (6802243584 bytes in 9.999983 secs)

  0000:01:00.0 0 -> 1 737.226 Mbytes/sec (7372210176 bytes in 9.999935 secs)
  0000:01:00.0 1 -> 0 737.219 Mbytes/sec (7372210176 bytes in 10.000023 secs)

  0000:01:00.0 0 -> 1 737.226 Mbytes/sec (7372275712 bytes in 10.000028 secs)
  0000:01:00.0 1 -> 0 737.226 Mbytes/sec (7372275712 bytes in 10.000027 secs)

对于上述情况,我们使用的是不支持安全启动的 PC。该脚本的一项限制pcie_set_speed.sh是它用于setpci更改链接速度。如果启用了安全启动,Linux 内核封锁然后阻止setpci执行更改链路速度所需的 PCIe 配置寄存器写入操作。

相关内容