Lernen Sie Brendan Greggs praktische Methoden (USE, RED, Flame-Graphs), um Latenz und Produktions-Engpässe mit Daten — nicht mit Vermutungen — zu untersuchen.

Brendan Gregg ist einer der einflussreichsten Stimmen im Bereich Systemperformance, besonders im Linux-Umfeld. Er hat weit verbreitete Bücher geschrieben, praktische Werkzeuge entwickelt und—am wichtigsten—klare Methoden geteilt, um echte Produktionsprobleme zu untersuchen. Teams übernehmen seinen Ansatz, weil er unter Druck funktioniert: wenn die Latenz steigt und alle Antworten erwarten, braucht man einen Weg, von „vielleicht ist es X“ zu „es ist definitiv Y“ zu kommen — mit möglichst wenig Drama.
Eine Performance-Methodik ist kein einzelnes Tool oder ein cleverer Befehl. Es ist eine wiederholbare Vorgehensweise: eine Checkliste, was man zuerst betrachtet, wie man das Gesehene interpretiert und wie man entscheidet, was als Nächstes zu tun ist.
Diese Wiederholbarkeit reduziert das Raten. Anstatt sich auf die Person mit der meisten Intuition (oder der lautesten Meinung) zu verlassen, folgt man einem konsistenten Prozess, der:
Viele Latenz-Untersuchungen gehen in den ersten fünf Minuten schief. Leute springen sofort zu Maßnahmen: „mehr CPU“, „Service neu starten“, „Cache vergrößern“, „GC tunen“, „es muss das Netzwerk sein“. Manchmal helfen diese Aktionen—oft verdecken sie das Signal, verschwenden Zeit oder bringen neue Risiken.
Greggs Methoden drängen dazu, „Lösungen“ aufzuschieben, bis man einfachere Fragen beantworten kann: Was ist ausgelastet? Was erzeugt Fehler? Was ist langsamer geworden — Durchsatz, Warteschlangen oder einzelne Operationen?
Dieser Leitfaden hilft, den Umfang einzugrenzen, die richtigen Signale zu messen und den Engpass zu bestätigen, bevor Sie optimieren. Ziel ist ein strukturiertes Vorgehen zur Untersuchung von Latenz- und Profiling-Problemen in Produktion, sodass Ergebnisse nicht vom Glück abhängen.
Latenz ist ein Symptom: Nutzer warten länger, bis Arbeit fertig ist. Die Ursache liegt meist woanders — CPU-Contention, Festplatten- oder Netzwerkwartezeiten, Sperr-Contention, Garbage Collection, Queuing oder Verzögerungen bei entfernten Abhängigkeiten. Latenz allein zu messen sagt Ihnen nur, dass Schmerz besteht, nicht wo er herkommt.
Diese drei Signale sind gekoppelt:
Erfassen Sie vor dem Tuning alle drei Signale für dasselbe Zeitfenster. Ansonsten könnten Sie Latenz „reparieren“, indem Sie Arbeit verwerfen oder schneller fehlschlagen lassen.
Der Durchschnitt verschleiert Spitzen, die Nutzer erinnern. Ein Service mit 50 ms Durchschnitt kann dennoch häufige 2 s-Stalls haben.
Verfolgen Sie Perzentile:
Beobachten Sie auch die Form der Latenz: ein stabiler p50 mit steigendem p99 deutet oft auf intermittierende Stalls hin (z. B. Sperr-Contention, I/O-Hänger, Stop-the-world-Pausen) statt auf eine allgemeine Verlangsamung.
Ein Latenz-Budget ist ein einfaches Abrechnungsmodell: „Wenn die Anfrage in 300 ms fertig sein muss, wie darf Zeit verteilt werden?“ Teilen Sie es in Buckets wie:
Dieses Budget strukturiert die erste Messaufgabe: identifizieren Sie, welcher Bucket während des Spitzenereignisses gewachsen ist, und untersuchen Sie diesen Bereich statt blind zu tunen.
Latenz-Analysen geraten aus dem Ruder, wenn das „Problem“ als das System ist langsam beschrieben wird. Greggs Methoden beginnen früher: zwingen Sie die Fragestellung in eine konkrete, testbare Frage.
Schreiben Sie zwei Sätze auf, bevor Sie ein Tool anfassen:
Das verhindert, dass Sie die falsche Schicht optimieren — z. B. Host-CPU — wenn der Schmerz auf einen Endpunkt oder eine downstream-Abhängigkeit beschränkt ist.
Wählen Sie ein Fenster, das zur Beschwerde passt und idealerweise eine „gute“ Vergleichsperiode enthält.
Begrenzen Sie Ihren Scope explizit:
Präzision hier macht spätere Schritte (USE, RED, Profiling) schneller, weil Sie wissen, welche Daten sich ändern sollten, wenn Ihre Hypothese stimmt.
Notieren Sie Deploys, Konfigurationsänderungen, Traffic-Verschiebungen und Infrastruktur-Events — aber nehmen Sie keine Kausalität an. Formulieren Sie sie als „Wenn X, dann würden wir Y erwarten“, damit Sie schnell bestätigen oder verwerfen können.
Ein kleines Log verhindert doppelte Arbeit im Team und erleichtert Übergaben.
Time | Question | Scope | Data checked | Result | Next step
Schon fünf Zeilen wie diese können ein stressiges Incident in einen wiederholbaren Prozess verwandeln.
Die USE-Methode (Utilization, Saturation, Errors) ist Greggs schnelle Checkliste, um die „großen vier“ Ressourcen — CPU, Speicher, Festplatte (Storage) und Netzwerk — zu scannen, damit Sie aufhören zu raten und beginnen, das Problem einzugrenzen.
Anstatt Dutzende Dashboards zu starren, stellen Sie für jede Ressource dieselben drei Fragen:
Konsistent angewendet wird das zu einem schnellen Inventar, wo „Druck“ existiert.
Für CPU ist Utilization der CPU-Busy-%, Saturation zeigt sich als Run-Queue-Druck oder Threads, die auf Ausführung warten, und Errors können Throttling in Containern oder fehlerhafte Interrupts sein.
Für Speicher ist Utilization genutzter Speicher, Saturation zeigt sich als Paging oder häufige Garbage Collection, und Errors umfassen Allokationsfehler oder OOM-Events.
Für Festplatte ist Utilization die Device-Busy-Zeit, Saturation ist Queue-Depth und Read/Write-Wartezeit, und Errors sind I/O-Fehler oder Timeouts.
Für Netzwerk ist Utilization Durchsatz, Saturation sind Drops/Queues/Latenz und Errors sind Retransmits, Resets oder Paketverlust.
Bei Nutzerberichten über Langsamkeit sind oft Saturation-Signale am aufschlussreichsten: Warteschlangen, Wartezeit und Contention korrelieren tendenziell direkter mit Latenz als rohe Auslastung.
Service-Level-Metriken (wie Request-Latenz und Fehlerquote) sagen Ihnen den Impact. USE sagt Ihnen, wo Sie als Nächstes schauen sollten, indem es die Ressource identifiziert, die unter Druck steht.
Eine praktische Schleife ist:
Die RED-Methode hält Sie an der Nutzererfahrung orientiert, bevor Sie in Host-Grafiken abtauchen.
RED verhindert, dass Sie „interessanten“ Systemmetriken hinterherjagen, die die Nutzer nicht betreffen. Es erzwingt eine engere Schleife: Welcher Endpunkt ist langsam, für welche Nutzer und seit wann? Wenn die Duration nur bei einer Route steigt, während die gesamte CPU flach bleibt, haben Sie schon einen schärferen Startpunkt.
Eine nützliche Gewohnheit: Halten Sie RED nach Service und Top-Endpunkten getrennt. Das macht es einfach, eine breite Verschlechterung von einer lokalen Regression zu unterscheiden.
RED sagt Ihnen wo der Schmerz ist. USE hilft zu testen, welche Ressource verantwortlich ist.
Beispiele:
Halten Sie das Layout fokussiert:
Wenn Sie einen konsistenten Incident-Workflow wollen, koppeln Sie diesen Abschnitt mit dem USE-Inventar unter /blog/use-method-overview, damit Sie von „Nutzer fühlen es“ zu „diese Ressource ist die Einschränkung“ mit weniger Hin- und Herspringen kommen.
Eine Performance-Untersuchung kann in Minuten zu Dutzenden Charts und Hypothesen explodieren. Greggs Denkweise ist, es eng zu halten: Ihre Aufgabe ist nicht „mehr Daten zu sammeln“, sondern die nächste Frage zu stellen, die am schnellsten Unsicherheit eliminiert.
Die meisten Latenzprobleme werden von einer dominanten Kostenstelle (oder einem kleinen Paar) dominiert: eine heiße Sperre, eine langsame Abhängigkeit, eine überlastete Festplatte, ein GC-Pausenmuster. Priorisierung bedeutet, diese dominante Kostenstelle zuerst zu suchen, weil 5 % Verkürzung an fünf verschiedenen Stellen selten die für den Nutzer sichtbare Latenz bewegt.
Ein praktischer Test: „Was könnte den größten Teil der Latenzänderung erklären?“ Wenn eine Hypothese nur einen winzigen Anteil erklären kann, ist sie niedriger priorisiert.
Benutzen Sie Top-down, wenn Sie beantworten wollen „Sind Nutzer betroffen?“ Starten Sie bei Endpunkten (RED-Signale): Latenz, Durchsatz, Fehler. Das hilft, zu vermeiden, etwas zu optimieren, das nicht auf dem kritischen Pfad liegt.
Benutzen Sie Bottom-up, wenn der Host offensichtlich krank ist (USE-Symptome): CPU-Sättigung, nicht kontrollierbarer Speicherdruck, I/O-Wartezeiten. Wenn ein Node ausgelastet ist, verschwenden Sie Zeit, wenn Sie nur Endpoint-Perzentile anstarren, ohne die Beschränkung zu verstehen.
Wenn ein Alert kommt, wählen Sie einen Zweig und bleiben Sie dabei, bis Sie ihn bestätigen oder falsifizieren:
Beschränken Sie sich auf einen kleinen Startsatz an Signalen und bohren Sie nur dann tiefer, wenn sich etwas bewegt. Wenn Sie eine Checkliste brauchen, um den Fokus zu halten, verlinken Sie Ihre Schritte zu einem Runbook wie /blog/performance-incident-workflow, sodass jede neue Metrik einen Zweck hat: eine bestimmte Frage zu beantworten.
Produktionsprofiling fühlt sich riskant an, weil es das Live-System berührt — aber es ist oft der schnellste Weg, Debatte durch Beweis zu ersetzen. Logs und Dashboards können sagen, dass etwas langsam ist. Profiling sagt, wo Zeit vergeht: welche Funktionen heißlaufen, welche Threads warten und welche Codepfade während des Vorfalls dominieren.
Profiling ist ein Werkzeug zur „Zeitbudget“-Analyse. Anstatt Theorien zu streiten („es ist die DB“ vs „es ist GC“), erhalten Sie Belege wie „45% der CPU-Samples waren in JSON-Parsen“ oder „die meisten Requests sind auf einem Mutex blockiert“. Das schränkt den nächsten Schritt auf ein oder zwei konkrete Fixes ein.
Jeder beantwortet eine andere Frage. Hohe Latenz bei niedriger CPU deutet eher auf off-CPU- oder Lock-Zeit als auf CPU-Hotspots hin.
Viele Teams starten on-demand und gehen dann zu always-on über, sobald sie der Sicherheit vertrauen und wiederkehrende Probleme sehen.
Produktionssicheres Profiling bedeutet Kosten zu kontrollieren. Bevorzugen Sie Sampling (nicht jedes Ereignis verfolgen), halten Sie Aufnahmefenster kurz (z. B. 10–30 Sekunden) und messen Sie den Overhead zuerst in einem Canary. Wenn Sie unsicher sind, starten Sie mit niedriger Sampling-Frequenz und erhöhen Sie nur, wenn das Signal zu verrauscht ist.
Flame-Graphs visualisieren, wohin die gesamplete Zeit während eines Profiling-Fensters ging. Jedes „Rechteck“ ist eine Funktion (oder Stack-Frame), und jeder Stack zeigt, wie die Ausführung diese Funktion erreicht hat. Sie sind hervorragend, um Muster schnell zu erkennen — aber sie sagen nicht automatisch „der Bug ist hier“.
Ein Flame-Graph repräsentiert in der Regel on-CPU-Samples: Zeit, in der das Programm tatsächlich auf einem CPU-Kern lief. Er kann CPU-intensiven Codepfad, ineffizientes Parsen, übermäßige Serialisierung oder Hotspots hervorheben, die wirklich CPU verbrennen.
Er zeigt aber nicht direkt Wartezeiten auf Festplatte, Netzwerk, Scheduler-Delays oder Blockaden auf einem Mutex (das ist off-CPU-Zeit und benötigt anderes Profiling). Er beweist auch keine Kausalität für nutzerseitige Latenz, es sei denn, Sie verbinden ihn mit einer genau abgegrenzten Symptomatik.
Die breiteste Box zu beschuldigen ist verlockend, aber fragen Sie: ist das ein Hotspot, den Sie ändern können, oder einfach „Zeit in malloc, GC oder Logging“, weil das eigentliche Problem stromaufwärts liegt? Achten Sie auch auf fehlenden Kontext (JIT, Inlining, Symbole), die ein Rechteck wie den Schuldigen aussehen lassen können, obwohl es nur die Vermittlerfunktion ist.
Behandeln Sie einen Flame-Graph als Antwort auf eine eng gefasste Frage: welcher Endpunkt, welches Zeitfenster, welche Hosts und was hat sich geändert. Vergleichen Sie „vorher vs. nachher“ (oder „gesund vs. degradierend“) Flame-Graphs für denselben Request-Pfad, um Profiling-Rauschen zu vermeiden.
Bei Latenzspitzen starren viele Teams zuerst auf CPU%-Werte. Das ist verständlich — aber oft irreführend. Ein Service kann „nur 20% CPU“ nutzen und trotzdem schmerzhaft langsam sein, wenn seine Threads den Großteil ihrer Zeit nicht laufend verbringen.
CPU% beantwortet „wie beschäftigt ist der Prozessor?“ Es beantwortet nicht „wo ist meine Request-Zeit geblieben?“ Requests können stillstehen, während Threads warten, blockiert sind oder vom Scheduler geparkt werden.
Eine zentrale Idee: die Wall-Clock-Zeit einer Anfrage umfasst sowohl on-CPU Arbeit als auch off-CPU Wartezeiten.
Off-CPU-Zeit verbirgt sich typischerweise hinter Abhängigkeiten und Contention:
Einige Signale korrelieren oft mit Off-CPU-Engpässen:
Diese Symptome sagen „wir warten“, aber nicht worauf.
Off-CPU-Profiling schreibt Zeit der Ursache zu, warum Sie nicht liefen: blockiert in Syscalls, wartend auf Sperren, schlafend oder descheduliert. Das ist mächtig für Latenz-Arbeit, weil es vage Verlangsamungen in handhabbare Kategorien verwandelt: „blockiert an Mutex X“, „wartet auf read() von der Festplatte“ oder „steckt in connect() zu einem Upstream“. Sobald Sie den Wartegrund benennen können, können Sie ihn messen, bestätigen und beheben.
Performance-Arbeit scheitert oft am selben Punkt: jemand sieht eine verdächtige Metrik, erklärt sie zum „Problem“ und beginnt zu tunen. Greggs Methoden drängen dazu, langsamer zu werden und zu beweisen, was das System limitiert, bevor Sie etwas ändern.
Ein Engpass ist die Ressource oder Komponente, die aktuell Throughput begrenzt oder Latenz antreibt. Wenn Sie ihn entlasten, sehen Nutzer eine Verbesserung.
Ein Hotspot ist, wo Zeit verbracht wird (z. B. eine Funktion, die häufig in einem Profil auftaucht). Hotspots können echte Engpässe sein — oder einfach viel Arbeit, die den langsamen Pfad nicht beeinflusst.
Rauschen ist alles, was bedeutungsvoll aussieht, es aber nicht ist: Hintergrundjobs, Einmal-Spikes, Sample-Artefakte, Cache-Effekte oder „Top-Talker“, die nicht mit dem nutzerseitigen Problem korrelieren.
Beginnen Sie mit einer sauberen Before-Momentaufnahme: dem nutzerseitigen Symptom (Latenz oder Fehlerquote) und den führenden Kandidaten-Signalen (CPU-Sättigung, Queuetiefe, Disk-I/O, Sperr-Contention usw.). Dann führen Sie eine kontrollierte Änderung durch, die nur Ihre vermutete Ursache beeinflussen sollte.
Beispiele für kausale Tests:
Korrelation ist ein Hinweis, kein Urteil. Wenn „CPU steigt, wenn Latenz steigt“, verifizieren Sie durch Veränderung der CPU-Verfügbarkeit oder Reduktion der CPU-Arbeit, ob die Latenz folgt.
Schreiben Sie auf: was gemessen wurde, die genaue Änderung, Before/After-Ergebnisse und die beobachtete Verbesserung. Das macht einen einmaligen Erfolg zu einem wiederverwendbaren Playbook für den nächsten Vorfall — und verhindert, dass „Intuition“ später die Geschichte umschreibt.
Performance-Incidents fühlen sich dringlich an — genau dann schleichen sich Raten ein. Ein leichtgewichtiger, wiederholbarer Workflow hilft Ihnen, von „etwas ist langsam“ zu „wir wissen, was sich geändert hat“ zu kommen, ohne Thrash.
Erkennen: Alarmieren Sie auf nutzerrelevante Latenz und Fehler, nicht nur CPU. Rufen Sie an, wenn p95/p99-Latenz für ein sustainetes Fenster einen Grenzwert überschreitet.
Triagieren: Beantworten Sie sofort drei Fragen: was ist langsam, wann hat es begonnen und wer ist betroffen? Wenn Sie den Scope (Service, Endpoint, Region, Kohorte) nicht benennen können, sind Sie nicht bereit zu optimieren.
Messen: Sammeln Sie Belege, die den Engpass eingrenzen. Bevorzugen Sie zeitlich begrenzte Aufnahmen (z. B. 60–180 Sekunden), damit Sie „schlecht“ vs. „gut“ vergleichen können.
Beheben: Ändern Sie eine Sache nach der anderen und messen Sie dann dieselben Signale erneut, um Verbesserung zu bestätigen und Placebo auszuschließen.
Halten Sie ein gemeinsames Dashboard, das jeder während Incidents benutzt. Machen Sie es langweilig und konsistent:
Ziel ist nicht, alles zu graphen; es ist, die Time-to-First-Fact zu verkürzen.
Instrumentieren Sie die Endpunkte, die am wichtigsten sind (Checkout, Login, Suche), nicht jeden Endpunkt. Vereinbaren Sie für jeden: erwarteter p95, maximale Fehlerquote und Schlüsselabhängigkeit (DB, Cache, Drittanbieter).
Vereinbaren Sie vor dem nächsten Ausfall ein Capture-Kit:
Dokumentieren Sie das in einem kurzen Runbook (z. B. /runbooks/latency), inklusive wer Captures ausführen darf und wo Artefakte abgelegt werden.
Greggs Methodik dreht sich grundlegend um kontrollierte Änderungen und schnelle Verifikation. Wenn Ihr Team Services mit Koder.ai (einer chat-gesteuerten Plattform zur Generierung und Iteration von Web-, Backend- und Mobile-Apps) baut, passen zwei Features gut zu dieser Denkweise:
Auch wenn Sie während eines Incidents keinen neuen Code generieren: diese Gewohnheiten — kleine Diffs, messbare Outcomes und schnelle Umkehrbarkeit — sind dieselben, die Gregg empfiehlt.
Es ist 10:15 Uhr und Ihr Dashboard zeigt, dass die p99-Latenz der API bei Spitzenlast von ~120 ms auf ~900 ms steigt. Die Fehlerquote ist stabil, aber Kunden melden „langsame“ Requests.
Starten Sie service-first: Rate, Errors, Duration.
Sie slice Duration nach Endpunkt und sehen, dass eine Route die p99 dominiert: POST /checkout. Die Rate ist 2× höher, Fehler sind normal, aber die Duration steigt speziell bei erhöhter Concurrency. Das deutet auf Queuing oder Contention hin, nicht auf einen völligen Ausfall.
Prüfen Sie als Nächstes, ob die Latenz Rechenzeit oder Wartezeit ist: vergleichen Sie die Anwendungs-„Handler-Zeit“ mit der Gesamtanfragezeit (oder upstream vs downstream Spans, wenn Tracing vorhanden ist). Die Handler-Zeit ist niedrig, die Gesamtzeit hoch — Anfragen warten.
Inventarisieren Sie wahrscheinliche Engpässe: Utilization, Saturation, Errors für CPU, Speicher, Festplatte und Netzwerk.
Die CPU-Auslastung liegt nur bei ~35%, aber Run-Queue und Kontextwechsel steigen. Disk und Netzwerk sehen stabil aus. Diese Diskrepanz (niedrige CPU%, hohe Wartezeiten) ist ein klassischer Hinweis: Threads verbrennen keine CPU — sie sind blockiert.
Sie erfassen ein Off-CPU-Profil während des Spikes und finden viel Zeit in einem Mutex um einen geteilten „Promotion-Validation“-Cache.
Sie ersetzen die globale Sperre durch eine Per-Key-Sperre (oder einen lock-freien Read-Pfad), deployen und beobachten, dass p99 wieder auf das Basisniveau sinkt, während die Rate hoch bleibt.
Post-Incident-Checkliste: