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 (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 を搭載:

  1. FPGA PCIe IP は、4 レーンの PCIe 2 速度で動作するように設定されました。
  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 構成レジスタへの書き込みが実行されないようにします。

関連情報