ftrace 정확도를 마이크로초 단위로 향상시키는 방법은 무엇입니까?

ftrace 정확도를 마이크로초 단위로 향상시키는 방법은 무엇입니까?

다음을 사용하여 Android 환경에서 FTrace 파일을 생성하려고 합니다.

root@adroid:# echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
root@adroid:# echo 1 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# cat /sys/kernel/debug/tracing/trace > mytracefile.txt
root@adroid:# echo 0 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# echo 0 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable

문제는 mytracefile.txt타임스탬프의 정밀도가 밀리초 단위라는 것입니다.

          <idle>-0     [000] d.h7 14186.690000: sched_wakeup: comm=tfm_b6bcf800 pid=1714 prio=35 success=1 target_cpu=000
          <idle>-0     [000] d..3 14186.690000: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=tfm_b6bcf800 next_pid=1714 next_prio=35
    tfm_b6bcf800-1714  [000] d..3 14186.690000: sched_switch: prev_comm=tfm_b6bcf800 prev_pid=1714 prev_prio=35 prev_state=D|W ==> next_comm=swapper/0 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
 Player Aud Mixe-146   [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=D ==> next_comm=swapper/1 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
 Player Aud Mixe-146   [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=S ==> next_comm=swapper/1 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.700000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.700000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35

일반적으로 14186.690000이 아니라 14186.691234와 같이 마이크로초 단위여야 합니다.

제가 가지고 있는 다른 모든 옵션(로컬, 글로벌, 카운터)을 테스트했지만 trace_clock결과는 항상 동일했습니다. 이 매개변수를 변경해도 출력 파일에서는 아무 것도 변경되지 않습니다.

조심스럽게 따라갔어FTrace 문서하지만 구성에서 또 무엇을 변경해야 하는지 모르겠습니다.

인터넷 검색에서 이 버그 보고서만 찾았지만 해결 방법은 없습니다.http://lists.linaro.org/pipermail/linaro-dev/2011-February/002720.html

어떤 제안이 있으십니까?

커널에 설치해야 하는 다른 모듈이 있습니까?

  • 안드로이드 버전: 4.2.2
  • 리눅스 커널 버전: 3.4.7

dmesg출력에는 밀리초 정밀도도 표시됩니다.

<4>[   38.130000] oom_adj 0 => oom_score_adj 0
<4>[   38.130000] oom_adj 1 => oom_score_adj 58
<4>[   38.140000] oom_adj 2 => oom_score_adj 117
<4>[   38.140000] oom_adj 4 => oom_score_adj 235
<4>[   38.150000] oom_adj 9 => oom_score_adj 529
<4>[   38.150000] oom_adj 15 => oom_score_adj 1000

고쳐 쓰다:

우리는 안드로이드 ftrace 파일(포함)에 대한 그래프 파서를 구축하고 있습니다.아틀라스추적하다). 그렇기 때문에 가능한 최고의 정확도를 갖는 것이 중요합니다.

동일한 장비와 기타 소프트웨어 도구를 사용하여 마이크로초 정확도를 성공적으로 달성할 수 있습니다.

이제 편집할 계획입니다.ftrace.c타임스탬프 생성 방법을 다음 소스 코드로 수정합니다.

static inline uint64_t my_custom_jiffies(void)
{
         struct timeval tv;
         gettimeofday(&tv, NULL);
         return tv.tv_sec*1000000 + tv.tv_usec;
}

개인적으로 나는 이것이 소스 코드를 수정하지 않고도 가능해야 하기 때문에 이것이 아주 좋은 솔루션/아키텍처/구현이라고 생각하지 않습니다. 그러나 이것이 현재 우리가 가지고 있는 유일한 아이디어입니다.

어떻게 생각하나요?

답변1

분명히 이 문제는 Android와 관련이 없습니다. 사용자 정의 Linux 빌드로 테스트했지만 여전히 동일한 문제가 있습니다.FTrace밀리초 정밀도를 생성하는 반면 다른 도구는 마이크로초 정밀도를 생성할 수 있습니다. 어쩌면 FTrace 모듈 버전 문제일까요?

인사,

답변2

기본적으로 ftrace는 "sched_clock()" 코드에서 사용하는 모든 것을 사용합니다. 그러나 /sys/kernel/tracing/trace_clock 파일에서 ftrace 시계를 변경할 수 있습니다. x86에는 다음이 있습니다.

# cat /sys/kernel/tracing/trace_clock 
[local] global counter uptime perf mono mono_raw boot x86-tsc

"로컬" 시계는 sched_clock()과 동일합니다. 하지만 에코를 통해 다른 시계를 선택할 수 있습니다. x86-tsc를 시계로 사용하려면 다음을 수행합니다.

# echo x86-tsc > /sys/kernel/tracing/trace_clock

아키텍처 코드는 ARCH_TRACE_CLOCKS를 정의하여 새 시계를 추가할 수 있습니다. Arch/x86/include/asm/trace_clock.h에 있는 x86-tsc가 생성되는 방법을 확인하세요.

관련 정보