Boot time ftrace tracer

TAEWOO HA·2023년 8월 28일
0

트러블 슈팅

목록 보기
2/4

커멘드 라인을 설정해 부팅 시 ftrace를 설정

  • 커널 소스를 수정할 필요가 없음

  • boot-time ftrace tracing이 필요한 이유
    부팅 시간 이슈 대응
    부팅 초반 tracing을 위해서 (0.0002 초부터 트레이싱 가능)

적절히 부트 커멘드를 설정해 필터를 설정해야 함

부팅 시간이 느려짐
아예 부팅을 못함 (모든 event를 활성화)

트레이서 버퍼 크기 설정

자주 트레이싱되는 이벤트 메시지는 overwritten됨
부팅 초반에 출력되는 메시지를 볼 수 없음
최적화된 필터 설정 필요

boot command line 소개

  • Enable tracers (ftrace=)
    • Enable function tracer, function graph tracer, irq-off tracer etc
    • ftrace= 으로 설정 가능
  • Function Filtering
    • ftrace_filter=
    • ftrace_notrace=
    • ftrace_graph_filter=
    • ftrace_graph_notrace=
  • trace_event=
cat /sys/kernel/debug/tracing/available_events // ftrace와 관련된 속성정보는 tracing 디렉토리의 하부에 존재 , available : ftrace에서 트레이싱 가능한 이벤트 목록 확인

vc4:vc4_wait_for_seqno_begin // 이벤트들
vc4:vc4_wait_for_seqno_end
vc4:vc4_submit_cl_ioctl
...
irq:irq_handler_exit // irq *를 하게되면 해당 이벤트가 모두 활성화된다
irq:irq_handler_entry
...
sched:sched_switch
sched:sched_wakeup_new
sched:sched_wakeup
  • trace_options=
ls /sys/kernel/debug/tracing/options/ => 아래의 정보를 트레이스 옵션에 지정 가능
annotate display-graph funcgraph-proc hex raw test_nop_accept
bin event-fork funcgraph-tail irq-info record-cmd test_nop_refuse
blk_cgname funcgraph-abstime func-no-repeats latency-format record-tgid trace_printk
blk_cgroup funcgraph-cpu func_stack_trace markers sleep-time userstacktrace
blk_classic funcgraph-duration function-fork overwrite stacktrace verbose
block funcgraph-irqs function-trace pause-on-trace sym-addr
context-info funcgraph-overhead graph-time printk-msg-only sym-offset
disable_on_free funcgraph-overrun hash-ptr print-parent sym-userobj
  • 자주 사용하는 것 : stacktrace , symbol-addr , symbol-offset

커맨드라인 설정 예시1

trace_buf_size=2M trace_event=kmem:mm_page_alloc trace_options=stacktrace,symaddr,sym-offset ftrace=function ftrace_filter=rpi_firmware_init

==> 버퍼사이즈 , 이벤트 , 트레이스 옵션 , ftrace = function trace , 필터함수

Command line 설정 예시 2

trace_buf_size=2M trace_event=printk:console

  • 간단하게 버퍼사이즈 , printk:console로도 설정 가능

Command line 설정 예시 3

=> init call 카테고리를 모두 활성화하겠다.

Command line 설정 예시 4

Command line 설정 예시 5

전체 부트 커맨드 라인의 종류

  • __setup 의 매크로 함수를 보게되면 관련 커맨드라인의 설정 , 루틴을 볼 수 있다.
  • 문자열 : 모두 부트 커맨드라인이다.

"ftrace="

https://elixir.bootlin.com/linux/v5.15.30/source/kernel/trace/trace.c
static int __init set_cmdline_ftrace(char *str)
{
strlcpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);
default_bootup_tracer = bootup_tracer_buf;
/* We are using ftrace early, expand it */
ring_buffer_expanded = true;
return 1;
}
__setup("ftrace=", set_cmdline_ftrace);
  • 셋 커맨드 ftrace 함수가 호출됨 , 이꼴(=) 다음의 문자열을 파싱하여 bootup_trace_buf에 관련된 정보를 복사하게된다.

"trace_buf_size="

https://elixir.bootlin.com/linux/v5.15.30/source/kernel/trace/trace.c
static int __init set_buf_size(char *str)
{
...
buf_size = memparse(str, &str);
/*
* nr_entries can not be zero and the startup
* tests require some buffer space. Therefore
* ensure we have at least 4096 bytes of buffer.
*/
trace_buf_size = max(4096UL, buf_size);
return 1;
}
__setup("trace_buf_size=", set_buf_size);
  • 4096 바이트 이하인 경우 4096으로 적용한다.

"trace_options="

https://elixir.bootlin.com/linux/v5.15.30/source/kernel/trace/trace.c
static int __init set_trace_boot_options(char *str)
{
strlcpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
return 1;
}
__setup("trace_options=", set_trace_boot_options);
  • 문자열을 복사 , 스트링카피하여 부트커맨드 라인에 전달된 문자열을 복사

0개의 댓글

관련 채용 정보