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에 적용할 수 있습니다.

pcie_aspm=off

/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장치의 대상 링크 속도를 변경할 수 있는 스크립트 가 있습니다 . 커널 을 사용하여 Alma 8.9(예: RHEL 기반)에서 해당 스크립트를 성공적으로 사용했습니다 4.18.0-513.18.1.el8_9.x86_64.

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.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_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.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를 사용하고 있었습니다. 스크립트 의 한 가지 제한 사항 은 링크 속도를 변경하는 데 pcie_set_speed.sh사용된다는 것입니다 . setpci보안 부팅이 활성화된 경우 Linux 커널폐쇄그런 다음 setpci링크 속도를 변경하는 데 필요한 PCIe 구성 레지스터에 대한 쓰기를 수행하지 못하게 됩니다.

관련 정보