我正在使用 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:
- FPGA PCIe IP 设置为以 4 条通道在 PCIe 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 配置寄存器写入操作。