私は 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 (Active-State Power Management) による電源管理が非常に簡単なので、これがバスの問題の根本的な原因である可能性があります。スループットが低いため、モジュールは速度を下げますが、必要なときに (必要な場合) 再び速度を上げることを忘れます。次のパラメータで aspm を無効にすることで、grub で "powersave" または "default" ポリシーの使用を回避するように強制できます。
pcie_aspm=off
デフォルトのブート Linux の「kernel」行にこのオプションを追加して、1 つのカーネルだけでこれをテストします/boot/grub/grub.conf
。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
デバイスのターゲット リンク速度を変更できるスクリプトがあります。そのスクリプトを4.18.0-513.18.1.el8_9.x86_64
カーネル付きの Alma 8.9 (つまり RHEL ベース) で正常に使用しました。
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+
上記の出力は、ダンプ情報_libpciaccess.cプログラムです。特定の PCI デバイスから開始し、PCI トポロジをルート コンプレックスまで下っていきます。上記は、PCIe デバイスとルート コンプレックスの両方が をサポートしていることを示しています5.0 GT/s
が、 で実行されていました2.5 GT/s
。
Alex Forencich によって書かれたスクリプトを実行するとpcie_set_speed.sh
、リンク速度が 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 リンク速度を変更することに成功しました。
また、テスト_dma_bridge_parallel_streams.cFPGA ベースの 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を使用していました。スクリプトの制限の1つは、リンク速度を変更するpcie_set_speed.sh
ことです。セキュアブートが有効になっている場合、Linuxカーネルsetpci
ロックダウンsetpci
リンク速度を変更するために必要な PCIe 構成レジスタへの書き込みが実行されないようにします。