<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Ftrace</id>
	<title>Ftrace - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Ftrace"/>
	<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Ftrace&amp;action=history"/>
	<updated>2026-04-09T22:56:15Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Ftrace&amp;diff=359&amp;oldid=prev</id>
		<title>Ahn9807: 새 문서: 분류: 리눅스 커널  == 개요 == 리눅스 커널에서 커널 내부의 Latency와 Function call을 확인하기 위하여 제공하는 Tracing Tool 이다.  == 사용법 == 우선 debugfs을 적절한 위치 (여기서는 default인 /sys/kernel/debug)에 마운트 시킨다.  mount -t debugfs nodev /sys/kernel/debug 또한 ftrace를 사용하려면, 커널에 다음과 같은 configuration을 주어야 한다. (menuconfig 혹은 kconfig 파일)  CONFIG_FUNCTION_TRACE...</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Ftrace&amp;diff=359&amp;oldid=prev"/>
		<updated>2023-02-05T08:38:19Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%BB%A4%EB%84%90&quot; title=&quot;분류:리눅스 커널&quot;&gt;분류: 리눅스 커널&lt;/a&gt;  == 개요 == 리눅스 커널에서 커널 내부의 Latency와 Function call을 확인하기 위하여 제공하는 Tracing Tool 이다.  == 사용법 == 우선 debugfs을 적절한 위치 (여기서는 default인 /sys/kernel/debug)에 마운트 시킨다.  mount -t debugfs nodev /sys/kernel/debug 또한 ftrace를 사용하려면, 커널에 다음과 같은 configuration을 주어야 한다. (menuconfig 혹은 kconfig 파일)  CONFIG_FUNCTION_TRACE...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류: 리눅스 커널]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
리눅스 커널에서 커널 내부의 Latency와 Function call을 확인하기 위하여 제공하는 Tracing Tool 이다.&lt;br /&gt;
&lt;br /&gt;
== 사용법 ==&lt;br /&gt;
우선 debugfs을 적절한 위치 (여기서는 default인 /sys/kernel/debug)에 마운트 시킨다.&lt;br /&gt;
 mount -t debugfs nodev /sys/kernel/debug&lt;br /&gt;
또한 ftrace를 사용하려면, 커널에 다음과 같은 configuration을 주어야 한다. (menuconfig 혹은 kconfig 파일)&lt;br /&gt;
 CONFIG_FUNCTION_TRACER&lt;br /&gt;
 CONFIG_FUNCTION_GRAPH_TRACER&lt;br /&gt;
 CONFIG_STACK_TRACER&lt;br /&gt;
 CONFIG_DYNAMIC_FTRACE&lt;br /&gt;
&lt;br /&gt;
현재 사용할 수 있는 traces들의 종류를 보기 위해선, available_tracers에 어떤 내용이 있는지 확인하면 된다.&lt;br /&gt;
 cat /sys/kernel/debug/tracing/available_tracers&lt;br /&gt;
또한 여기서 확인한 trace중에서 사용할 trace는 current_tracer에 적용시키면 된다.&lt;br /&gt;
 echo function(한 예시) &amp;gt; current_tracer&lt;br /&gt;
&lt;br /&gt;
마지막으로 사용된 tracer에 대해서 tracing된 결과는 trace 파일에 포함되게 된다.&lt;br /&gt;
 cat /sys/kernel/debug/tracing/trace&lt;br /&gt;
&lt;br /&gt;
또한 trace를 시작하고 멈추는 것은 tracing_on에 1 (트레이싱 함), 혹은 0 (트레이싱 안함)을 표시시켜서 조절하게 된다.&lt;br /&gt;
 echo 1 &amp;gt; tracing_on&lt;br /&gt;
&lt;br /&gt;
만약 trace 하고 싶은 함수가 따로 있을 경우, &lt;br /&gt;
 cat available_filter_functions&lt;br /&gt;
로 가능한 함수를 확인한후&lt;br /&gt;
 echo &amp;quot;*vfs*&amp;quot; &amp;gt; set_ftrace_filter&lt;br /&gt;
 echo &amp;quot;*write*&amp;quot; &amp;gt;&amp;gt; set_ftrace_filter&lt;br /&gt;
다음과 같이 regx를 이용하여 설정한 후 트레이싱하면 된다.&lt;br /&gt;
여기서 만약 초기화 하기 위해서는 &lt;br /&gt;
 echo &amp;quot; &amp;quot; &amp;gt; set_ftrace_filter&lt;br /&gt;
다음과 같이 설정하면 된다.&lt;br /&gt;
&lt;br /&gt;
=== NOP tracing ===&lt;br /&gt;
 echo nop &amp;gt; current_tracer&lt;br /&gt;
NOP은 인스트럭션중 아무 일도 하지 않는 인스트럭션을 말한다. 이 상황에서는 tracer는 아무 output도 만들지 않는다.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# tracer: nop&lt;br /&gt;
#&lt;br /&gt;
# entries-in-buffer/entries-written: 0/0   #P:4&lt;br /&gt;
#&lt;br /&gt;
#                              _-----=&amp;gt; irqs-off&lt;br /&gt;
#                             / _----=&amp;gt; need-resched&lt;br /&gt;
#                            | / _---=&amp;gt; hardirq/softirq&lt;br /&gt;
#                            || / _--=&amp;gt; preempt-depth&lt;br /&gt;
#                            ||| /     delay&lt;br /&gt;
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION&lt;br /&gt;
#              | |       |   ||||       |         |&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Function tracing ===&lt;br /&gt;
 echo function &amp;gt; current_tracer&lt;br /&gt;
gcc의 -pg (gprof를 통해서 시스템 분석을 가능하게 하는 옵션임)옵션을 통해서 이루어 지는데, 모든 커널의 함수의 시작 부분에 mcount라는 함수를 호출하게 된다. 이 함수는 C [[ABI]]를 따르지 않기 때문에 어셈블리로 구현되게 된다. 커널에 이미 구현되에 있는 mcount라는 함수의 콜을 통해서 ftrace로그를 가지게 된다.&lt;br /&gt;
&lt;br /&gt;
이때 만약 CONFIG_DYNAMIC_FTRACE를 enable하게 되면, 부팅 시간에는 모든 mcount들이 NOP으로 변환되게 되며, NOP을 처리하는 것은 거의 무시할 수 있는 system overhead를 가져오기 때문에, 시스템의 영향을 거의 미치지 않게 할 수 있다. 또한 CONFIG_DYNMAMIC_FTRACE를 통한다면, 어떤 함수에서 벤치를 돌리 것인지 설정할 수 있다. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    # tracer: function&lt;br /&gt;
    #&lt;br /&gt;
    #           TASK-PID    CPU#    TIMESTAMP  FUNCTION&lt;br /&gt;
    #              | |       |          |         |&lt;br /&gt;
                bash-16939 [000]  6075.461561: mutex_unlock &amp;lt;-tracing_set_tracer&lt;br /&gt;
              &amp;lt;idle&amp;gt;-0     [001]  6075.461561: _spin_unlock_irqrestore &amp;lt;-hrtimer_get_next_event&lt;br /&gt;
              &amp;lt;idle&amp;gt;-0     [001]  6075.461562: rcu_needs_cpu &amp;lt;-tick_nohz_stop_sched_tick&lt;br /&gt;
                bash-16939 [000]  6075.461563: inotify_inode_queue_event &amp;lt;-vfs_write&lt;br /&gt;
              &amp;lt;idle&amp;gt;-0     [001]  6075.461563: mwait_idle &amp;lt;-cpu_idle&lt;br /&gt;
                bash-16939 [000]  6075.461563: __fsnotify_parent &amp;lt;-vfs_write&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Function graph ===&lt;br /&gt;
 echo function_graph &amp;gt; current_tracer&lt;br /&gt;
이 옵션은 함수의 콜 관계를 C의 Annotation을 사용해서 표현한다. Duration에 표시되는 annotation인 + 와 !는 각각 10마이크로 세커드 보다 duration이 김을, 100마이크로 세컨드보다 duration이 김을 표시한다. Function graph로 표시하기 위해서 ftrace유틸은 함수의 종료 주소를 hijack하는데, 이는 cpu의 branch prediction을 방해하기 때문에 실제 실행시간보다 약간이지만 조금 길어질 수 있다.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    # tracer: function_graph&lt;br /&gt;
    #&lt;br /&gt;
    # CPU  DURATION                  FUNCTION CALLS&lt;br /&gt;
    # |     |   |                     |   |   |   |&lt;br /&gt;
     1)   1.015 us    |        _spin_lock_irqsave();&lt;br /&gt;
     1)   0.476 us    |        internal_add_timer();&lt;br /&gt;
     1)   0.423 us    |        wake_up_idle_cpu();&lt;br /&gt;
     1)   0.461 us    |        _spin_unlock_irqrestore();&lt;br /&gt;
     1)   4.770 us    |      }&lt;br /&gt;
     1)   5.725 us    |    }&lt;br /&gt;
     1)   0.450 us    |    mutex_unlock();&lt;br /&gt;
     1) + 24.243 us   |  }&lt;br /&gt;
     1)   0.483 us    |  _spin_lock_irq();&lt;br /&gt;
     1)   0.517 us    |  _spin_unlock_irq();&lt;br /&gt;
     1)               |  prepare_to_wait() {&lt;br /&gt;
     1)   0.468 us    |    _spin_lock_irqsave();&lt;br /&gt;
     1)   0.502 us    |    _spin_unlock_irqrestore();&lt;br /&gt;
     1)   2.411 us    |  }&lt;br /&gt;
     1)   0.449 us    |  kthread_should_stop();&lt;br /&gt;
     1)               |  schedule() {&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=== trace_printk ===&lt;br /&gt;
[[printk]]를 통해서 대부분의 커널 디버깅을 진행 할 수는 있지만, interrupt context나 timer처럼 많은 로그가 남거나 stack overflow가 날 수 있는 문제의 환경에서 사용할 수 없다는 문제가 있다. 이때 ftrace의 ring buffer를 그대로 활용하여, trace에 로그가 남도록 하는 방법이 있는데, 이 방법이 바로 trace_printk이다. printk처럼 trace_printk를 써서 로그를 남기면 trace에 표출되게 된다.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
function mode...&lt;br /&gt;
    #           TASK-PID    CPU#    TIMESTAMP  FUNCTION&lt;br /&gt;
    #              | |       |          |         |&lt;br /&gt;
               &amp;lt;...&amp;gt;-10690 [003] 17279.332920: : read foo 10 out of bar ffff880013a5bef8&lt;br /&gt;
function_graph mode...&lt;br /&gt;
     3)               |    do_one_initcall() {&lt;br /&gt;
     3)               |      /* read foo 10 out of bar ffff88001191bef8 */&lt;br /&gt;
     3)   4.221 us    |    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참고 ==&lt;br /&gt;
# https://lwn.net/Articles/365835/&lt;br /&gt;
# https://medium.com/@hyoje420/linux-ftrace-%EC%82%AC%EC%9A%A9%EB%B2%95-31b4dc7ac93c&lt;/div&gt;</summary>
		<author><name>Ahn9807</name></author>
	</entry>
</feed>