ftrace

markyang92·2023년 1월 17일
0

debug

목록 보기
1/1
  1. 인터럽트, 스케줄링, 커널 타이머 등의 커널 동작을 상세히 추적
  2. 함수 필터를 지정하면 지정한 함수를 호출한 함수와 전체 콜 스택까지 출력
  3. 함수를 어느 프로세스가 실행하는지 알 수 있음
  4. 함수가 실행된 시각 정보를 알 수 있음
  5. ftrace 로그를 활성화해도 시스템 동작에 부하를 거의 주지 않음

ftrace 커널config

CONFIG_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_STACK_TRACER=y
CONFIG_TRACER_SNAPSHOT=y

yocto에서 메뉴설정

$ bitbake -c menuconfig virtual/kernel


ftrace 사용

  • ftrace를 사용하려면, debugfs 파일시스템을 마운트 해야한다.
  • 보통 먼저 /sys/kernel/debug 디렉토리에 있다.
# mount -t debugfs none /sys/kernel/debug
  • Ftrace에 대한 모든 제어 파일은 /sys/kernel/debug/tracing 디렉토리에 있다.

  • 커널에서 사용할 수 있는 트레이서 목록
# cat /sys/kernel/debug/tracing/available_tracers

  • 실행 중인 트레이서는 current_tracer에 의해 표시되며, 처음에는 널 트레이서(nop)이다.

  • 추적을 캡쳐하려면, current_traceravailable_tracers 중 하나의 이름을 씀으로써 트레이서를 선택한다. 그 후 잠시 동안 다음 예제처럼 추적을 활성화 한다.

# echo function > /sys/kernel/debug/tracing/current_tracer
# echo 1 > /sys/kernel/debug/tracing/tracing_on
# sleep 1
# echo 0 > /sys/kernel/debug/tracing/tracing_on
  • 1초 안에 추적 버퍼에는 커널이 호출하는 모든 함수의 세부사항으로 채워질 것이다.
  • trace 파일에서 추적 버퍼를 읽을 수 있다.
# cat /sys/kernel/debug/tracing/trace

.... 너무 많이 나온다.

# head -n 20 /sys/kernel/debug/tracing/trace


이와 같은 flat function 목록을 이해하긴 어렵다.

  • function_graph 트레이서를 선택하자.
# echo function_graph > /sys/kernel/debug/tracing/current_tracer
# echo 1 > /sys/kernel/debug/tracing/tracing_on
# sleep 1
# echo 0 > /sys/kernel/debug/tracing/tracing_on
# head -n 20 /sys/kernel/debug/tracing/trace

  • { }가 중첩된 함수 호출을 볼 수 있다.
    • 함수에 걸린 시간을 측정하고 10us{10us} 초과시 + 부호
    • 100us{100us} 초과시 ! 부호

단일 프로세스 또는 스레드로 인해 발생하는 커널 활동에만 관심이 있는 경우 스레드 ID를 set_ftrace_pid에 씀으로써 단일 스레드로의 추적으로 제한할 수 있다.


동적 Ftrace 및 trace 필터

  • CONFIG_DYNAMIC_FTRACE를 사용하면, Ftrace가 런타임에 함수 추적하는 곳을 수정할 수 있는데, 이 것은 몇 가지 이점이 있다.
  1. 추적 함수 probe를 빌드 진행 중에 추가로 트리거 할 수 있는데, 이로 인해 Ftrace 서브 시스템이 부팅 시에 이들을 찾아내어 NOP명령으로 덮어쓸 수 있다. 따라서 함수 추적 코드의 오버헤드를 거의 없게 만든다. 그런 다음 성능에 영향을 미치지 않고 완성 또는 거의 완성된 커널에서 Ftrace를 사용할 수 있다.
  2. 모든 것을 추적하기보다 선택적으로 함수 추적하는 곳을 활성화할 수 있다. 함수 목록은 available_filter_functions에 저장되며 수만 개가 있다. available_filter_functions에서 set_ftrace_filter로 이름을 복사해 함수 추적을 선택적으로 활성화할 수 있으며, 그런 다음 set_ftrace_notrace에 이름을 작성해 해당 함수 추적을 중지한다. 와일드카드를 사용할 수 있고, 목록에 이름을 추가할 수도 있다.
# cd /sys/kernel/debug/tracing
# echo "tcp*" > set_ftrace_filter
# echo function > current_tracer
# echo 1 > tracing_on
# cat trace

echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"

echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"

echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter init"

echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"

echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable

echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable

echo 1 > /sys/kernel/debug/tracing/events/raw_syscalls/enable
sleep 1
echo "event enabled"

echo schedule ttwu_do_wakeup > /sys/kernel/debug/tracing/set_ftrace_filter

sleep 1
echo "set_ftrace_filter enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 > /sys/kernel/debug/tracing/options/sys-offset
echo "function stack trace enabled"

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
  • sleep 11초 동안 딜레이를 준다.
  • ftrace 설정 명령어를 입력하면 커널 내부에서 ftrace를 설정하는 함수가 실행된다. 이 때 ftrace설정 명령어를 커널 내에서 충분히 수행할만한 시간을 확보하기 위해 딜레이를 주는 것이다.

tracing_on: 트레이서 활/비활성화하기

  • ftrace를 활성화/비활성화 하려면 tracing_on 파일을 설정해야한다.
  • tracing_on은 부팅 후 기본적으로 0으로 설정돼어 있다.
echo 0 > /sys/kernel/debug/tracing/tracing_on
...
echo 1 > /sys/kernel/debug/tracing/tracing_on
  • 먼저 echo 0으로 tracing_on 파일에 0을 저장한다.
    • 이는 ftrace를 비활성화한다.
  • echo 1으로 tracing_on파일에 1을 저장하는 것은 ftrace를 활성화 한다.
  • tracing_on: ftrace를 활성/비활성 하기 위한 설정파일

tracer 설정

  • ftracenop, function, function_graph 같은 트레이서를 제공한다.
    • nop: 기본 트레이서. ftrace 이벤트만 출력한다.
    • function: 함수 트레이서. set_ftrace_filter로 지정한 함수를 누가 호출하는지 출력한다.
    • function_graph: 함수 실행 시간과 세부 호출 정보를 그래프 포맷으로 출력한다.

  • tracer 설정
    • 다음과 같이 current_tracer 파일에 트레이서의 이름을 저장해야한다.
echo function > /sys/kernel/debug/tracing/current_tracer
  • 라즈베리파이는 부팅되면 current_tracer 파일에 기본적으로 nop 트레이서가 설정되어 있음
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글