Kapitel 4. Statistik-Fibel
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Statistik ist ein unterschätztes Thema in der Welt der Softwareentwicklung und Systemadministration. Es wird auch missverstanden: Viele Leute, mit denen ich im Laufe der Jahre gesprochen habe, gehen von der falschen Annahme aus, dass "ein bisschen Statistik" am anderen Ende Magie hervorbringen wird. Leider ist das nicht ganz der Fall.
Ich freue mich jedoch, sagen zu können, dass eine grundlegende Lektion in Statistik sowohl einfach als auch unglaublich nützlich für deine Arbeit im Monitoring ist.
Vor der Statistik im Systembetrieb
Bevor wir uns mit der Statistikstunde beschäftigen, ist es hilfreich, ein wenig über die Hintergründe zu erfahren.
Ich befürchte, dass die Verbreitung und der Einfluss von Nagios die Verbesserung der Überwachung für viele Teams im Keim erstickt hat. Das Einrichten eines Alarms mit Nagios ist so einfach und doch so oft ineffektiv.1
Wenn du mit Nagios eine Warnung zu einer bestimmten Kennzahl erhalten möchtest, vergleichst du den aktuellen Wert mit einem anderen Wert, den du bereits als Warn- oder kritischen Schwellenwert festgelegt hast. Nehmen wir zum Beispiel an, der zurückgegebene Wert ist 5 für den 15m-Lastdurchschnitt. Das Prüfskript vergleicht diesen Wert mit dem Warnwert oder dem kritischen Wert, der bei 4 bzw. 10 liegen könnte. In diesem Fall würde Nagios einen Alarm auslösen, wenn die Prüfung den Warnwert überschreitet, was zu erwarten ist. Leider ist das nicht sehr hilfreich.
Wie so oft können sich Systeme auf unerwartete (aber völlig in Ordnung) Weise verhalten. Was wäre zum Beispiel, wenn der Wert den Schwellenwert nur einmal überschritten hätte? Was wäre, wenn die nächste Überprüfung 60 Sekunden später einen Wert von 3,9 ergeben würde? Und bei der darauffolgenden 4,1? Wie du dir sicher vorstellen kannst, würde es dann unruhig werden.
Nagios und ähnliche Tools haben Mechanismen eingebaut, um den Lärm für diese spezielle Art von Problem zu dämpfen, und zwar in Form von der Flapping Detection. Das funktioniert ganz einfach und ziemlich naiv: Das Überwachungs-Tool bringt eine Prüfung zum Schweigen, die innerhalb einer bestimmten Zeitspanne zu oft zwischen OK und Alarm hin und her schwankt. Meiner Meinung nach sind Mechanismen wie die Flap Detection nur ein Deckmantel für schlechte Warnmeldungen. Was wäre, wenn es einen besseren Weg gäbe?
Mathe zur Rettung!
Eines der Grundprinzipien des modernen Monitoring-Stacks ist es, die Metriken, die dir der Überwachungsdienst liefert, nicht wegzuwerfen. Früher zeichnete Nagios die Werte, die es von einer Überprüfung erhielt, nicht auf, sodass du keine Ahnung hattest, welche Trends es gab, egal ob in der letzten Woche oder vor fünf Minuten. Zum Glück ist es heute üblich, diese Daten in einer Zeitreihendatenbank aufzuzeichnen, auch mit Nagios (siehe Graphios und pnp4nagios). Was oft übersehen wird, ist, dass die Aufzeichnung von Daten viele neue Möglichkeiten zur Problemerkennung durch den Einsatz von Statistiken eröffnet.
Alle wichtigen Zeitreihendatenbanken unterstützen grundlegende Statistiken. Die Konfiguration und Verwendung ist bei jeder Datenbank anders. Deshalb werde ich mich in diesem Kapitel mit den Statistiken selbst beschäftigen und nicht mit ihrer Verwendung in einem bestimmten Tool.
Wenn du an das Nagios-Modell zur Durchführung von Überprüfungen gewöhnt bist, müssen wir deine Denkweise ein wenig ändern. Anstatt dass das Überwachungssystem die Daten sammelt und die Werte gleichzeitig gegen einen festgelegten Schwellenwert prüft (ein typisches Nagios-Verhalten), entkoppeln wir diese beiden Funktionen in zwei separate.
Wir brauchen etwas, das die Daten sammelt und sie in regelmäßigen Abständen in die Zeitreihendatenbank schreibt (ich bin ein großer Fan von collectd für diesen Zweck). Außerdem muss Nagios die durchschnittliche Auslastung nicht direkt auf dem Host überprüfen, sondern anhand einer in der Zeitreihendatenbank gespeicherten Kennzahl. Dafür brauchst du ein anderes Prüfskript, das für die Abfrage der TSDB deiner Wahl entwickelt wurde (siehe Nagios + Graphite, Sensu + Graphite).
Eine der neuen Möglichkeiten dieser Methode ist, dass du die Prüfung nicht mehr nur gegen den letzten gemeldeten Wert durchführen musst, sondern gegen eine größere Anzahl von Werten. Dadurch kannst du grundlegende arithmetische und statistische Funktionen nutzen, was zu einer genaueren Problemerkennung führt. Diese zusätzliche Datenmenge ist für alles in diesem Kapitel von grundlegender Bedeutung, denn wir können keine Erkenntnisse gewinnen oder die Zukunft vorhersagen, wenn wir keine Ahnung von der Vergangenheit haben.
Statistik ist keine Magie
Es scheint eine weit verbreitete Meinung zu sein, dass man, wenn man "nur ein paar Statistiken auftischt", wichtige Erkenntnisse herausbekommt. Leider ist das nicht der Fall. Ein großer Teil der Arbeit in der Statistik besteht darin, herauszufinden, welcher Ansatz für deine Daten am besten geeignet ist, ohne dass er zu falschen Antworten führt.
Ich kann nicht hoffen, dass ich in diesem Buch allen statistischen Methoden, die du verwenden könntest, gerecht werden kann - schließlich wurden schon seit Jahrhunderten unzählige Bände zu diesem Thema geschrieben. Vielmehr möchte ich dir einige Grundlagen vermitteln, einige Missverständnisse ausräumen und dich in die Lage versetzen, zu wissen, wo du als Nächstes suchen musst. Also, lass uns eintauchen.
Mittelwert und Durchschnitt
Mittelwert, besser bekannt als Durchschnitt (und technisch gesehen als arithmetisches Mittel), ist nützlich, um festzustellen, wie ein Datensatz im Allgemeinen aussieht, ohne jeden einzelnen Eintrag in der Menge zu untersuchen. Die Berechnung des Mittelwerts ist einfach: Addiere alle Zahlen im Datensatz und teile sie dann durch die Anzahl der Einträge im Datensatz.
Eine häufige Anwendung der Mittelwertbildung in Zeitreihen ist der so genannte gleitende Durchschnitt. Anstatt den gesamten Datensatz zu nehmen und den Durchschnitt zu berechnen, wird der Durchschnitt berechnet, sobald neue Datenpunkte eintreffen. Ein Nebeneffekt dieses Verfahrens ist, dass es eine stachelige Grafik glättet. Dieses Verfahren wird auch in TSDBs für die Speicherung von aufgerollten Daten und in jedem Zeitreihendiagramm-Tool verwendet, wenn eine große Menge von Messwerten angezeigt wird.2
Wenn du zum Beispiel eine Kennzahl hast, die jede Minute für die letzte Stunde Werte enthält, hättest du 60 eindeutige Datenpunkte. Wie wir in Abbildung 4-1 sehen können, ist das verrauscht und schwer zu erkennen, was vor sich geht:
Die Anwendung eines gleitenden Durchschnitts mit Fünf-Minuten-Intervallen ergibt eine ganz andere Grafik. Das in Abbildung 4-2 gezeigte Diagramm nennen wir geglättet..:
Das heißt, dass durch die Mittelwertbildung die Spitzen und Täler verloren gegangen sind. Das hat Vor- und Nachteile: Indem wir die Extremwerte im Datensatz ausblenden, schaffen wir einen Datensatz mit Mustern, die leichter zu erkennen sind, aber wir verlieren auch Datenpunkte, die wertvoll sein könnten. Eine stärkere Glättung führt zu einer besseren Visualisierung, die auf Kosten der Genauigkeit geht. Mit anderen Worten: Das richtige Maß an Glättung zu bestimmen, ist ein Balanceakt .
Median
Der Median ist hilfreich, wenn der Durchschnitt nicht genau ist. Im Grunde genommen ist der Median die "Mitte" des Datensatzes. Tatsächlich wird der Median oft für die Analyse der Einkommensniveaus ganzer Bevölkerungsgruppen verwendet, weil er so genau ist. Wenn du 10 Personen hast, die alle ein Einkommen von 30.000 USD/Jahr haben, liegt der Durchschnitt ihrer Einkommen bei 30.000 USD, während der Median ebenfalls 30.000 USD beträgt. Wenn eine dieser 10 Personen reich wird und ein Einkommen von 500.000 USD/Jahr hat, steigt der Durchschnitt auf 77.000 USD, aber der Median bleibt gleich. Bei Datensätzen, die stark in eine Richtung verzerrt sind, kann der Median oft repräsentativer sein als der Mittelwert.
Um den Median zu berechnen, musst du den Datensatz zunächst in aufsteigender Reihenfolge sortieren und dann den Mittelwert nach der Formel (n + 1) / 2 berechnen, wobei n die Anzahl der Einträge im Datensatz ist.3 Wenn dein Datensatz eine ungerade Anzahl von Einträgen enthält, ist der Median genau der mittlere Eintrag. Enthält dein Datensatz jedoch eine gerade Anzahl von Einträgen, werden die beiden mittleren Zahlen gemittelt, was zu einem Medianwert führt, der keine Zahl aus dem ursprünglichen Datensatz ist.
Betrachten wir zum Beispiel den Datensatz: 0, 1, 1, 2, 3, 5, 8, 13, 21. Der Median ist 3. Wenn wir eine zehnte Zahl hinzufügen, so dass der Datensatz 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 wird, dann wird der Median 4.
Saisonalität
Saisonalität von Daten ist, wenn deine Datenpunkte ein sich wiederholendes Muster aufweisen. Wenn du zum Beispiel einen Monat lang jeden Tag deine Pendelzeit aufzeichnen würdest, würdest du feststellen, dass sie ein bestimmtes Muster aufweist. Es ist vielleicht nicht jeden Tag die gleiche Zeit, aber das Muster gilt für jeden Tag. Du nutzt dieses Wissen jeden Tag, um die Zukunft zu planen und vorherzusagen: Weil du weißt, wie lange dein Arbeitsweg normalerweise dauert, weißt du, wann du losfahren musst, um pünktlich im Büro zu sein. Ohne diese Saisonalität wäre es unmöglich, deinen Tag zu planen. Abbildung 4-3 zeigt ein Beispiel für die Saisonalität von Webserver-Anfragen.
Wenn ich aufgrund früherer Daten weiß, dass meine Webserver an einem bestimmten Wochentag etwa 100 Anfragen pro Sekunde bearbeiten, kann ich auch davon ausgehen, dass die Hälfte oder das Doppelte dieser Zahl vielleicht eine Untersuchung wert ist. Einige Tools ermöglichen es dir, dies auf einer rollierenden Basis anzuwenden, indem du Datenpunkte jetzt mit Datenpunkten in einem früheren Zeitraum vergleichst, z. B. die aktuelle Anfrage/Sekunde mit genau der gleichen Zeit vor einer Woche, einem Tag oder sogar einer Stunde davor. Bei Workloads mit einem hohen Maß an Saisonalität kannst du so Annahmen darüber treffen, wie die Zukunft aussehen wird. Nicht alle Workloads sind saisonabhängig - manche haben sogar überhaupt keine erkennbare Saisonalität.
Quantile
Quantile sind eine statistische Methode, um einen bestimmten Punkt in einem Datensatz zu beschreiben. Zum Beispiel ist das 50. Quantil der Mittelpunkt der Daten (auch bekannt als Median). Eines der gebräuchlichsten Quantile bei Operationen ist das Perzentil, mit dem ein Punkt im Datensatz in Form von Prozenten (von 0 bis 100) beschrieben wird.
Perzentile werden häufig bei der Abrechnung von gemessener Bandbreite und bei Latenzberichten verwendet, aber die Berechnung ist für beide gleich. Zunächst wird der Datensatz in aufsteigender Reihenfolge sortiert, dann werden die obersten n Prozent der Werte entfernt. Die nächstgrößere Zahl ist das n-te Perzentil.4 Zum Beispiel wird die Bandbreitenmessung oft auf Basis des 95sten Perzentils abgerechnet. Um diesen Wert zu berechnen, würden wir die obersten 5 % der Werte weglassen. Wir tun dies, weil bei der Bandbreitenmessung erwartet wird, dass die Nutzung sprunghaft ist, so dass es fairer ist, die Bandbreite auf der Basis des 95sten Perzentils zu bezahlen. Die Verwendung von Perzentilen für die Latenz gibt dir eine gute Vorstellung davon, wie die Mehrheit der Nutzerinnen und Nutzer tickt, und lässt die Ausreißer außer Acht.
Du kannst keinen Durchschnitt bilden
Es liegt in der Natur der Sache, dass bei der Berechnung eines Perzentils eine gewisse Menge an Daten wegfällt. Daher kannst du keinen Durchschnitt aus Perzentilen bilden, weil dir ein Teil der Daten fehlt - das Ergebnis ist dann ungenau. Mit anderen Worten: Wenn du ein tägliches 95. Perzentil berechnest und dann den Durchschnitt von sieben Perzentilen ermittelst, erhältst du keinen genauen wöchentlichen 95^Wert. Du musst das wöchentliche Perzentil auf der Grundlage der gesamten wöchentlichen Werte berechnen.
Wenn du die Perzentile verwendest, bekommst du zwar eine Vorstellung davon, was die meisten Werte sind (z. B. im Fall der Latenz, was die meisten Nutzer erleben), aber vergiss nicht, dass du eine ganze Reihe von Datenpunkten auslässt. Wenn du die Latenz anhand von Perzentilen beurteilst, kann es hilfreich sein, auch die maximale Latenz zu berechnen, um zu sehen, was das Worst-Case-Szenario für die Nutzer ist.
Standardabweichung
Die Standardabweichung ist eine Methode, um zu beschreiben, wie nah oder weit die Werte vom Mittelwert entfernt sind. Das hört sich zunächst toll an, aber es gibt einen Haken: Du kannst sie zwar für jeden Datensatz berechnen, aber nur ein normalverteilter Datensatz wird das erwartete Ergebnis liefern. Wenn du die Standardabweichung für einen Datensatz verwendest, der nicht normal verteilt ist, kann das zu unerwarteten Ergebnissen führen.
Das Praktische an der Standardabweichung ist, dass die Menge der Daten innerhalb bestimmter Abweichungen vorhersehbar ist. Wie du in Abbildung 4-4 sehen kannst, liegen 68% der Daten innerhalb einer Standardabweichung des Mittelwerts, 95% innerhalb von zwei Standardabweichungen und 99,7% innerhalb von drei Standardabweichungen. Beachte, dass dies nur für normalverteilte Datensätze gilt.
Ich erwähne die Standardabweichung nur, weil es eine schlechte Nachricht gibt: Die meisten Daten, mit denen du arbeiten wirst, passen nicht in ein Modell, bei dem die Standardabweichung gut funktioniert. Es ist besser, wenn du die Standardabweichung gleich überspringst, als Zeit damit zu verschwenden, dich zu fragen, warum die Ergebnisse der Berechnung nicht so sind, wie du erwartet hast.
Nachbereitung
Dieser Abschnitt hat nur an der Oberfläche gekratzt, wenn es um die Welt der Statistik geht, aber ich habe versucht, mich auf die gebräuchlichsten und wirkungsvollsten Ansätze für die betriebliche und technische Arbeit zu konzentrieren. Um es kurz zu machen:
-
Der Durchschnitt ist die gebräuchlichste und nützlichste Funktion, die du verwenden wirst, da sie auf viele verschiedene Datensätze anwendbar ist. Auch der Median ist für einige Datensätze sehr nützlich.
-
Saisonalität ist nur eine schicke Art, über zeitliche Muster in Daten zu sprechen. Ich wette, du wirst eine Saisonalität in deinen Daten erkennen.
-
Perzentile sind hilfreich, um zu verstehen, wie der Großteil deiner Daten aussieht, aber sei vorsichtig: Sie ignorieren naturgemäß die extremen Datenpunkte.
-
Die Standardabweichung ist ein nützliches Instrument, aber nicht so sehr für die Art von Daten, mit denen du zu tun hast.
Ich gebe dir ein paar Fragen mit auf den Weg, die du beim Nachdenken über deine Daten berücksichtigen solltest.
-
Gibt es eine starke Verzerrung in eine der beiden Richtungen? Das heißt, häufen sich die Datenpunkte an einem der beiden Enden des Diagramms?
-
Sind extreme Ausreißer üblich?
-
Gibt es Ober- und Untergrenzen für Datenpunkte? Zum Beispiel können Latenzmessungen theoretisch in positiver Richtung praktisch unendlich sein (am unteren Ende durch Null begrenzt), während die prozentuale CPU-Auslastung an beiden Enden begrenzt ist (0 % und 100 %).
Wenn du diese Fragen an deine Daten stellst, wirst du verstehen, welche statistischen Ansätze gut funktionieren und welche nicht.
Damit sind wir am Ende von Teil I der praktischen Überwachung angelangt! In Teil II gehen wir der Frage auf den Grund: "Was sollte ich überwachen? Wie mache ich es?"
1 Ich will nicht auf Nagios herumhacken - es ist nur so, dass Nagios dank seines Einflusses die erwarteten Standards für viele Tools gesetzt hat. Es gibt viele andere Tools, die genauso schuldig sind.
2 Das Laden von mehreren tausend Datenpunkten von der Festplatte, um ein Diagramm anzuzeigen, dauert sehr lange, und wahrscheinlich ist dir die Granularität egal, wenn du die Daten von vier Wochen ansiehst.
3 Deine TSDB verbirgt die zugrundeliegende Berechnung vor dir, aber vertrau mir, das ist es, was sie tut.
4 Dies ist eine grobe Definition, die einige Feinheiten der zugrundeliegenden Mathematik vernachlässigt. Eine gründlichere Behandlung von Perzentilen findest du in "Statistics For Engineers" (Heinrich Hartmann, ACM Vol 59, Nr. 7).
Get Praktische Überwachung now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.