우리는 비실시간 커널(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
;lsmod
ls -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 소켓에 연결되는 방법을 자세히 살펴보는 것부터 시작해야 합니다.
인터럽트 밸런스여기에서는 일반적으로 잘 수행되지만 필요에 맞게 동작을 구성할 수 있습니다.