적당한 속도의 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 poll ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0.000585 poll ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 0.000302 poll ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 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 poll ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 0.000475 poll ([{fd = 10, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = 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, events = POLLIN | POLLERR | POLLNVAL}, {fd = 6, events = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1
이 경우 마지막 두 번째 통화는 10ms (일반)가 걸리는 것으로 기록 되더라도 마지막 통화 전 953ms입니다.
범인을 추적하기 위해 어떤 도구를 사용할 수 있습니까?