Estou trabalhando com placas PCIe Gen 3 e de vez em quando elas parecem voltar às velocidades PCIe 1 ou 2 (de acordo com lspci e também observadas pelo rendimento).
Ao reiniciar/desligar e ligar a máquina, a velocidade volta para a velocidade total do PCIe Gen 3 na maioria dos casos.
Existe uma maneira menos intrusiva de forçar uma renegociação da velocidade do link PCI (tentando trazê-la de volta ao PCI Gen 3) por exemplo, no RHEL6?
Responder1
Você pode verificar sua política de energia PCIe neste arquivo:
# cat /sys/module/pcie_aspm/parameters/policy
Como o Gen3 é bastante direto no gerenciamento de energia através do ASPM (Active-State Power Management), esta pode ser a causa raiz do problema em seu barramento: A taxa de transferência é baixa, então os módulos reduzem a velocidade, mas se esquecem de aumentá-la novamente quando necessário (se necessário). Você pode impor o grub para evitar o uso da política "powersave" ou "default" desabilitando o aspm com o seguinte parâmetro:
pcie_aspm=off
Teste isso em apenas um kernel anexando esta opção na /boot/grub/grub.conf
linha "kernel" do seu Linux de inicialização padrão. Exemplo de configuração do grub extraída dos documentos da 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
Responder2
Velocidade definida PCIepossui um pcie_set_speed.sh
script que pode alterar a velocidade do link de destino de um dispositivo. Usei esse script com sucesso no Alma 8.9 (ou seja, baseado em RHEL) com um 4.18.0-513.18.1.el8_9.x86_64
Kernel.
Tenha um FPGA Xilinx Kintex-7 em uma placa PCIe:
- O FPGA PCIe IP foi configurado para funcionar na velocidade PCIe 2 com 4 pistas.
- A placa PCIe está em um slot de 16 pistas, com uma CPU Intel i5-2310 que suporta velocidade PCIe 2.
Notei que a interface PCIe foi negociada na velocidade 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+
A saída acima é dodump_info_libpciaccess.cprograma. Ele começa em um determinado dispositivo PCI e percorre a topologia PCI até o complexo raiz. A imagem acima mostra o suporte ao dispositivo PCIe e ao complexo raiz 5.0 GT/s
, mas estava rodando em 2.5 GT/s
.
Quando o pcie_set_speed.sh
script escrito por Alex Forencich foi executado, ele relatou que a velocidade do link foi alterada de 1 para 2. O único argumento usado foi o dispositivo PCI para operar, fazendo com que o dispositivo PCIe tentasse negociar para sua velocidade de link mais rápida suportada:
$ 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
E o dump_info_libpciaccess
programa então relatou que o dispositivo PCIe e o complexo raiz foram negociados em 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+
Ou seja, um script foi usado com sucesso para alterar a velocidade do link PCIe sem a necessidade de reinicialização.
Também otest_dma_bridge_parallel_streams.cO programa que foi escrito para medir a taxa de transferência DMA alcançada pelo dispositivo PCIe baseado em FPGA mostrou um aumento na taxa de transferência. O programa relata o rendimento alcançado nos últimos 10 segundos. No início do exemplo a seguir, o dispositivo PCIe estava a uma velocidade de 2,5 GT/s, o pcie_set_speed.sh
script alterou a velocidade do link do dispositivo PCIe enquanto o teste estava em execução, o rendimento medido aumentou:
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)
Para o exposto, estava usando um PC que não suporta inicialização segura. Uma limitação do pcie_set_speed.sh
script é que ele usa setpci
para alterar a velocidade do link. Se a inicialização segura estiver habilitada, o Kernel do Linuxconfinamentoimpede setpci
a execução de gravações nos registros de configuração PCIe, necessárias para alterar a velocidade do link.