Kunkel Softwareentwicklungs GmbH

Eine gute Performance ist bei betriebswirtschaftlichen Systemen in der Regel keine Zauberei. Der Schlüssel zu einer akzeptablen oder nur zu einer besseren Performance ist der, sich einfach ein wenig darum zu kümmern. Betriebswirtschaftliche Anwendungen sind deshalb relativ einfach in den Griff zu bekommen, weil der Hauptanteil von betriebswirtschaftlichen Systemen Tausende von Aufträgen, Reklamationen und Dienstleistungen zu erledigen hat. Sofern diese nicht alle voneinander abhängig sind, sind diese leicht verteilbar. Natürlich stößt man auch bei betriebswirtschaftlichen Systemen irgendwann auf Situationen, die bei steigender Datenmenge immer mehr Zeit oder Systemressourcen benötigen, oder gar ein kombinatorisches Problem darstellen. Diese Situationen sind mitunter leider nicht leicht zu verbessern.

An dieser Stelle sammle ich interessante Informationen und Links zum Thema Performance. Diese Sammlung werde ich im Laufe der Zeit um weitere Einträge ergänzen und sicher mehrmals restrukturieren.

Kleines Einmaleins

1 * 1 = Kümmern

Eine hinreichend performante Software bekommt man genauso selten geschenkt, wie eine funktionierende Software.
  • Identifizieren von relevanten Anwendungsfällen oder Reklamationen. Ein Customer Behavior Model Graph (CBMG) ist an der Stelle ein nützliches Hilfsmittel.
  • Zu den Fällen die relevanten Systemkomponenten definieren.
  • Zeiten, Aufrufhäufigkeiten und Auslastung der beteiligten Komponenten inklusive diverser Pools und Caches entlang des Flusses der Daten und Ereignisse feststellen.
  • Engpässe identifizieren.
  • Lösungsideen zur Beseitigung der Engpässe entwickeln.
  • Ggf. entdeckte Indikatoren als KPI zur betrieblichen Überwachung der Anwendungsperformance übernehmen.
  • Einen Bericht über die durchgeführten Verbesserungsmaßnahmen inklusive der skizzierten Situationen vor und nach den Verbesserungsmaßnahmen erstellen.
  • Wer bei seiner Software die Erfüllung gewisser Performanceziele genauso als Erfolgsfaktor sieht, wie die eigentliche Funktionalität, der berücksichtigt auch Aspekte der Performance während der Planung und Entwicklung.

2 * 1 = Arbeit für den Computer

Für die Abarbeitung einer Aufgabe durch einen Computer sind primär der Mikroprozessor zusammen mit dem Speicher und verschiedenen Input- und Outputsystemen beschäftigt. Ist eine Aufgabe zweimal abzuarbeiten oder ist sie sinngemäß doppelt so groß, dann muss beispielsweise der Mikroprozessor doppelt so viel arbeiten. Jeder Verarbeitungsschritt, jeder Aufruf der Datenbank und jeder Aufruf eines entfernten Systems bedeutet einfach Arbeit für den Computer, die sich summiert oder sogar multipliziert. Das gilt insbesondere auch für Arbeiten, die der Computer unnötigerweise erledigen soll. Unnötige Arbeiten sind beispielsweise unnötige Aufrufe der Datenbank oder unnötige Aufrufe von entfernten Systemen oder unnötig umfangreicher Datenabruf. Ja selbst das unnötige Erzeugen von Objekten stellt trotz mittlerweile deutlich verbesserter Speicherverwaltung immer noch unnötige Arbeit für einen Computer dar, die wohl abgewogen sein will.
Solange die Aufgabe nicht eine der Kategorie "praktisch nicht in endlicher Zeit berechenbar" ist, gibt es unterschiedliche Wege, die Situation zu verbessern:
  • Schnellerer Mikroprozessor, mehr Speicher
  • Zerlegen und verteilen der Arbeit auf mehrere Mikroprozessoren oder Systeme.
  • Alternativer, ggf. schlauerer Algorithmus bzw. Programm
  • Gleiche Sachen nicht immer neu berechnen, sondern zwischenspeichern und bei Bedarf darauf zurückgreifen: Cachen, Poolen, Memorization Pattern
  • Entfernen von Schichten. So schön Schichtentrennung architektonisch auch ist, kann sie verantwortlich für Performanceprobleme sein.
  • Für praktisch nicht in endlicher Zeit berechenbare Probleme gibt es zumeist alternative Verfahren und Heuristiken, die nicht die optimale, aber dennoch eine gute Lösung berechnen.

3 * 1 = Das schwächste Glied

Für die Verfügbarkeit und die Performance eines Gesamtsystems sind alle beteiligten Komponenten von Bedeutung. Irgendwie findet sich jede Komponente irgendwo in einer Verarbeitungskette wieder. Eine Beispielkette: CPU, Busse, IO-Schnittstelle, Festplatte, Plattencache, Magnetscheiben. Oder eine andere Beispielkette: Web-Browser des Anwenders, Javascript-Interpreter im Web-Browser, Netzwerk, Web-Server, Application-Server, Datenbank, Festplatten.
Wodurch zeichnet sich ein schwaches Glied aus? Seine Auslastung ist im Vergleich zu den anderen Komponenten signifikant höher, oder es benötigt von der Gesamtverarbeitungszeit einen signifikanten Anteil.
Wurde das schwächste Glied identifiziert und optimiert, dann ist damit zu rechnen, dass nun andere Glieder aufgrund der besseren Inanspruchnahme einen Engpass haben.

4 * 1 = Lastests

Lasttests sind ein wichtiges Mittel, zu konkreten Erkenntnissen bezüglich der Leistungsfähigkeit eines Systems oder eines konkreten Service zu kommen.
Anwendungsgebiete von Lasttests:
  • Leistungsüberprüfung oder Leistungsvalidierung, wenn formulierte Performanceanforderungen und ein Mengengerüst vorliegen.
  • Leistungsermittlung zur Skizzierung der maximalen Leistungsfähigkeit.
  • Erzeugen einer kontinuierlichen Last zur weiteren Analyse bei vorliegenden Performanceproblemen.

5 * 1 = Messwerte

Es gibt nur wenige Messwerte, die für Aussagen rund um die Leistungsfähigkeit herangezogen werden. Um zur Charakterisierung der aktuellen Leistung eines Systems oder Service zu kommen, werden über die Messungen statistische Kennzahlen wie Mittelwert, Streuung, uvam. gebildet. In der Regel ist es sinnvoll, gewisse Abhängigkeiten zu suchen und in Diagrammen darzustellen. Die typischen Messwerte zur einfachen Skizzierung der Leistungsfähigkeit eines Systems oder auch seiner Komponenten sind:
  • Durchsatz von Aufträgen oder Anfragen an ein System und dessen Komponenten (in Anzahl pro Sekunde).
  • Antwort- oder Verarbeitungszeit des Systems (in Sekunden).
  • Auslastung der beteiligten Komponenten (in Prozent).
  • Datenvolumen.

6 * 1 = Kein Diagramm ist gleichbedeutend mit: Es gibt keine nützliche Aussage

Sollte man nach einem Lasttest nicht in der Lage sein, ein oder mehrere Diagramme zu erstellen, die jeweils eine nachvollziehbare Aussage transportieren, dann stimmt irgendwas mit der Art und Weise mit der Durchführung des Lasttests oder seinen Messdaten nicht. Was nicht heißen muss, dass man keine wertvolle Hinweise für weiterführende Lasttests oder Analysen erhält.

7 * 1 = Auslastung der CPU

Die Serviceleistung einer CPU ist Rechenzeit zur Verfügung zu stellen. Bei der Auslastung der CPU geht es darum, wie viel Rechenzeit für eine Aufgabe benötigt wird.
Auf jedem Betriebssystem gibt es Möglichkeiten, die Auslastung der CPU über die Zeit hinweg zu beobachten. Die Auslastung wird in Prozent angegeben. Bei einer Auslastung von 30% über 15 Sekunden hinweg war die CPU 30%*15s = 5s mit Rechnen beschäftigt. Das heißt, dass die CPU 10 Sekunden lang nichts zu tun hatte.
Möchte man den Anteil der Rechenzeit einer bestimmten Funktionalität ermitteln, dann bildet man die Differenz der Auslastung mit der Funktionalität zu der Auslastung ohne die betreffende Funktionalität. Am leichtesten lässt sich Last in einer Schleife erzeugen.
windows-ressourcenmonitor1.png

9 * 1 = ...

10 * 1 = ...

1 * 2 = Verfügbarkeit

Mit Verfügbarkeit bezeichnet man das Verhältnis der Zeit (TUP), welche ein System verwendbar ist, zu der Gesamtzeit, in der das System verwendbar sein sollte; also inklusive der ungeplanten Ausfallzeiten (TUP+TDOWN).
Ein System setzt sich selbst wiederum aus mehreren Teil- oder Subsystemen zusammen. Wie die Teilsysteme im Gesamtsystem zusammenarbeiten, lässt sich in einer Kombination von Parallel- und Reihenschaltung darstellen. Beispiele für eine Reihenschaltung sind der Aufruf von entfernten Systemen über das Netzwerk und die Verkettung von Schichten, die sogar noch verteilt sein können. Ein Beispiel für eine Parallelschaltung ist ein Cluster von mehreren Systemen mit derselben Funktionalität.
Generell ist die Gesamtverfügbarkeit bei Reihenschaltung kleiner als das schlechteste Teilsystem. Bei der Parallelschaltung ist die Gesamtverfügbarkeit besser als das beste Teilsystem. Insbesondere sinkt zunächst automatisch die Verfügbarkeit in einer serviceorientierten Infrastruktur, bei der Serviceaufrufe über die Verkettung verschiedener Systeme realisiert sind, im Vergleich zu einer Anwendung, die nicht in Services zerlegt und verteilt wurde.

2 * 2 = Skalierbarkeit

...

Werkzeuge

Performance Monitoring Guide
Brendan Gregg erklärt in Videos die Benutzung der Analysetools: uptime, prstat, vmstat und mpstat.

Analyse der Speicher- und CPU-Auslastung mittels vmstat
Kurzbeschreibung in deutsch, welche Informationen vmstat liefert.

dynaTrace AJAX Edition
Ein Werkzeug für die Analyse, wo und für was im Web-Browser die Zeit verbraucht wird.

Yahoo Yslow
Ein Werkzeug für die Analyse, wo und für was im Web-Browser die Zeit verbraucht wird.

Google Page Speed
Ein Werkzeug für die Analyse, wo und für was im Web-Browser die Zeit verbraucht wird.

CSS Sprite Generator
Ein Werkzeug zum Erzeugen von CSS Sprites.

Java Modelling Tools (JMT)
Simulation von queuing network models zur Performanceeinschätzung, Kapazitätsplanung, Auslastungscharakterisierung und Modellierung von Computer- und Kommunikationssysteme.

inspectIT - Kostenfreie Performance Diagnose
Ein zurzeit noch kostenloses Werkzeug zum Instrumentieren einer JVM, um auf grobgranularer Ebene und minimaler Belastung der JVM über Messungen von Zeiten und Aufrufhäufigkeiten diverse interessante Informationen zu erhalten und auszuwerten.

AppDynamics Lite - Kostenfreie Performance Diagnose
Ein weiteres kostenloses Werkzeug zum Instrumentieren einer JVM, um auf grobgranularer Ebene und minimaler Belastung der JVM über Messungen von Zeiten und Aufrufhäufigkeiten diverse interessante Informationen zu erhalten und auszuwerten.

Google - jdbcdslog
Ein JDBC-Treiber, der vor den eigentlichen Treiber vorgeschaltet wird, um nützliche Informationen zu den darüber erfolgenden Datenbankabfragen aufzuzeichnen.

Google - log4jdbc
Noch ein JDBC-Treiber, der vor den eigentlichen Treiber vorgeschaltet wird, um nützliche Informationen zu den darüber erfolgenden Datenbankabfragen aufzuzeichnen.

Apache JMeter
JMeter ist eine Möglichkeit zur Erzeugung der nötigen Last für Performanceanalysen.

Tipps zur Bekämpfung von Performanceproblemen

Json Java parsers / generators microbenchmark
Wie bei jedem Benchmark, sind auch die Ergebnisse dieses Benchmarks an dem eigenen Einsatzszenario zu überprüfen.

Homepage von Steve Souders
Eine Fundgrube rund um das Thema Performance von Web-Anwendungen.

Blog von dynaTrace
Top 8 Performance Problems on Top 50 Retail Sites before Black Friday
Blog von dynaTrace zu Application Performance, Scalability und Architecture.

CSS Sprites
CSS Sprites zur Einsparung von HTTP-Requests beim Laden von Bildresourcen.

Vaadin - Optimizing Sluggish UI
Eine kleine Aufstellung im Wiki von Vaadin an Hinweisen zur Performance.

Use a better mechanism to parse config files
Wer die Zeit zum Parsen von XML mit JAXB verkürzen möchte, kann sich Anregungen bei JBoss holen.

JBoss AS 5 Performance Tuning
Verschiedene technische Zusammenhänge und Tuningmaßnahmen für den JBoss AS, die teilweise natürlich auch für andere Application-Server gelten.

Flush and Clear: O/R Mapping Pitfalls
Ein Vortrag von Carsten Mjartan auf dem JUGS Forum 2009 zu JPA Performance.

Tuning von Hibernate- und JPA-Anwendungen
Ein Vortrag von Michael Plöd auf dem JUGS Forum 2009 zu JPA Performance.

Folien zu JPA mit Hibernate
In meinem eigenen Foliensatz zur JPA gibt es mittlerweile auch Informationen bzgl. Performance inklususive Fallbeispiel.

Hibernate Fetching Plans and Fetching Strategies
Ein Vortrag von Serge E. Pagop bei JBUGM.

Optimierung von JPA-Anwendungen (Folien)
Optimierung von JPA-Anwendungen (Video)
Ein Vortrag von Dirk Weil bei der JAX 2011.

Optimizing JPA Performance: An EclipseLink, Hibernate, and OpenJPA Comparison
Ein kleiner Benchmark von Daniel Rubio verschiedener JPA-Implementierungen auf DZone.

JPA comparison: Hibernate, Toplink, OpenJPA, Eclipselink
Ein kleiner Benchmark von Santiago Rodriguez verschiedener JPA-Implementierungen mit anregender Diskussion auf TSS.

Theorie bis zum Abwinken

Analyzing Computer System Performance with Perl::PDQ
Neil J. Gunther erklärt die Anwendung von Queuing Models zur Performanceanalyse von Computersystemen. Als Toolunterstützung wird die Verwendung vom kostenlos erhältlichen PDQ (Pretty Damn Quick Queueing Model Package) gezeigt.

Performancemanagement für serviceorientierte Java-Anwendungen: Werkzeug- und Methodenunterstützung im Spannungsfeld von Entwicklung und Betrieb
Eine preiswerte, kompakte und in deutsch verfasste Übersicht von Christof Schmalenbach. Das Buch bietet einen Einblick in die theoretischen Grundlagen der quantitativen Methode, Simulationstechniken, verschiedene Werkzeuge im praktischen Einsatz und Fallstudien. Ein Teil des Buches beschäftigt sich mit der organisatorischen Relevanz des Themas Performancemanagement.
Eine kleine (inoffizielle) Errata zum Buch:
Gleichung (3.8) müsste Ri = N/Xo lauten.

The Home of Guerrilla Capacity Planning for Enterprise Datacenters and Websites
Website, auf der die Firma Performance Dynamics Company Informationen, Downloads und Dienstleistungen zum Thema anbietet.

Guerrilla Capacity Planning: A Tactical Approach to Planning for Highly Scalable Applications and Services
Neil J. Gunther erklärt die theoretischen Grundlagen zur Kapazitätsplanung von Computersystemen. Die Betrachtungen von Amdahl und Gustafson münden bei Gunther in einem allgemeinen Skalierbarkeitsmodell, auf das er im Laufe des Buches immer wieder zurückgreift. Neben den Grundlagen werden auch moderne Techniken wie Virtualisierung, P2P und GRIDs betrachtet.

Software Performance Testing Handbook - A Comprehensive Guide for Beginners
Hier ist der Titel des Buches von Ramya Ramalinga Moorthy auch gleich Programm ...

The Operational Analysis of Queueing Network Models
Peter J. Denning, Jeffrey P. Buzen, Computing Surveys, Vol. 10, No. 3, September 1978

Quantitative System Performance
Ein online bereitgestelltes Buch aus dem Jahr 1984, was schrittweise in das Thema Queueing Network Models einführt.

Performanceanalyse von SOAP- und REST- basierten Services in einer Linguistic Resources Umgebung
Eine Diplomarbeit von Sebastian Sander, die verschiedene performancerelevante Aspekte von REST und SOAP Web-Services untersucht.

Performance Analysis of Computer Systems
Ein Kurs von Mohammad Hosein Yarmand inklusive Übungsaufgaben zum Thema.


Stand: 15. Februar, 2012 Kontakt / Impressum Alexander Kunkel