중간 속도 ARMv7 프로세서에서 실행되는 2.6.35 PREEMPT 커널이 있습니다. 약 100~125초마다 한 번씩 커널이 언더런을 방지할 만큼 빠르게 특정 오디오 관련 드라이버를 처리할 수 없게 만드는 문제가 발생합니다. 유지 시간은 일반적으로 15~30ms 범위이지만 더 길어질 수도 있습니다. 이 지연이 전적으로 커널에서 발생하는지, 아니면 실시간 우선순위(SCHED_RR, 2)로 실행되는 사용자 프로세스의 스케줄링과 관련이 있을 수 있는지는 확실하지 않습니다.
내 추측으로는 선점 능력이 떨어지는 드라이버가 하나(적어도 하나) 있다는 것입니다.
사용자 프로세스의 일부 strace 출력은 정상 및 비정상 동작의 일부 측면을 보여줍니다. 다양한 시간 보고서를 해석하는 방법을 잘 모르겠습니다.
정상적인 상황:
0.000518 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3415) = 1 0.010202 poll([{fd=10, event=POLLIN|POLLERR|POLLNVAL}, {fd=6, event=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3404) = 1 0.000585 poll([{fd=10, event=POLLIN|POLLERR|POLLNVAL}, {fd=6, event=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3404) = 1 0.000302 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3404) = 1 0.010706 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL}, {fd=6, events=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3393) = 1 0.000480 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL}, {fd=6, events=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3392) = 1
fd6의 출력을 폴링할 때는 블로킹이 발생하지 않지만, fd10의 입력만 폴링할 때는 약 10ms 정도의 블로킹이 발생합니다. 이는 시스템 호출 기간 보고와 시스템 호출 간 시간(일관됨)에 모두 반영됩니다.
실패 사례(극단적인 예):
0.000305 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3543) = 1 0.010730 poll([{fd=10, event=POLLIN|POLLERR|POLLNVAL}, {fd=6, event=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3533) = 1 0.000475 poll([{fd=10, event=POLLIN|POLLERR|POLLNVAL}, {fd=6, event=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT}], 2, 3532) = 1 0.000329 poll([{fd=10, events=POLLIN|POLLERR|POLLNVAL, revents=POLLIN}], 1, 3532) = 1 0.953349 poll([{fd=10, event=POLLIN|POLLERR|POLLNVAL}, {fd=6, event=POLLOUT|POLLERR|POLLNVAL, revents=POLLOUT|POLLERR}], 2, 2578) = 1
이 예에서는 두 번째 호출이 10밀리초(정상)가 소요되는 것으로 기록되었음에도 불구하고 마지막 호출에서 여전히 953밀리초가 남았습니다.
범인을 추적하려면 어떤 도구를 사용할 수 있나요?
답변1
perf
당신에게 도움이 될 수도 있습니다. 이는 Linux 커널 유틸리티의 일부입니다.
예를 들어:
perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script
모든 시스템 호출 시작/종료 시간 및 매개변수(예: strace)를 표시하고, 시스템 호출을 호출한 바이너리의 이름을 제공하며, 일정 빈도(커널 기호 포함)로 각 CPU의 호출 스택을 샘플링합니다. 그러면 실제로 시스템 호출 중에 어떤 코드가 실행되는지 확인할 수 있습니다. 다중 프로세서 시스템에서는 CPU ID(예: [001])에 주의해야 합니다.
답변2
아마도atop
당신의 문제를 밝혀줄 수 있습니다.
종료된 프로세스를 표시할 수 있으며 표시할 수 있습니다.CPU,메모리,디스크그리고회로망이용.
대화형으로 실행하거나, 텍스트 파일에 쓰거나, sar
미리 정의된 간격으로 실행하여 나중에 실행할 수 있는 바이너리 기록 파일을 만들 수 있습니다.
찾기 힘든 온갖 종류의 돼지를 찾는 데 사용해요 :-)