Co to jest Ftrace?

Jeśli kiedykolwiek zastanawiałeś się, co dokładnie robi jądro Linuksa, gdy Twój program wywołuje read(), albo dlaczego system nagle zwolnił, ftrace (Function Tracer) jest odpowiedzią.

ftrace to oficjalny, wbudowany w jądro mechanizm śledzenia (tracingu). Pozwala on na monitorowanie wywołań funkcji wewnątrz jądra, śledzenie opóźnień (latency), przełączeń kontekstu i wielu innych zdarzeń systemowych z mikrosekundową dokładnością.

Wymagania jądra

Aby korzystać z ftrace, jądro musi być skompilowane z odpowiednimi opcjami. W większości standardowych dystrybucji (Ubuntu, Fedora, Debian) są one włączone domyślnie. Jeśli jednak kompilujesz własne jądro, upewnij się, że masz ustawione:

  • CONFIG_FUNCTION_TRACER=y - podstawowe śledzenie funkcji.
  • CONFIG_FUNCTION_GRAPH_TRACER=y - śledzenie grafu wywołań (wejścia i wyjścia z funkcji).
  • CONFIG_DYNAMIC_FTRACE=y - pozwala na dynamiczne włączanie/wyłączanie śledzenia konkretnych funkcji (bez tego narzut na wydajność byłby ogromny).

Możesz sprawdzić, czy Twoje obecne jądro to wspiera, szukając pliku konfiguracyjnego w /boot/ lub sprawdzając, czy istnieje katalog /sys/kernel/debug/tracing.

Jak działa Ftrace?

W przeciwieństwie do strace, który śledzi wywołania systemowe z punktu widzenia procesu (przestrzeń użytkownika), ftrace działa wewnątrz samego jądra.

Jądro udostępnia interfejs ftrace poprzez specjalny system plików tracefs (zazwyczaj zamontowany w /sys/kernel/debug/tracing lub /sys/kernel/tracing). Możemy sterować śledzeniem, po prostu zapisując wartości do plików w tym katalogu.

Ręczne sterowanie (dla odważnych)

Możesz używać ftrace bezpośrednio z terminala:

  1. Przejdź do katalogu tracingu:
    cd /sys/kernel/debug/tracing
    
  2. Wybierz tracer (np. function_graph, który rysuje drzewo wywołań):
    echo function_graph > current_tracer
    
  3. Włącz śledzenie:
    echo 1 > tracing_on
    
  4. Wykonaj jakąś akcję w systemie.
  5. Wyłącz śledzenie i zobacz wynik:
    echo 0 > tracing_on
    cat trace | head
    

trace-cmd: Ftrace dla ludzi

Chociaż ręczne sterowanie jest pouczające, na co dzień wszyscy używają narzędzia trace-cmd. Jest to wygodna nakładka (front-end) na ftrace, która automatyzuje ustawianie opcji i zbieranie danych.

Instalacja

Na większości dystrybucji pakiet nazywa się po prostu trace-cmd:

sudo apt install trace-cmd  # Debian/Ubuntu
sudo dnf install trace-cmd  # Fedora/RHEL

Podstawowe użycie

Najprostsze polecenie, aby nagrać przebieg funkcji jądra podczas wykonywania programu (np. ls):

sudo trace-cmd record -p function_graph ls

Spowoduje to utworzenie pliku trace.dat. Aby go przeanalizować, używamy:

trace-cmd report | less

Zobaczysz wtedy szczegółowy graf wywołań funkcji jądra, co pozwala dokładnie zrozumieć, jakie funkcje były wywoływane i ile czasu zajęły.

Kiedy używać Ftrace?

  • Debugowanie wydajności jądra: Gdy system “muli”, a top nie pokazuje winnego.
  • Analiza sterowników: Aby zobaczyć, jak sterownik komunikuje się ze sprzętem.
  • Nauka: Aby zrozumieć, jak działają podsystemy jądra (np. scheduler, system plików).

Podsumowanie

ftrace to potężne narzędzie, które zmienia jądro z “czarnej skrzynki” w otwartą księgę. Choć próg wejścia jest wyższy niż przy strace, możliwości analizy są praktycznie nieograniczone. Jeśli chcesz na poważnie zajmować się wydajnością Linuksa, ftrace (i jego kuzyn perf) to narzędzia, które musisz znać.