반응형

ftrace 란

 

ftrace 리눅스 커널에서 제공하는 가장 강력한 트레이서입니다. ftrace는 커널 개발자에게 축복입니다. ftrace는 커널 세부 동작을 알기 쉽게 출력하기 때문입니다.

 

ftrace의 특징은 다음과 같습니다.
1. 인터럽트, 스케줄링, 커널 타이머 커널 동작을 상세히 추적해줍니다.
2. 함수 필터를 지정하면 자신을 호출한 함수와 전체 콜스택까지 출력합니다. 물론 코드를 수정할 필요가 없습니다.
3. 함수를 어느 프로세스가 실행하는지 알 수 있습니다.
4. 함수 실행 시각을 알 수 있습니다.
5. ftrace 로그를 키면 시스템 동작에 부하를 주지 않습니다.

 

Ftrace는 tracefs 파일 시스템을 사용하여 제어 파일을 출력 파일로 표시합니다.

 

Ftrace를 사용하시기 위해서는 2가지 방법이 있습니다.

1. fstab 설정

tracefs /sys/kernel/tracing tracefs default 0 0

2. mount

mount -t tracefs nodev /sys/kernel/trace

 

※4.1 이전에는 모든 ftrace trace 제어 파일이 debugfs 내에있었습니다. 파일 시스템은 일반적으로/sys/kernel/debug/tracing에 있습니다. 이전 버전과의 호환성을 위해 debugfs 파일 시스템을 마운트 할 때
tracefs 파일 시스템은 다음 위치에 자동으로 마운트됩니다.

 

 

 

Ftrace 파일시스템 설명

※ 참고 : 모든 시간 값은 마이크로 초입니다.

 

  current_tracer :

현재 tracer를 설정하거나 표시하는 데 사용됩니다
구성되었습니다.

  available_tracers :

여기에는 다양한 유형의 trace 프로그램이 있습니다.
커널로 컴파일되었습니다. 그만큼
여기에 나열된 trace 프로그램은
그들의 이름을 current_tracer로 에코합니다.

  tracing_on :

트레이스에 쓸지 여부를 설정하거나 표시합니다
링 버퍼가 활성화되었습니다. 이 파일에 에코 0을 비활성화
trace 프로그램 또는 1로 설정하십시오. 참고로이 function은
링 버퍼에 쓰는 경우 trace 오버 헤드가 발생할 수 있습니다.
여전히 발생하고 있습니다.

커널 함수 tracing_off ()는
링 버퍼에 쓰기를 비활성화하는 커널
이 파일을 "0"으로 설정하십시오. 사용자 공간은 다음을 통해 trace을 다시 활성화 할 수 있습니다.
파일에 "1"을 에코합니다.

function 및 이벤트 트리거 "traceoff"도
이 파일을 0으로 설정하고 trace을 중지하십시오. 어느 것도 할 수 있습니다
이 파일을 사용하여 사용자 공간에서 다시 활성화하십시오.

  trace:

이 파일은 인간의 trace 출력을 보유합니다.
읽을 수있는 형식 (아래 설명). trace은 일시적으로 이루어집니다
이 파일을 읽는 동안 비활성화되어 있습니다 (열린 상태).

  trace_pipe :

출력은 "trace"파일과 동일하지만
파일은 실시간 trace으로 스트리밍됩니다.
이 파일을 읽으면 새로운 데이터가 나올 때까지 차단됩니다
검색했습니다. "trace"파일과 달리이 파일은
소비자. 이것은이 파일에서 읽는 것이
더 많은 현재 데이터를 표시하기 위해 순차적 읽기. 일단
이 파일에서 데이터를 읽고 소비하며
순차적 읽기로 다시 읽지 않습니다. 그만큼
"trace"파일은 정적이며 trace 프로그램이 아닌 경우
더 많은 데이터를 추가하면 동일하게 표시됩니다
읽을 때마다 정보. 이 파일은
읽는 동안 trace을 비활성화합니다.

  trace_options :

이 파일을 통해 사용자는 데이터 양을 제어 할 수 있습니다
위의 출력 중 하나에 표시됩니다
파일. trace 프로그램을 수정하는 option도 있습니다.
또는 이벤트가 작동합니다 (스택 trace, 타임 스탬프 등).

  option :

사용 가능한 모든 파일이있는 디렉토리입니다.
trace option (trace_options에도 있음). option도 설정 가능
또는 "1"또는 "0"을 각각
option 이름을 가진 해당 파일.

  tracing_max_latency :

일부 trace 프로그램은 최대 대기 시간을 기록합니다.
예를 들어, 최대 인터럽트 시간이 비활성화됩니다.
최대 시간이이 파일에 저장됩니다. 최대 trace도
저장하고 "trace"으로 표시합니다. 새로운 최대 trace은
대기 시간이이 파일의 값보다 큰 경우 기록
(마이크로 초).

이 파일에 시간을 반영하여 대기 시간이 기록되지 않습니다
이 파일의 시간보다 크지 않으면

  tracing_thresh :

일부 대기 시간 trace 프로그램은
대기 시간이이 파일의 수보다 큽니다.
파일에 0보다 큰 숫자가 포함 된 경우에만 활성화됩니다.
(마이크로 초)

  buffer_size_kb :

각 CPU의 킬로바이트 수를 설정하거나 표시합니다.
버퍼 보유. 기본적으로 trace 버퍼의 크기는 동일합니다
각 CPU마다. 표시된 숫자는
CPU 버퍼이며 모든 버퍼의 총 크기는 아닙니다. 그만큼
trace 버퍼는 페이지 (메모리 블록)에 할당됩니다
커널이 할당에 사용하는 것으로 보통 4KB입니다.
마지막으로 할당 된 페이지에 추가 바이트를위한 공간이있는 경우
요청한 것보다 나머지 페이지가 사용됩니다.
실제 할당을 요청하거나 표시 한 것보다 크게 만듭니다.
(크기는 페이지 크기의 배수가 아닐 수 있습니다
  버퍼 관리 메타 데이터로 인해. )

개별 CPU의 버퍼 크기는 다를 수 있습니다
(아래 "per_cpu/cpu0/buffer_size_kb"참조)
이 파일에는 "X"가 표시됩니다.

  buffer_total_size_kb :

모든 트레이스 버퍼의 총 결합 크기가 표시됩니다.

  free_buffer :

프로세스가 trace을 수행 중이고 링 버퍼가
프로세스가 완료 되더라도 "해제"되었습니다.
신호로 인해이 파일은 해당 목적으로 사용될 수 있습니다. 가까이에
이 파일의 링 버퍼는 최소 크기로 조정됩니다.
trace중인 프로세스가 있으면 프로세스가이 파일을 엽니 다.
이 파일에 대한 파일 디스크립터를 종료하면 닫힙니다.
링 버퍼는 "해제"됩니다.

disable_on_free option이 설정된 경우 trace을 중지 할 수도 있습니다.

  tracing_cpumask :

지정된 CPU에서만 사용자를 trace 할 수있는 마스크입니다.
형식은 CPU를 나타내는 16 진 문자열입니다.

  set_ftrace_filter :

동적 ftrace가 구성되어있는 경우 (
"동적 ftrace"아래 섹션), 코드는 동적으로
호출을 비활성화하도록 수정 (코드 텍스트 다시 쓰기)
함수 프로파일 러 (mcount). 이를 통해 trace을 구성 할 수 있습니다
실제로 성능 오버 헤드가 없습니다. 이거 역시
특정 function을 활성화 또는 비활성화하는 부작용이 있습니다
trace해야합니다. 이 파일에 함수 이름 반향
trace을 해당 function으로 만 제한합니다.

"available_filter_functions"에 나열된 function은
이 파일에 쓸 수 있습니다.

이 인터페이스를 통해 명령을 사용할 수도 있습니다. 참조
자세한 내용은 "필터 명령"섹션을 참조하십시오.

  set_ftrace_notrace :

이것은 효과와 반대되는 효과가 있습니다
set_ftrace_filter. 여기에 추가 된 function은
trace됩니다. 함수가 set_ftrace_filter에 모두 존재하는 경우
그리고 set_ftrace_notrace, 함수는 _not_ trace됩니다.

  set_ftrace_pid :

함수 trace기가 PID가있는 스레드 만 trace하도록하십시오.
이 파일에 나열되어 있습니다.

"function-포크"option이 설정된 경우
PID는이 파일 포크에 나열되며 자녀의 PID는
이 파일에 자동으로 추가되며 자식은
함수 tracer에서도 trace됩니다. 이 option은
종료 된 태스크의 PID가 파일에서 제거되도록합니다.

  set_event_pid :

이벤트가이 파일에 나열된 PID를 가진 작업 만 trace하도록하십시오.
sched_switch 및 sched_wake_up도 이벤트를 trace합니다.
이 파일에 나열되어 있습니다.

이 파일에서 작업 하위의 PID를 PID와 함께 사용하려면
포크에 추가 된 경우 "이벤트 포크"option을 활성화하십시오. 그 option도
작업이 수행 될 때 작업의 PID가이 파일에서 제거되도록합니다.
종료합니다.

  set_graph_function :

이 파일에 나열된 함수는 함수 그래프를 유발합니다
이러한 function과 해당 function 만 trace하는 trace 프로그램
그들이 전화한다. 자세한 내용은 "동적 ftrace"섹션을 참조하십시오.

  set_graph_notrace :

set_graph_function과 유사하지만 함수 그래프를 비활성화합니다.
function이 종료 될 때까지 function이 종료 될 때 trace.
이를 통해 호출되는 trace function을 무시할 수 있습니다.
특정 function에 의해.

  available_filter_functions :

이것은 ftrace가 처리하고 trace 할 수있는 function을 나열합니다.
전달할 수있는 함수 이름입니다
"set_ftrace_filter"또는 "set_ftrace_notrace".
(자세한 내용은 아래의 "동적 ftrace"섹션을 참조하십시오.)

  dyn_ftrace_total_info :

이 파일은 디버깅 용입니다. function의 수
nops로 변환되었으며 trace이 가능합니다.

  enabled_functions :

이 파일은 ftrace 디버깅에 유용하지만 유용 할 수도 있습니다.
함수에 콜백이 첨부되어 있는지 확인하십시오.
trace 인프라는 ftrace function을 사용할뿐만 아니라
유틸리티를 trace하지만 다른 서브 시스템도 가능합니다. 이 파일
콜백이 첨부 된 모든 함수를 표시합니다
첨부 된 콜백 수
콜백은 여러 함수를 호출 할 수도 있습니다.
이 카운트에 나열되지 않습니다.

콜백이 다음과 같은 함수에 의해 trace되도록 등록 된 경우
"regs 저장"속성 (따라서 더 많은 오버 헤드), 'R'
function과 같은 줄에 표시됩니다
레지스터를 반환합니다.

콜백이 다음과 같은 함수에 의해 trace되도록 등록 된 경우
"ip modify"속성 (따라서 regs-> ip를 변경할 수 있음)
함수와 같은 줄에 'I'가 표시됩니다.
재정의 할 수 있습니다.

아키텍처가 지원하는 경우 어떤 콜백도 표시합니다
함수에 의해 직접 호출됩니다. 카운트가 큰 경우
1보다 크면 ftrace_ops_list_func () 일 가능성이 높습니다.

함수의 콜백이 다음과 같은 트램폴린으로 점프하는 경우
표준 트램폴린이 아닌 콜백에만 해당
그것의 주소뿐만 아니라 function이 인쇄됩니다
트램폴린 전화.

  function_profile_enabled :

설정하면 function 중 하나를 사용하여 모든 function을 사용할 수 있습니다
trace 프로그램 또는 function 그래프 trace 프로그램 (구성된 경우) 그것은
호출 된 함수 수의 히스토그램을 유지
함수 그래프 tracer가 구성된 경우에도
해당 function에 소요 된 시간을 trace합니다. 히스토그램
파일에 내용을 표시 할 수 있습니다.

trace_stats/function  (function0, function1 등).

  trace_stats :

다른 trace 통계를 보유하는 디렉토리입니다.

  kprobe_events :
 
동적 trace 점을 활성화합니다. kprobetrace.txt를 참조하십시오.

  kprobe_profile :

동적 trace 점 통계. kprobetrace.txt를 참조하십시오.

  max_graph_depth :

function 그래프 tracer와 함께 사용됩니다. 이것은 최대 깊이입니다
함수로 trace됩니다. 이것을 값으로 설정
하나는 호출 된 첫 번째 커널 함수 만 표시합니다
사용자 공간에서.

  printk_formats :

이는 원시 형식 파일을 읽는 도구를위한 것입니다. 이벤트가
링 버퍼는 문자열을 참조하지만 문자열에 대한 포인터 만
문자열 자체가 아닌 버퍼에 기록됩니다. 이것은 방지
그 문자열이 무엇인지 아는 도구. 이 파일은 문자열을 표시합니다
도구가 포인터를 무엇에 매핑 할 수 있도록하는 문자열 주소
끈이 있었다.

  saved_cmdlines :

작업의 pid 만 trace 이벤트에 기록됩니다
이 이벤트는 구체적으로 작업을 저장합니다. Ftrace
pid 매핑 캐시를 통신에 표시하여 표시하려고합니다.
이벤트에 대한 통신. 통신에 대한 pid가 표시되지 않으면
출력에 "<...>"가 표시됩니다.

"record-cmd"option이 "0"으로 설정되면 작업이 시작됩니다
녹화 중에는 저장되지 않습니다. 기본적으로 활성화되어 있습니다.

  saved_cmdlines_size :

기본적으로 128 개의 통신이 저장됩니다 (위의 "saved_cmdlines"참조). 에
캐시 된 통신량 증가 또는 감소, 에코
이 파일에 캐시 할 통신의 수로.

  saved_tgids :

"record-tgid"option이 설정된 경우 각 스케줄링 컨텍스트 전환
작업의 작업 그룹 ID는 PID를 매핑하는 테이블에 저장됩니다.
스레드를 TGID로 기본적으로 "record-tgid"option은
비활성화 됨.

  스냅 사진:

"스냅 샷"버퍼를 표시하고 사용자에게
현재 실행중인 trace의 스냅 샷을 만듭니다.
자세한 내용은 아래의 "스냅 샷"섹션을 참조하십시오.

  stack_max_size :

스택 tracer가 활성화되면
발생한 최대 스택 크기.
아래의 "스택 trace"섹션을 참조하십시오.

  stack_trace :

가장 큰 스택의 스택 백 트레이스가 표시됩니다.
스택 trace 프로그램이 활성화 될 때 발생했습니다.
아래의 "스택 trace"섹션을 참조하십시오.

  stack_trace_filter :

이것은 "set_ftrace_filter"와 비슷하지만
스택 trace 프로그램에서 확인할 function

  trace_clock :

이벤트가 링 버퍼에 기록 될 때마다
"타임 스탬프"가 추가되었습니다. 이 스탬프는 지정된
시계. 기본적으로 ftrace는 "로컬"시계를 사용합니다. 이
시계는 매우 빠르며 CPU 당 엄격하지만 일부는
시스템은 다른 것과 관련하여 단조로울 수 없습니다
CPU. 즉, 로컬 시계가 동기화되지 않았을 수 있습니다
다른 CPU의 로컬 시계와 함께.

trace을위한 일반적인 시계 :

  # cat trace_clock
  [로컬] 글로벌 카운터 x86-tsc

  주위에 대괄호가있는 시계는
  사실상.

  로컬 : 기본 클럭이지만 CPU간에 동기화되지 않을 수 있음

  global :이 시계는 모든 CPU와 동기화되어 있지만
     로컬 시계보다 약간 느립니다.

  counter : 이것은 전혀 시계가 아니라 말 그대로 원자
      계수기. 하나씩 계산하지만 동기화됩니다.
   모든 CPU와 함께. 이것은 필요할 때 유용합니다
   주문 이벤트가
   서로 다른 CPU에서 서로.

 runtime : 지피 카운터와 타임 스탬프를 사용합니다.
     부팅 이후 시간과 관련이 있습니다.

  perf : 이것은 ftrace가 perf가 사용하는 것과 같은 시계를 사용하게합니다.
   결국 perf는 ftrace 버퍼를 읽을 수 있습니다
데이터 인터리빙에 도움이됩니다.

  x86-tsc : 아키텍처는 자신의 시계를 정의 할 수 있습니다. 에 대한
      예를 들어, x86은 여기에서 자체 TSC 사이클 클럭을 사용합니다.

  ppc-tb : powerpc 타임베이스 레지스터 값을 사용합니다.
  이것은 CPU간에 동기화되어 있으며 사용할 수도 있습니다
  하이퍼 바이저/게스트 전체의 이벤트를 연관시키는 경우
  tb_offset이 알려져 있습니다.

  mono : 고속 모노 토닉 시계 (CLOCK_MONOTONIC)를 사용합니다.
단조롭고 NTP 속도 조정이 적용됩니다.

  mono_raw :
이것은 원시 단조로운 시계입니다 (CLOCK_MONOTONIC_RAW)
montonic이지만 요금 조정이 적용되지 않습니다.
하드웨어 클럭 소스와 동일한 속도로 틱합니다.

  boot : 이것은 부팅 시계 (CLOCK_BOOTTIME)이며
빠른 단조로운 시계뿐만 아니라 시간 소비
매달다. 시계 액세스는 다음 용도로 사용하도록 설계되었으므로
일시 중단 경로를 trace하면 일부 부작용이 발생할 수 있습니다
일시 중단 시간 이후에 시계에 액세스 한 경우
빠른 모노 클럭이 업데이트됩니다. 이 경우 시계 업데이트
평상시보다 약간 더 빨리 발생하는 것으로 보입니다.
또한 32 비트 시스템에서 64 비트 부팅 오프셋이 가능할 수 있습니다.
부분 업데이트를 봅니다. 이 효과는 드물고 포스트
처리 할 수 ​​있어야합니다. 의 의견을 참조하십시오
자세한 내용은 ktime_get_boot_fast_ns () 함수를 참조하십시오.

시계를 설정하려면 시계 이름을이 파일에 에코하십시오.

  에코 전역> trace_clock

  trace_marker :

이것은 사용자 공간을 동기화하는 데 매우 유용한 파일입니다
커널에서 이벤트가 발생합니다. 문자열 쓰기
이 파일은 ftrace 버퍼에 기록됩니다.

응용 프로그램에서 시작시이 파일을 여는 것이 유용합니다
응용 프로그램의 파일 설명자를 참조하십시오.
파일.

void trace_write(const char *fmt, ...)
{
va_list ap;
char buf[256];
int n;

if (trace_fd < 0)
return;

va_start(ap, fmt);
n = vsnprintf(buf, 256, fmt, ap);
va_end(ap);

write(trace_fd, buf, n);
}

start:

trace_fd = open("trace_marker", WR_ONLY);


  trace_marker_raw :

이것은 위의 trace_marker와 유사하지만 이진 데이터 용입니다.
도구를 사용하여 데이터를 구문 분석하는 데 쓸 수있는
trace_pipe_raw에서.

  uprobe_events :
 
프로그램에 동적 trace 점을 추가하십시오.
uprobetracer.txt 참조

  uprobe_profile :

Uprobe 통계. uprobetrace.txt 참조

  instance :

이것은 다른 곳에 여러 trace 버퍼를 만드는 방법입니다
이벤트는 다른 버퍼에 기록 될 수 있습니다.
아래의 "instance"섹션을 참조하십시오.

  이벤트 :

trace 이벤트 디렉토리입니다. 이벤트 trace 점을 보유합니다.
컴파일 된 (정적 trace 점이라고도 함)
커널로. 존재하는 이벤트 trace 점을 보여줍니다.
시스템별로 그룹화하는 방법 "활성화"가 있습니다
trace 점을 사용할 수있는 다양한 레벨의 파일
그들에게 "1"이 쓰여질 때.

자세한 내용은 events.txt를 참조하십시오.

  set_event :

이벤트를이 파일로 에코하면 해당 이벤트가 활성화됩니다.

자세한 내용은 events.txt를 참조하십시오.

  available_events :

trace에서 사용할 수있는 이벤트 목록입니다.

자세한 내용은 events.txt를 참조하십시오.

  hwlat_detector :

Hardware Latency Detector 디렉토리.
아래의 "하드웨어 대기 시간 감지기"섹션을 참조하십시오.

  per_cpu :

이는 trace per_cpu 정보가 포함 된 디렉토리입니다.

  per_cpu/cpu0/buffer_size_kb :

ftrace 버퍼는 per_cpu로 정의됩니다. 즉, 별도가 있습니다
쓰기를 원자 적으로 수행 할 수 있도록 각 CPU에 대한 버퍼
캐시 수신 거부가 없습니다. 이 버퍼는 다를 수 있습니다
크기 버퍼. 이 파일은 buffer_size_kb와 유사합니다
파일이지만 버퍼 크기 만 표시하거나 설정합니다.
특정 CPU. (여기서는 cpu0).

  per_cpu/cpu0/trace :

이것은 "trace"파일과 유사하지만 표시 만됩니다.
CPU에 특정한 데이터. 쓰면, 그것은 단지 지 웁니다
특정 CPU 버퍼

  per_cpu/cpu0/trace_pipe

이것은 "trace_pipe"파일과 유사하며,
읽지 만 특정 데이터 만 표시하고 소비합니다.
CPU를 위해.

  per_cpu/cpu0/trace_pipe_raw

ftrace 링 버퍼 이진 형식을 구문 분석 할 수있는 도구의 경우
trace_pipe_raw 파일을 사용하여 데이터를 추출 할 수 있습니다
링 버퍼에서 직접. splice ()를 사용하여
시스템 호출, 버퍼 데이터를 신속하게 전송할 수 있습니다
서버가 파일을 수집하는 파일 또는 네트워크
데이터.

trace_pipe와 마찬가지로, 이것은 여러 곳에서 소비하는 독자입니다.
읽기는 항상 다른 데이터를 생성합니다.

  per_cpu/cpu0/스냅 샷 :

이것은 기본 "스냅 샷"파일과 유사하지만
현재 CPU 스냅 샷 (지원되는 경우). 표시 만
주어진 CPU에 대한 스냅 샷의 내용
이 CPU 버퍼 만 지 웁니다.

  per_cpu/cpu0/snapshot_raw :

trace_pipe_raw와 유사하지만 이진 형식을 읽습니다.
주어진 CPU에 대한 스냅 샷 버퍼에서

  per_cpu/cpu0/stats :

링 버퍼에 대한 특정 통계가 표시됩니다.

 항목 : 여전히 버퍼에있는 이벤트 수입니다.

 오버런 : 덮어 쓰기로 인해 손실 된 이벤트 수
    버퍼가 가득 찼습니다.

 커밋 오버런 : 항상 0이어야합니다.
  중첩 된 이벤트 내에서 너무 많은 이벤트가 발생하면 설정됩니다.
이벤트 (링 버퍼가 다시 입력 됨)
버퍼링하고 이벤트 삭제를 시작합니다.

 바이트 : 실제로 읽은 바이트 수 (덮어 쓰지 않음).

 가장 오래된 이벤트 ts : 버퍼에서 가장 오래된 타임 스탬프

 이제 ts : 현재 타임 스탬프

 삭제 된 이벤트 : 덮어 쓰기 option이 해제되어 이벤트가 손실되었습니다.

 

 

반응형

+ Recent posts