가끔 CPU 커널 돼지 찾기


11

적당한 속도의 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입니다.

범인을 추적하기 위해 어떤 도구를 사용할 수 있습니까?


2
흥미로운 질문에 대한 보너스 포인트. 어떻게 대답 해야할지 모르겠지만 (예를 들어 iowait의 급증과 달리) CPU 사용량으로 다시 추적하는 방법에 대한 질문이 있습니까?
Bratchley

1
첫 번째 추측은 대형 NAND 플래시에서 JFFS2 또는 YAFFS를 실행중인 경우, 특히 녹화중인 경우입니다. 플래시에 쓰는 것을 비활성화하고 도움이되는지 확인하십시오. 프로세스 테이블은 어떻게 생겼습니까? 커널을 빌드 할 툴체인이 있으면 ftrace를 최후의 수단으로 사용할 수 있습니다.
조나단 벤-아브라함

sar -bu 수도 있습니다. linux.die.net/man/1/sar
Grizly

사용중인 플래시가 있습니다. ext4 파일 시스템이 마운트 된 SD 카드 그리고 그것에 대한 글은 실제로 이러한 문제의 원인 일 수 있지만 (왜, 정확히?) 유일하지는 않습니다.
awy

답변:


1

perf도움이 될 수 있습니다. 리눅스 커널 유틸리티의 일부입니다.

예를 들어 :

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 

모든 syscall 시작 / 종료 시간 및 매개 변수 (strace와 같은)를 표시하고 syscall을 호출하는 2 진의 이름을 제공하며 일정한 빈도 (커널 기호 포함)로 각 CPU의 호출 스택을 샘플링합니다. 따라서 실제로 시스템 호출 중에 어떤 코드가 실행되었는지 확인할 수 있습니다. 멀티 프로세서 시스템에서는 CPU ID (예 : [001])에주의를 기울여야합니다.


플랫폼을 위해 perf를 빌드하는 방법을 살펴 보겠습니다. 팁 덕분입니다.
awy

0

어쩌면 atop문제에 약간의 빛을 비출 수 있습니다.

이미 종료 된 프로세스를 표시 할 수 있으며 CPU , 메모리 , 디스크네트워크 사용률을 표시 할 수 있습니다 .

대화식으로 실행하거나 텍스트 파일에 쓰거나 sar미리 정의 된 간격으로 실행 하여 나중에 단계별로 실행할 수있는 이진 기록 파일을 만들 수 있습니다.

나는 찾기 어려운 모든 종류의 돼지를 찾는 데 사용합니다 :-)

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