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(활성 상태 전원 관리)을 통한 매우 간단한 전원 관리 기능이 있으므로 이것이 버스 문제의 근본 원인일 수 있습니다. 처리량이 낮아 모듈이 속도를 낮추지만 필요한 경우 속도를 다시 높이는 것을 잊어버립니다. 다음 매개변수를 사용하여 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장치의 대상 링크 속도를 변경할 수 있는 스크립트 가 있습니다 . 이 스크립트는 커널(예: RHEL 기반)이 포함된 Alma 8.9에서 성공적으로 사용되었습니다 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_libpciaccessPCIe 장치와 루트 콤플렉스가 다음 위치에서 협상되었음을 보고합니다 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 구성 레지스터 쓰기가 차단됩니다 .

관련 정보