我正在使用 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。
$ 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 配置暫存器寫入操作。