Performance Optimierung
Performance Optimierung ist keine Hexerei. Performance Optimierung kann für Programme und Betriebs-Systeme, für Computer(-Komponenten) und Netzwerke, angewendet werden. Bei all diesen Systemen ist eine systematisch deduktive Arbeitsweise nötig - anders ausgedrückt: Detektiv-Arbeit. Das Problem bei der Performance-Optimierung ist dabei nicht die Schwachstelle zu finden, die das System behindert. Das Problem ist in der Regel die Beseitigung der Schwachstelle.
Performance Analyse ist umfassend. Zunächst muss das Gesamtsystems und seine Arbeitsweise begriffen werden. Danach erfolgt die Analyse der einzelnen das System bildenden Komponenten.
Die Komponenten sind bei Software einzelne
- Programmteile
- Algorithmen
- Datenstrukturen
bei Computersystemen die Systemkomponenten und bei Netzwerken die
- Netzwerk-Komponenten (Switche, Router)
- Server(-Komponenten), wie Netzwerk-Karten, RAM
- Software Komponenten wie Betriebs-System, Firewalls, Applikation-Server, Datenbanken, Remote-Dateisysteme, etc.
Analyse bedeutet hierbei das Nachvollziehen des Aufbaus, der Konfiguration, der Arbeitsweise und der Funktion. Oftmals kann schon das Analysieren von Log-Files Hinweise auf Engpässe bieten. Finden sich in der Analyse-Phase schon Konfigurations-Fehler oder falsch ausgelegte Komponenten so ist das Performance-Problem evtl. sehr schnell behoben.
Performance Messung ist individuell. Nach der Analyse werden gezielt Messungen an den Komponenten gemacht, welche der Erfahrung nach mit höchster Wahrscheinlich das Performance-Problem verursachen. Für einige Komponenten (gerade bei Software) gibt es keine fertigen Messverfahren. Für das Wechselspiel von Komponenten gibt es so gut wie gar keine fertigen Meß-Werkzeuge. Eine der Hauptaufgaben der Performance-Messung ist also das Schaffen von geeigneten Werkzeugen, um die Performance überhaupt in Maß-Zahlen ausdrücken zu können. Die meisten Performance-Probleme sind abhängig von der Art und Menge der Eingangsdaten. Eine weitere Kern-Tätigkeit der Performance-Messung ist daher das Bereitstellen einer definierten Meß-Umgebung. Die Messung der Performance eines Systems bei kontrolliert gesteigerter System-Last liefert ein Last-Diagram, welches erste Hinweise auf die Komponente liefern kann, welcher den Engpass darstellt.
Performance-Messung an Software. Zur Messung von Software-Performance können oftmals Laufzeit- oder Speicher-Profiler genutzt werden. Diese liefern aber auf das Gesamt-Programm losgelassen meist schwer bis gar nicht zu interpretierende Ergebnisse. Zum Unterstützen der Profiler ist es daher unerlässlich den bestehenden Code in einzelne Segmente zu zerlegen, welche mit jeweils kontrollierten Eingangsdaten versehen werden können. Diese Segmente werden dann unabhängig voneinander mit Profilern getestet. Ist der Code modular und mit definierten Schnittstellen versehen gelingt dies recht einfach. Ein monolithischer Code wird hingegen erst in Module zerlegt werden müssen, bevor eine Performance-Messung überhaupt Sinn ergibt. Oftmals können die Profiler aber den Engpass gar nicht sehen. Fordert ein Interpreter z.b. über eine externe C-Bibliothek Speicher an, so wird dieser vom Profiler des Interpreters nicht gesehen. Daher ist oft nötig den Speicherbrauch einer Software mit zusätzlichem Meß-Code zu ermitteln und zu protokollieren. Je nach Code-Qualität kann das ein einfaches oder extrem aufwendiges Unterfangen sein. Selbst wenn die Profiler oder der Meß-Code dann ein Programmmodul als den Engpass identifizieren ist oftmals noch nicht klar, warum der Engpass auftritt. Liegt es am angewendeten Algorithmus, der Datenstruktur, einem Programmierfehler oder evtl. sogar an der Hardware?
Performance-Messung an Hardware. Die Betriebssysteme bieten eine Reihe von Mess-Fühlern welche zur Performance-Messung eingesetzt werden können. Oftmals ist es aber nötig Software zu schreiben um diese Fühler auszulesen, oder die Hardware gezielt während der Messung zu belasten. Ähnliches gilt für die Messung in Netzwerken. Die Netzwerk-Komponenten können z.B. über SNMP ausgelesen werden und somit Performance-Logs erzeugt werden. Trotzdem ist es gerade bei Netzwerk-Problemen nötig gezielt Lasten zu erzeugen, um die Netzwerk-Komponenten unter definiertem Stress zu testen. Dies ist um so diffiziler, wenn das Netzwerk sich im Produktions-Betrieb befindet. Auch ist das zeit-synchrone Zusammenführen der Performance-Daten von vielen Netzwerk-Komponenten oftmals nicht mit Standard-Werkzeugen möglich und eine eigens zu diesem Zweck programmierte Software bleibt die einzige Lösung. Ähnlich wie bei der Performance-Messung an Software sagt das Ergebnis der Messung in der Regel noch nichts darüber aus warum eine Komponente eines Servers oder eines Netzwerks nicht die gewünschte Performance liefert. In den einfachsten Fällen ist eine falsche Auslegung der Komponente die Ursache und kann durch den Austausch mit einer höherwertigen Komponente einfach beseitigt werden. Oftmals sind aber Wechsel-Wirkungen zweier oder mehr Komponenten das Problem und sehr oft ist die Software/das Betriebs-System eine davon. Bei solchen Wechsel-Wirkungen stellt sich die Frage welche Komponente die Ursache ist
Performance-Optimierung hat Folgen. In der Regel sind Performance-Probleme nur das Symptom tiefer liegender Ursachen. Wenn die Hardware versagt ist oftmals nicht die Hardware schuld, sondern die Software, welche die Hardware übermäßig belastet. Diese Überlast wird oftmals durch ungeschickte oder sorglose Programmierung erzeugt, welche entweder einfach zu viele Ressourcen verbraucht oder vergisst temporär genutzte Ressourcen wieder frei zu geben. Die wenigsten Programmierer denken beim Erstellen einer ersten Software-Release daran ein dynamisches Speicher-Management und ein Pooling für IO-Resourcen einzubauen. Wenn die Performance dann nach einiger Zeit nicht mehr ausreicht müssen solche Querschnitts-Funktionen nachträglich eingebaut werden. Je nach Qualität der Software kann das einfach bis unbezahlbar sein. Für Hardware-Systeme gilt ähnliches. Lassen sich die Performance-Probleme nicht Software-seitig lösen, so muss über eine stärkere Auslegung der Hardware nachgedacht werden. Manche Probleme sind parallelisierbar und können auf viele Rechner verteilt werden. Aber jede Skalierung der Leistung über die Anzahl der Rechner hat einen Preis, der über die schieren Kosten für die Hardware hinausgeht: Die erhöhte Komplexität und der Aufbau einer zusätzliche Netzwerk-Ebene für den schnellen Datenaustausch der Rechner untereinander erhöhen die Kosten zusätzlich.
Performance-Optimierung funktioniert. Wenn mit realistischen Erwartungen an eine Performance-Optimierung gegangen wird und der Wille besteht die Probleme und deren Ursachen zu beseitigen, wird eine Performance-Optimierung gelingen und in der Regel massive Verbesserung bringen. Wir hatten schon Fälle in denen die komplette Software neu geschrieben werden musste, der Kunde aber am Ende extrem glücklich mit der neuen Lösung war. Hätte er an seiner ursprünglichen Lösung festgehalten wäre sein Projekt zwangsläufig gescheitert.