принудительное повторное согласование скорости PCIe в Linux

принудительное повторное согласование скорости PCIe в Linux

Я работаю с картами PCIe Gen 3, и время от времени они, похоже, откатываются до скоростей PCIe 1 или 2 (согласно lspci, а также по пропускной способности).

При перезагрузке/выключении и включении питания компьютера в большинстве случаев скорость возвращается к полной скорости PCIe Gen 3.

Существует ли менее навязчивый способ принудительного повторного согласования скорости соединения PCI (попытка вернуть ее к PCI Gen 3), например, на RHEL6?

решение1

Вы можете проверить свою политику энергопотребления PCIe в этом файле:

# cat /sys/module/pcie_aspm/parameters/policy

Поскольку Gen3 довольно прост в управлении питанием через ASPM (Active-State Power Management), это может быть основной причиной проблемы на вашей шине: пропускная способность низкая, поэтому модули снижают скорость, но забывают увеличить ее снова, когда это необходимо (если необходимо). Вы можете принудительно включить grub, чтобы избежать использования политики "powersave" или "default", отключив aspm с помощью следующего параметра:

pcie_aspm=off

Проверьте это только на одном ядре, добавив эту опцию в /boot/grub/grub.confстроку "kernel" вашего загрузчика Linux по умолчанию. Пример конфигурации grub, извлеченный из документации Red Hat:

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ядром.

Имеем ПЛИС Xilinx Kintex-7 на карте PCIe:

  1. Плата FPGA PCIe IP была настроена на работу на скорости PCIe 2 с 4 полосами.
  2. Карта PCIe установлена ​​в слоте на 16 линий с процессором Intel i5-2310, поддерживающим скорость PCIe 2.

Замечено, что интерфейс PCIe был согласован на скорости PCIe 1 (2,5 ГТ/с):

$ 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запуске скрипта, написанного Алексом Форенчичем, он сообщил, что скорость соединения была изменена с 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.cПрограмма, написанная для измерения пропускной способности DMA, достигнутой устройством PCIe на базе FPGA, показала увеличение пропускной способности. Программа сообщает о пропускной способности, достигнутой за последние 10 секунд. В начале следующего примера устройство PCIe имело скорость 2,5 ГТ/с, скрипт 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. Одним из ограничений скрипта pcie_set_speed.shявляется то, что он использует setpciдля изменения скорости соединения. Если включена безопасная загрузка, ядро ​​Linuxкарантинзатем предотвращает setpciвыполнение записи в регистры конфигурации PCIe, что необходимо для изменения скорости соединения.

Связанный контент