[ Section 10 ] ftrace 설정하기

hyejinkwon·2024년 5월 7일

Linux Kernel

목록 보기
11/11
post-thumbnail

ftrace 소개

ftrace는 리눅스 커널에서 제공하는 가장 강력한 트레이서

ftrace의 특징

  • 인터럽트, 스케줄링, 워크큐와 같은 커널의 세부 동작을 상세히 트레이싱
  • 코드를 수정할 필요 없이 필터로 지정한 함수의 call stack 출력
  • printk에 비해 overhead가 아주 적은 편
    (binary format으로 처리)이라 ftrace 로그를 활성화해도 시스템 동작에 부하를 거의 주지 않음
  • 컨텍스트 정보와 CPU 번호 그리고 프로세스 정보 확인

ftrace의 단점

개발자에게 친화적인 툴

  • 리눅스 커널을 어느정도 알아야 ftrace 메시지 해석 가능
  • 처음에 ftrace에 익숙해지기까지 시간이 걸림

ftrace 설정

커널 설정 configration을 활성화

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
  • 라즈비안 커널 : ftrace의 기본 기능이 모두 활성화
  • 현업 프로젝트에서 ftrace 설정 확인 필요 : nop ftrace만 활성화

이미지 사이즈 체크 요망

tracing_on

echo 0 > /sys/kernel/debug/tracing/tracing_on
# ftrace configuration script code
echo 1 > /sys/kernel/debug/tracing/tracing_on
  • ftrace를 활성화/비활성화하려면 tracing_on 파일을 설정
  • tracing_on은 부팅 후 기본적으로 0으로 설정
  • tracing_on을 하고 ftrace를 설정

tracing_on 관련 커널 코드

kernel/trace/trace_events_trigger.c

static void traceon_trigger(struct event_trigger_data *data, struct trace_buffer *buffer, void *rec, struct ring_buffer_event *event)
{
	struct trace_event_file *file = data->private_data;
    ...
    if(tracing_is_on())
    		return;
    tracing_on();
}

nop tracer 설정 shell script code

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

# ftrace buffer size를 늘려준다.
echo 8096 > /sys/kernel/debug/tracing/buffer_size_kb
sleep 1

echo nop > /sys/kernel/debug/tracing/current_tracer
sleep 1

# interrupt 처리하는 tracing : irq
# interrupt handler 함수가 마무리되기 전에 ftrace event 메시지가 출력됨
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
# interrupt handler 함수를 호출하기 전에 정보를 출력해줌
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
# 프로세스가 task scheduling 될 때의 동작을 tracing해줌
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
# 프로세스를 깨울 때 tracing해줌
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
## 프로세스의 task scheduling과 관련된 속성 정보 출력
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_stat_runtime/enable

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

ftrace log


ftrace - tracer

current_tracer

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

avaliable_tracers

root@rasberrypi:/home/austin# cat /sys/kernel/debug/tracing/available_tracers
blk function_graph wakeup_dl wadup_rt wakeup irqsoff function nop
  • tracer 종류

file operation(/sys/kernel/debug/tracing/current_tracer)

kernel/trace/trace.c

static const struct file_operations set_tracer_fops = {
	.open 		= tracing_open_generic,
    .read 		= tracing_set_trace_read,
    .write  	= tracing_set_trace_write,
    .llseek 	= generic_file_llseek,
};

ftrace 설정 스크립트

shell script 설정 Part 1

#!/bin/bash

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

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

echo secondary_start_kernel > /sys/kernel/debug/tracing/set_trace_filter
sleep 1
echo "set_trace_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

shell script 설정 Part 2

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/sym-offset

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

set_ftrace_filter file operation

echo schedule > /sys/kernel/debug/tracing/set_trace_filter
  • set_ftrace_filter 파일에 tracing하려는 함수 이름을 지정(현업에서 많이 설정)
  • set_ftrace_filter는 현재 tracer를 function_graphfunction으로 설정할 경우 설정
  • available_filter_functions파일에 포함된 함수만 지정 (커널 함수 inline 불가)
  • set_ftrace_filter파일에 필터로 함수를 지정하지 않으면 available_filter_functions파일에 포함된 모든 커널 함수를 tracing (불필요한 로그가 출력되니 반드시 설정!)

ftrace 이벤트

ftrace 이벤트란

  • trace point라고 하며 커널 subsystem과 기능별로 세부 동작을 출력하는 기능을 지원

ftrace event의 카테고리

0개의 댓글