strace: Systemaufrufe von Prozessen live debuggen
AI generated
$
/etc
Linux
strace
Systemaufrufe von Prozessen live debuggen

Wenn ein PHP-FPM-Worker scheinbar grundlos hängt oder eine Anwendung mysteriöse Datei-Fehler wirft, liefert die Anwendungslogik oft keine brauchbaren Hinweise mehr. strace macht die Kommunikation eines Prozesses mit dem Kernel sichtbar, Syscall für Syscall, und zeigt damit oft in Sekunden, woran ein Prozess wirklich scheitert.

10 Min. Lesezeit Linux Debugging Observability

1. Was strace eigentlich sichtbar macht

strace klinkt sich über die ptrace-Schnittstelle des Kernels in einen Prozess ein und protokolliert jeden Systemaufruf, den dieser Prozess tätigt, zusammen mit den übergebenen Argumenten, dem Rückgabewert und, falls der Aufruf fehlschlägt, dem passenden errno-Wert. Damit liegt eine Ebene offen, die für die Anwendung selbst meist unsichtbar bleibt: Jede Datei, die geöffnet wird, jeder Socket, der verbunden wird, jedes Signal, das eintrifft.

Für einen Magento-Hosting-Kontext ist das besonders wertvoll, weil ein Großteil der tatsächlichen Probleme, hängende PHP-FPM-Worker, verweigerte Dateizugriffe durch falsche Berechtigungen, blockierende Netzwerkverbindungen zu Redis oder Elasticsearch, sich exakt auf Ebene der Systemaufrufe manifestiert, lange bevor sie in einem Anwendungslog auftauchen, wenn sie dort überhaupt jemals auftauchen.

2. An einen bereits laufenden Prozess anhängen

Der häufigste Anwendungsfall in der Produktion ist nicht das Starten eines neuen Prozesses unter strace, sondern das nachträgliche Anhängen an einen bereits laufenden Prozess über die PID mit dem Flag -p. Das ist entscheidend, wenn ein PHP-FPM-Worker bereits seit Minuten hängt und der Neustart des gesamten Pools den Fehler nur verschleiern, aber nicht diagnostizieren würde.

Beim Anhängen unterbricht strace den Prozess kurz, um sich einzuklinken, danach läuft der Prozess normal weiter, nur eben beobachtet. Für mehrere Worker gleichzeitig lässt sich -f mit einer Prozessgruppe kombinieren, sodass auch Kindprozesse automatisch mitverfolgt werden, was bei PHP-FPM mit seinem Master-Worker-Modell fast immer notwendig ist.


# PID des hängenden PHP-FPM-Workers ermitteln
ps aux | grep php-fpm

# An den laufenden Prozess anhängen, Ausgabe in Datei mit Zeitstempeln
strace -p 28417 -tt -o /var/log/strace-fpm-worker.log

# Mehrere Threads/Kindprozesse desselben Prozesses gleichzeitig verfolgen
strace -f -p 28417 -tt

3. Fallbeispiel: Den hängenden PHP-FPM-Worker diagnostizieren

Ein klassisches Symptom: Ein FPM-Worker zeigt in ps weiterhin Rechenzeit, reagiert aber nicht mehr auf neue Requests. strace zeigt in solchen Fällen fast immer den letzten Syscall, in dem der Prozess blockiert, etwa ein read auf einen Socket, der nie eine Antwort liefert, oder ein flock, das auf eine bereits gehaltene Datei-Sperre wartet.

Bleibt die Ausgabe nach dem Anhängen komplett aus, ohne dass ein neuer Syscall protokolliert wird, ist der Prozess bereits in genau diesem Zustand hängen geblieben, bevor strace überhaupt gestartet wurde. Das allein ist schon eine wichtige Diagnose: Der Prozess wartet nicht auf CPU-Zeit, sondern blockiert in einem einzigen Systemaufruf, meist Netzwerk-I/O oder ein Locking-Mechanismus im Dateisystem.


# Anhängen und beobachten, ob überhaupt noch neue Syscalls auftauchen
strace -p 28417 -tt

# Typische Ausgabe bei blockierendem Redis-Aufruf:
# 14:22:01.120441 read(11, ...) = ... (dauert, kein Return)
#
# Wird nach mehreren Sekunden kein weiterer Syscall protokolliert,
# haengt der Prozess exakt in diesem read() Aufruf fest

4. Einen neuen Prozess direkt unter strace starten

Neben dem Anhängen an laufende Prozesse lässt sich strace auch direkt vor ein Kommando setzen, um einen neuen Prozess von Anfang an zu beobachten. Das eignet sich besonders für kurzlebige Kommandozeilen-Skripte, Cron-Jobs oder CLI-Aufrufe von Magento, bei denen der Fehler reproduzierbar auftritt.

Für PHP-CLI-Skripte, die etwa in einem Cron-Job fehlschlagen, liefert dieser Ansatz oft die vollständige Erklärung: Ein fehlendes Verzeichnis, eine falsche Umgebungsvariable oder eine nicht erreichbare Konfigurationsdatei zeigt sich unmittelbar als fehlgeschlagener openat-Aufruf mit ENOENT als Rückgabewert.


# Neuen Prozess direkt unter strace starten
strace -f -o /tmp/cron-debug.log php bin/magento indexer:reindex

# Nur Datei-bezogene Syscalls anzeigen, um fehlende Pfade zu finden
strace -f -e trace=open,openat,stat,access php bin/magento cache:flush

5. Fehlgeschlagene Datei-Zugriffe gezielt aufspüren

Berechtigungsprobleme gehören zu den häufigsten, aber am schwersten zu lokalisierenden Fehlern in gewachsenen Magento-Installationen. Statt Verzeichnis für Verzeichnis manuell zu prüfen, filtert man mit -e trace= gezielt auf datei-bezogene Syscalls und liest aus der Ausgabe direkt ab, welcher Pfad mit welchem Fehlercode scheitert.

Besonders aufschlussreich ist die Kombination aus -e trace=file, das alle datei-bezogenen Aufrufe wie openat, stat, unlink und chmod zusammenfasst, mit -Z, das ausschließlich fehlgeschlagene Aufrufe anzeigt. Dadurch verschwindet das Rauschen erfolgreicher Aufrufe komplett und nur die tatsächlichen Fehler bleiben sichtbar.


# Nur fehlgeschlagene, datei-bezogene Systemaufrufe anzeigen
strace -f -e trace=file -Z -p 28417

# Beispielausgabe bei fehlender Schreibberechtigung:
# openat(AT_FDCWD, "/var/www/html/var/cache/lock", O_CREAT|O_WRONLY) = -1 EACCES (Permission denied)

6. Filtern nach Syscall-Kategorien für gezielte Analysen

Neben der reinen Datei-Filterung kennt strace vordefinierte Syscall-Gruppen wie network, signal, ipc und process, die sich über -e trace= gezielt einschalten lassen. Für Netzwerkprobleme mit externen Diensten wie Elasticsearch oder Redis liefert -e trace=network ausschließlich Verbindungsaufbau, Datenübertragung und Verbindungsabbruch, ohne die Menge an Datei-Syscalls, die ein PHP-Prozess parallel dazu erzeugt.

Zusätzlich lässt sich die Ausgabe mit -c in eine statistische Zusammenfassung verwandeln, die pro Syscall-Typ Häufigkeit und kumulierte Zeit anzeigt. Das ist der schnellste Weg, um herauszufinden, ob ein Prozess seine Zeit überwiegend mit Datei-I/O, Netzwerk-I/O oder Speicherverwaltung verbringt, bevor man tiefer in einzelne Aufrufe einsteigt.


# Nur Netzwerk-Syscalls verfolgen, etwa für Redis-/Elasticsearch-Verbindungen
strace -f -e trace=network -p 28417

# Statistische Zusammenfassung über 5 Sekunden Laufzeit
timeout 5 strace -c -p 28417

7. Performance-Overhead und Einsatz in Produktion

strace ist kein Werkzeug für den Dauerbetrieb: Da jeder Systemaufruf den beobachteten Prozess anhält, an strace übergibt und danach fortsetzt, kann der Overhead je nach Syscall-Rate den Prozess um den Faktor zwei bis mehrere hundert verlangsamen. Für einen einzelnen hängenden Worker in einem Notfall ist das meist akzeptabel, für einen gesamten produktiven FPM-Pool unter Last aber nicht.

In der Praxis bedeutet das: strace gezielt an einzelnen, bereits auffälligen Prozessen einsetzen, die Beobachtungszeit möglichst kurz halten und im Zweifel mit timeout begrenzen. Für breitere, dauerhafte Beobachtung eines gesamten Systems ist strace grundsätzlich das falsche Werkzeug, dafür eignen sich Kernel-native Tracing-Mechanismen deutlich besser.


# Beobachtungszeit bewusst begrenzen, um Overhead zu minimieren
timeout 10 strace -p 28417 -tt -o /tmp/kurzcheck.log

# Anzahl der Syscalls pro Sekunde grob abschaetzen, um den Overhead einzuschaetzen
strace -c -f -p 28417 &
sleep 5
kill %1

8. Wann ltrace oder perf die bessere Wahl sind

strace zeigt ausschließlich Kernel-Grenzübertritte, also Systemaufrufe. Wenn der Verdacht eher bei Bibliotheksfunktionen liegt, etwa einer bestimmten OpenSSL- oder libc-Funktion, die sich seltsam verhält, aber keinen eigenen Syscall auslöst, liefert ltrace die passendere Sicht, weil es Aufrufe von dynamisch gelinkten Bibliotheksfunktionen protokolliert statt Kernel-Aufrufe.

Für Performance-Fragen jenseits einzelner blockierender Aufrufe, etwa warum ein Prozess insgesamt viel CPU-Zeit verbraucht, ist perf das deutlich passendere Werkzeug, weil es mit statistischem Sampling arbeitet und dadurch einen Bruchteil des Overheads von strace verursacht. strace beantwortet die Frage 'Woran hängt dieser eine Prozess gerade fest', perf beantwortet eher die Frage 'Wo verbringt dieser Prozess insgesamt seine Zeit'.

Für tieferes, systemweites Tracing ohne den Overhead von ptrace bieten sich zudem eBPF-basierte Werkzeuge wie bpftrace an, die Syscall-Ereignisse direkt im Kernel auswerten, statt jeden Aufruf über einen Kontextwechsel an ein Userspace-Programm zu reichen.

9. Best Practices für den produktiven Einsatz

Immer mit möglichst engem Syscall-Filter arbeiten, statt pauschal alles zu protokollieren: Das reduziert sowohl den Overhead als auch die Menge an Daten, die anschließend durchsucht werden muss. Zeitstempel mit -tt sind Pflicht, sobald es um zeitliche Zusammenhänge geht, etwa um festzustellen, wie lange ein bestimmter Aufruf tatsächlich blockiert hat.

Die Ausgabe grundsätzlich in eine Datei mit -o umleiten statt auf dem Terminal mitzulesen, besonders bei -f mit vielen Kindprozessen, weil die Ausgabemenge sonst schnell unübersichtlich wird. Nach der Diagnose gehört strace konsequent wieder abgeschaltet, ein vergessener strace-Prozess im Hintergrund bleibt ein unnötiger, dauerhafter Performance-Overhead auf dem Server.

Werkzeug Beobachtungsebene Typischer Overhead Idealer Einsatzfall
strace Systemaufrufe (Kernel-Grenze) Hoch, Faktor 2 bis mehrere hundert Einzelnen hängenden Prozess gezielt diagnostizieren
ltrace Bibliotheksfunktionen (z. B. libc, OpenSSL) Hoch, ähnlich strace Verdacht auf fehlerhafte Bibliotheksaufrufe
perf CPU-Sampling, Kernel-Events Gering, statistisches Sampling Warum verbraucht ein Prozess so viel CPU-Zeit
bpftrace/eBPF Kernel-Events ohne Kontextwechsel pro Aufruf Sehr gering Systemweites, dauerhaftes Tracing in Produktion

Mironsoft

Server-Administration, Docker-Hosts und Performance-Tuning

Linux-Server, die niemand im Team richtig versteht?

Wir übernehmen Setup, Absicherung und Performance-Tuning von Linux-Servern und Docker-Hosts für Magento-Deployments, dokumentiert und nachvollziehbar statt gewachsen und unklar.

Server-Audit

Bestehende Server-Konfiguration auf Sicherheitslücken und Performance-Bremsen prüfen.

Docker-Host-Setup

Produktionsreife Docker-Umgebungen für Magento sauber aufsetzen und absichern.

Monitoring & Tuning

Ressourcenverbrauch messen und Systemd, Kernel und Dienste gezielt optimieren.

10. Zusammenfassung

strace

Zielgruppe

Server-Admins bei hängenden PHP-FPM-Workern und Datei-Fehlern

Kernbefehl

strace -f -p PID -tt -o logdatei

Kombinierbar mit

timeout zur Begrenzung der Beobachtungszeit

Größter Fallstrick

Dauerhafter Einsatz unter Produktionslast statt gezielter Diagnose

11. FAQ: strace

1Verlangsamt strace den beobachteten Prozess spürbar?
Ja, teils erheblich. Da jeder Systemaufruf über strace umgeleitet wird, kann der Overhead je nach Syscall-Rate den Prozess um den Faktor zwei bis mehrere hundert verlangsamen. Für kurze, gezielte Diagnosen ist das meist akzeptabel, für Dauerbetrieb nicht.
2Kann ich strace ohne Root-Rechte an einen fremden Prozess anhängen?
Standardmäßig verhindert der Kernel-Parameter yama.ptrace_scope, dass unprivilegierte Nutzer an Prozesse anderer Nutzer anhängen. In der Praxis läuft strace für Produktionsprozesse fast immer mit Root-Rechten oder passenden Capabilities.
3Wie finde ich schnell heraus, in welchem Syscall ein Prozess hängt?
An den Prozess anhängen mit strace -p PID -tt und beobachten, ob überhaupt neue Zeilen erscheinen. Bleibt die Ausgabe leer, ist der letzte protokollierte Syscall der blockierende Aufruf, meist ein read, flock oder connect.
4Was bedeutet die Fehlermeldung EACCES in der strace-Ausgabe?
EACCES zeigt an, dass der Systemaufruf wegen fehlender Dateisystem-Berechtigungen fehlgeschlagen ist. Die Zeile davor nennt den betroffenen Pfad, sodass sich die falsche Berechtigung meist sofort korrigieren lässt.
5Warum sollte ich -e trace=file statt strace ohne Filter nutzen?
Ohne Filter protokolliert strace jeden Systemaufruf, was bei datei-bezogenen Fragestellungen sehr viel Rauschen erzeugt. -e trace=file beschränkt die Ausgabe auf Datei-Operationen wie openat, stat und chmod und macht die Analyse deutlich übersichtlicher.
6Kann strace auch Kindprozesse eines Prozesses mitverfolgen?
Ja, mit dem Flag -f werden alle durch fork oder clone erzeugten Kindprozesse automatisch mitverfolgt. Das ist bei PHP-FPM mit seinem Master-Worker-Modell in der Regel notwendig, um das vollständige Bild zu erhalten.
7Wann ist ltrace die bessere Wahl gegenüber strace?
ltrace protokolliert Aufrufe an dynamisch gelinkte Bibliotheksfunktionen statt Kernel-Systemaufrufe. Das ist sinnvoll, wenn der Verdacht bei einer Bibliotheksfunktion wie einer OpenSSL-Routine liegt, die keinen eigenen Syscall auslöst.
8Wie beschränke ich die Beobachtungszeit von strace automatisch?
Mit dem Kommando timeout vor strace, etwa timeout 10 strace -p PID. Nach Ablauf der angegebenen Sekunden wird strace automatisch beendet, ohne dass der beobachtete Prozess selbst beendet wird.
9Kann ich mit strace auch die Zeitdauer einzelner Syscalls messen?
Ja, mit dem Flag -T wird für jeden Syscall die Ausführungsdauer angehängt. In Kombination mit -tt lässt sich so genau nachvollziehen, wann ein Aufruf begann und wie lange er tatsächlich blockierte.
10Ist strace für dauerhaftes Monitoring eines produktiven Systems geeignet?
Nein. Der hohe Overhead pro Systemaufruf macht strace für Dauerbetrieb ungeeignet. Für dauerhafte, systemweite Beobachtung eignen sich eBPF-basierte Werkzeuge wie bpftrace deutlich besser, weil sie ohne den Kontextwechsel pro Aufruf auskommen.