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 8코어 프로세서에서는 4000) 단위이므로 문제가 되지 않지만 확인하십시오.
  • CPU 자체 또는 전압 조정기 모듈의 열 조절입니다.
  • NAPI 및/또는 과도한 네트워크 트래픽
  • PCIe ASPM( cat /sys/module/pcie_aspm/parameters/policy)
  • 대상 장치(하드 디스크, NIC...)의 버퍼 경합
  • PCIe 버스에 있는 일부 장치의 펌웨어 버그(사용하지 않는 경우에도) 다음을 사용하여 전원을 꺼볼 수 있습니다./sys/bus/pci/devices/$DEVICE/power/control

답변2

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

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

나는 다음의 출력을 갖고 싶습니다 : cat /proc/interrupts; lsmod;ls -al /dev/yourmod

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

  • 인터럽트 구동인 경우 CPU PIC를 설정하여 해당 IRQ를 비활성화한 다음 다시 활성화할 수 있습니다. 이렇게 하면 카드의 모든 요청이 무시됩니다(카드가 이를 인식하지 못함).
  • 버퍼 읽기와 같은 경우 다음을 수행할 수 있습니다.
    • 애플리케이션을 절전 상태로 설정하면 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 NIC의 일시 중지 기능은 다음과 같습니다.http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

내가 기억하는 바에 따르면 이 기능은 주로 시스템이 최대 절전 모드로 전환될 때 사용되었으며, 장치 드라이버는 현재 실행 상태를 저장하고 자체적으로 꺼야 합니다.

답변4

나는 당신이 잘못된 방향으로 생각하고 있다고 생각합니다. 당신의 목표는 분명합니다.

방법은 나머지 프로세스를 중지하는 것이 아니라 실시간 스케줄링에 가까운 주요 프로세스에 우선 순위를 부여하는 것입니다. 사용멋진이를 위한 중요한 사용자 공간 프로세스를 위해.

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

하드웨어가 관련되어 있으므로 메인보드의 관련 PCIe 레인과 이것이 특정 CPU 소켓에 어떻게 연결될 수 있는지 자세히 살펴보아야 합니다.

irqbalance여기서는 일반적으로 좋은 작업을 수행하지만 필요에 맞게 동작을 구성할 수도 있습니다.

관련 정보