私は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が「スリープ」または「デフォルト」ポリシーを使用しないように強制できます。
pcie_aspm=off
1つのカーネルでのみこれをテストし、/boot/grub/grub.conf
デフォルトでLinuxを起動する「カーネル」行にこのオプションを追加します。 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
デバイスのターゲットリンク速度を変更できるスクリプトがあります。このスクリプトは、カーネル(RHELベースなど)を含むAlma 8.9で正常に使用されました4.18.0-513.18.1.el8_9.x86_64
。
PCIeカードにはザイリンクスKintex-7 FPGAがあります。
- FPGA PCIe IPは、4レーンのPCIe 2速度で動作するように設定されています。
- PCIeカードは16レーンスロットにあり、PCIe 2速度をサポートするIntel i5-2310 CPUを搭載しています。
PCIeインターフェイスはPCIe 1速度(2.5GT / 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
。
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リンク速度を変更するためにスクリプトが正常に使用されました。
しかもtest_dma_bridge_parallel_streams.cFPGAベースのPCIeデバイスで実装されたDMAスループットを測定するために作成されたプログラムでは、スループットが増加したことがわかりました。プログラムは、過去10秒間に達成されたスループットを報告します。次の例では、最初にPCIeデバイス速度が2.5GT / 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)
上記の状況では、Secure BootをサポートしていないPCを使用しています。このスクリプトの1つの制限は、リンク速度を変更するpcie_set_speed.sh
ために使用されることです。setpci
セキュアブートが有効な場合のLinuxカーネル封じ込めsetpci
その後、リンク速度を変更するために必要なPCIe設定レジスタへの書き込みがブロックされます。