Ftrace: Jak zajrzeć do wnętrza jądra Linuksa
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:
- Przejdź do katalogu tracingu:
cd /sys/kernel/debug/tracing - Wybierz tracer (np.
function_graph, który rysuje drzewo wywołań):echo function_graph > current_tracer - Włącz śledzenie:
echo 1 > tracing_on - Wykonaj jakąś akcję w systemie.
- 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
topnie 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ć.