Я работаю с картами 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:
- Плата FPGA PCIe IP была настроена на работу на скорости PCIe 2 с 4 полосами.
- Карта 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, что необходимо для изменения скорости соединения.