C로 작은 애플리케이션을 만들었습니다.
- 5MB의 문자 버퍼 2개를 할당합니다.
- 1000번 반복
- array1 또는 array2의 모든 요소는 루프에서 합산(교대)하므로 내부 루프에서는 500만 개의 추가가 수행됩니다.
- 이 내부 루프의 시간을 측정합니다(시계 단조).
- 내부 루프에 필요한 최소/최대 및 평균 시간을 확인하세요.
놀랍게도 IMX8의 지터 계수는 거의 1.6..2.0이므로 1000개의 루프 중 한 번은 약 4.5ms, 적어도 거의 9ms입니다. 평균은 약 4.6밀리초이지만 더 오래 걸리는 것은 단지 한두 번의 루프가 아닙니다.
이는 스케줄러 설정과 관련이 없으므로 스케줄러 FIFO와도 관련이 없습니다. 주파수 스케일링이 활성화되지 않습니다. 코어 수에 의존하지 않습니다.
버퍼는 RAM(512MB)에 들어갈 만큼 작지만 레벨 1/2 캐시에 맞지 않을 만큼 큽니다.
이 지터의 원인이 무엇인지 잘 모르겠습니다. Zynq 프로세서를 사용하는 기존 시스템에서는 지터가 거의 없었습니다.
-O3으로 컴파일합니다. -O0을 사용할 때 지터는 없지만 실행이 매우 느립니다(루프에 5ms가 아닌 50ms가 소요됨).
Trace-cmd를 사용하여 무슨 일이 일어나고 있는지 알아내려고 노력하고 있지만 결과를 실제로 읽을 수는 없습니다. 필터링해야 합니다. 그렇지 않으면 많은 이벤트가 손실됩니다. 하지만 무엇을 찾아야 할까요? 어떤 아이디어가 있나요?
또한 이 작업을 수행하려면 코어 1개를 분리해 보세요. 결과는 비슷합니다. 그래서 나는 스케줄러를 신뢰하지 않지만 메모리 하위 시스템에 문제가 있습니다.