Linux 커널이 몇 백 밀리 초 동안“동결”(또는 거의 정지)하도록하는 방법


17

우리는 비 실시간 커널 (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마술일까요?


제 생각에는 커널 모듈을 작성해야한다는 것입니다. 어떻게 든 모든 CPU의 모든 스레드를 고정시키고 타이머 인터럽트에서 다시 시작해야합니다.
Gilles 'SO- 악마 그만해

스레드를 고정하고 싶지 않습니다. 커널을 고정하고 싶습니다! 즉, 하드웨어 (메모리 및 / 또는 PCIe 및 / 또는 디스크)에 짧은 시간 동안 액세스하지 못하게하고 싶습니다. 그래도 문제가 해결되지 않으면 최적화하지 않고 L1 캐시를 비활성화하는 등의 작업을 수행하지 않아도됩니다.
Mark Lakata

1
아, 그래서 당신은 커널을 멈추고 싶지 않다. 당신은 일부 하드웨어에 반응하는 커널 부분 만 멈추고 싶습니까? 또한 커널에 깊이 들어가야합니다.
질 'SO-정지 존재 악마'

하드웨어가 그 일부로 고정되는 한 커널을 완전히 고정시키는 것은 중요하지 않습니다.
Mark Lakata

1
호스트 CPU가 일부 IO 버퍼를 플러시하므로 (이 문제는 HDF5를 사용하여 파일을 쓰기 때문에)이 문제는 TLB 스 래싱과 관련이 있으며,이 TLB 스 래싱은 NUMA 시스템이므로 코 프로세서도 스 래시하게합니다. 우리가 지금 필요한 것은 프로그래밍 방식으로 제어 된 시간 동안 TLB 스 래싱을 일으키는 신뢰할 수있는 방법 일 것입니다.
Mark Lakata

답변:


9

빠른 테스트를 수행하는 한 가지 옵션은 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

kdb대신 kgdb똑같이 사용할 수 있습니까? 나는 한 번도 사용하지 않았습니다. 이것은 작년의 Sun 워크 스테이션에서 "Stop-A"명령 시퀀스와 같은 것입니까? 빠른 SysRq-g를 수행 한 다음 "go"를 입력하면 시스템이 중단되지 않을 가능성이 높습니까? (ref : kernel.org/pub/linux/kernel/people/jwessel/kdb/… )
Mark Lakata

1
아마도 kdb를 사용할 수있을 것입니다. USB 연결 키보드에서 작동하지만 PS / 2 키보드를 사용하는 것이 좋습니다. 그리고 이것은 매우 낮은 수준의 디버거 (커널 랜드)이므로 항상 백업을 유지하고 중단되면 두 가지를 모두 유지해야합니다 :).
Jorge Nerín

커널을 조정하기 전에 먼저 버스 (그래픽 드라이버)를 사용하고 시스템에서 물리적으로 장치를 제거하거나 전원을 끄는 PCIe 장치에 사용되지 않는 커널 모듈을 언로드하려고합니다. PCIe 1.0 x1의 대역폭은 250MB / s이고 PCIe 2.0 x1은 최대 500MB / s입니다. 원래 장치와 대상 장치 모두 중단없이 이러한 지속적인 속도를 수용 할 수 있습니까? 아니면 더 많은 차선이있어 더 많은 여유 공간이 있습니까?
Jorge Nerín

지연의 또 다른 원인은 일부 장치의 일부 ACPI 전원 관리 핸들러이거나 외부 이벤트를 기다리는 일부 SMM CPU 핸들러 일 수 있습니다.
Franki

2

어플리케이션이 FPGA와 통신하는 방법에 대한 자세한 정보를 얻을 수 있습니까? FPGA에서 버퍼를 읽는 애플리케이션입니까, 아니면 네트워크 카드와 같은 커널에 인터럽트를 보내는 FPGA입니까?

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

다음과 같은 출력을 원합니다. cat /proc/interrupts; lsmod;ls -al /dev/yourmod

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

  • 인터럽트 구동 인 경우 CPU PIC를 설정하여 해당 IRQ를 비활성화 한 다음 다시 활성화 할 수 있습니다. 이렇게하면 카드의 모든 요청이 무시됩니다 (카드가 인식하지 않은 상태).
  • 버퍼 읽기와 같은 경우 다음을 수행 할 수 있습니다.
    • 어플리케이션을 슬립 상태로두면 FPGA의 데이터를 읽을 수없고 버퍼가 채워진 다음 어플리케이션을 깨우고 계속 읽습니다.
    • "crash"또는 "kgdb"를 사용하여 "read"값을 몇 초 동안 "noop"으로 변경 한 다음 기본 기능으로 다시 설정하십시오.

유용하다고 생각되는 모든 정보를 제공하십시오.


FPGA는 호스트 메모리에 DMA 쓰기를 수행하며 이러한 중단 기간 동안 FPGA는 호스트 메모리에 쓸 수 없으므로 내부 FIFO 백업이 수행됩니다. 호스트 프로세스에 대한 메시지 기반 인터페이스가 있지만 (PCIe보다 우연)이 작업이 포함되지 않을 것이라고 확신합니다. 유효성 검사를 위해 기본적으로 FPGA 하드웨어가 호스트 메모리에 몇 백 밀리 초 동안 쓰는 것을 금지하는 방법이 필요합니다. 메모리 문제를 해결하고 싶지는 않지만 FPGA에서의 구현이 메모리 중단 (최대 1000ms)을 처리 할 수 ​​있는지 확인하고 싶습니다.
Mark Lakata

DMA를 사용한다면 , claim_dma_lock ()과 dma_disable ()에서 kernel.org/doc/Documentation/DMA-ISA-LPC.txt를 살펴볼 수 있습니다 . 그러나 FPGA가 사용하는 주소를 알아야합니다.
Adrien M.

1

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

헤더 파일 http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479 에 따라 각 PCI 장치를 일시 중지 할 수 있습니다 .

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

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


고맙지 만 그게 효과가 없다고 생각합니다. 실제로 장치를 일시 중지하고 싶지 않습니다. 커널은 장치가 최대 절전 모드를 준비하도록 지시합니다. 커널이 특정 장치 (이 경우 FPGA 도터 보드) 를 알지 못하고 (긴 대기 시간 또는 시간 초과 제외) 무시 하거나 모든 SDRAM 메모리 전송을 중지하고 싶습니다.
Mark Lakata

0

나는 당신이 잘못된 줄을 따라 생각하고 있다고 생각합니다. 당신의 목표는 분명합니다.

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

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

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

irqbalance 는 일반적으로 여기서 잘 작동하지만 필요에 맞게 바하 우어를 구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.