Linux 커널을 수백 밀리초 동안 강제로 "정지"(또는 거의 정지)시키는 방법

Linux 커널을 수백 밀리초 동안 강제로 "정지"(또는 거의 정지)시키는 방법

우리는 비실시간 커널(CentOS 6)에서 실시간 프로세스를 실행하고 있으며 이는 변경되지 않을 수 있습니다.

한 번에 1.5시간 동안 맞춤형 FPGA에서 약 500MB/s의 PCIe 트래픽이 필요한 스트리밍 비디오 애플리케이션이 있습니다. 이 앱은 대부분 잘 작동합니다. 그러나 커널이 한 번에 최대 500밀리초 동안 PCIe 서비스 또는 메모리 요청에 응답하지 않는 것처럼 보이는 상황도 발생했습니다. 이는 다른 스레드에서 파일 IO가 급증하는 동안 발생하는 것 같습니다. 메인 애플리케이션이 실행되는 동안 사용자 공간에서 많은 가상 파일 IO를 수행하여 이 문제를 재현하는 것이 불가능하다는 것을 알았습니다.

이 문제를 재현할 수 있도록 Linux 커널의 전역 "정지"(특히 PCIe 또는 모든 DDR3 메모리 액세스 등을 중지)를 강제(시뮬레이트)할 수 있는 방법이 있습니까?

이제 내부 FPGA 메모리에 최대 10밀리초의 버퍼가 있지만 이것만으로는 충분하지 않습니다. FPGA DDR3으로 버퍼링한 다음 호스트로 덤프할 수 있지만 강제로 이 새로운 기능을 테스트할 방법이 필요합니다.

우리는 커널이 영구적으로 멈추거나 잠기는 것을 원하지 않습니다. 우리는 시간 간격을 설정할 수 있기를 원합니다.

/proc/sys/vm나는 시스템을 거의 크롤링 상태로 만들었다가 수백 밀리초 후에 다시 작동하는 마법의 값을 일시적으로 작성하는 것과 같은 것을 찾고 있지만 이를 깨뜨릴 수 있는 가능한 방법의 수를 살펴보는 것은 실제로 초보자와 같은 초보자에게는 적합하지 않습니다 . 나 (https://www.kernel.org/doc/Documentation/sysctl/vm.txt). 어쩌면 numactl마술일까요?

답변1

빠른 테스트를 위한 한 가지 옵션은 KGDB 지원 커널을 사용하고 수동으로 커널을 중지하고 테스트하는 것입니다.이 링크를 봤어.

반면에 나는 여러분을 잠시 멈추게 할 만한 것들을 기억합니다.

  • cpufreq, cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency값은 ns(내 AMD FX(tm)-8120 옥타 코어 프로세서에서는 4000)이며 문제가 되지 않지만 확인하시기 바랍니다.
  • CPU 자체 또는 전압 조정기 모듈의 열 조절.
  • 높은 NAPI 및/또는 네트워크 트래픽
  • PCIe ASPM( cat /sys/module/pcie_aspm/parameters/policy)
  • 대상 장치(하드디스크, 네트워크 카드...)의 버퍼에 경합이 있습니다.
  • PCIe 버스의 일부 장치 펌웨어에 버그가 있습니다(사용하지 않더라도). 다음 명령을 사용하여 전원을 꺼볼 수 있습니다./sys/bus/pci/devices/$DEVICE/power/control

답변2

귀하의 애플리케이션이 FPGA와 통신하는 방법에 대해 더 자세히 알아볼 수 있습니까? 애플리케이션이 FPGA에서 버퍼를 읽고 있습니까, 아니면 FPGA가 코어(예: 네트워크 카드)에 인터럽트를 보내고 있습니까?

나는 그것이 /dev에서 블록/문자를 열고 그것과 통신하기를 원합니다. 이는 드라이버를 사용하여 응용 프로그램과 /dev/XXX 파일 간의 통신을 의미합니다.

내가 원하는 출력 : cat /proc/interrupts;lsmodls -al /dev/yourmod

아이디어는 다음과 같습니다.

  • 인터럽트 구동인 경우 해당 IRQ를 비활성화한 다음 다시 활성화하도록 CPU PIC를 설정할 수 있습니다. 이렇게 하면 카드의 모든 요청이 무시됩니다(카드는 이에 대해 알지 못합니다).
  • 버퍼처럼 읽으면 다음을 수행할 수 있습니다.
    • FPGA의 데이터가 읽히지 않고 버퍼가 가득 차도록 애플리케이션을 절전 모드로 전환한 다음 애플리케이션을 깨우고 계속해서 읽습니다.
    • "crash" 또는 "kgdb"를 사용하여 몇 초 동안 "read" 값을 "noop"으로 변경한 다음 다시 기본 기능으로 설정합니다.

유용하다고 생각되는 정보를 제공해 주세요.

답변3

그것이 도움이 되는지 확실하지 않습니다. 그러나 suspend다른 장치의 커널 모듈 기능을 호출하는 커널 모듈을 작성할 수 있다면 괜찮을 것입니다.

각 PCI 장치는 헤더 파일을 기반으로 일시 중지될 수 있습니다.http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479

예를 들어 Intel e1000 네트워크 카드의 일시 중지 기능은 다음과 같습니다.http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

내가 아는 한, 이 기능은 주로 시스템이 최대 절전 모드 상태에 들어갈 때 사용되며 장치 드라이버는 현재 실행 상태를 저장하고 자체 종료해야 합니다.

답변4

나는 당신의 생각이 잘못된 것 같아요. 당신의 목표는 분명합니다.

나머지 프로세스를 정지시키는 대신 실시간 스케줄링에 가까운 우선순위를 메인 프로세스에 부여하는 방식이다. 사용좋아요중요한 사용자 공간 프로세스를 위한 것입니다.

더 어려운 문제는 커널 공간에 상주하는 PCIe 인터럽트 처리입니다.

관련된 하드웨어가 있으므로 마더보드에 관련된 PCIe 레인과 특정 CPU 소켓에 연결되는 방법을 자세히 살펴보는 것부터 시작해야 합니다.

인터럽트 밸런스여기에서는 일반적으로 잘 수행되지만 필요에 맞게 동작을 구성할 수 있습니다.

관련 정보