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が「スリープ」または「デフォルト」ポリシーを使用しないように強制できます。

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があります。

  1. FPGA PCIe IPは、4レーンのPCIe 2速度で動作するように設定されています。
  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_libpciaccessPCIeデバイスとルートコンプレックスが次の場所でネゴシエートされたことを報告します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設定レジスタへの書き込みがブロックされます。

関連情報