Last- und Performancetest – Teil 3: Die Messkurven führen uns zu den Flaschenhälsen



Um ein positives Resultat zu zeigen, gibt der folgende Graph ein mögliches Bild für ein performantes System.

Ask a Question


Zugriffskontrolle, Transaktionsverarbeitung und Synchronisation mit einer Datenbank bereitgestellt werden. Durch den vorgeschriebenen Aufbau und die vereinheitlichte Interaktion wird eine Entkopplung der einzelnen Komponenten erreicht. Diese Aufgaben werden als Marshalling bzw.

Client-Objekt Ergebnis Aufruf s. Nach der EJB-Spezifikation 3. Durch den Container bereitgestellte Dienste, wie z. Unterschiede zwischen EJB 2. Ein EntityObjekt entspricht dabei einem Tupel in einer relationalen Datenbanktabelle.

Weitere Verbesserungen sollen mit dem Struts 2. Raible [Rai07] Tabelle 5. Hierbei werden die Eingaben des Benutzers auf der Clientseite in Ereignisse auf der Serverseite umgewandelt. Spring selber ist eine auf Java basierende Plattform zur Serverprogrammierung, die ebenso wie die Java EE-Plattform dazu dient, verteilte, mehrschichtige und komponentenbasierte Architekturen zu implementieren.

Logging, von der reinen Anwendungslogik isoliert werden. Durch die direkte Integration von COM und 5. Die Funktionen AddRef und Release in- bzw. Der dynamische Inhalt einer Webseite muss damit nicht mehr, wie z. Architekturvergleich von Java EE- und. NET Technologie finden sich u. Die Unterschiede innerhalb der einzelnen Schichten werden im Folgenden genauer beschrieben. Beide Frameworks bieten eine gute Integration von WebServices.

NET ist auch ein automatisches Mapping geplant. Die CLR kann theoretisch jede 5. Fazit Die wichtigsten Unterschiede zwischen beiden Frameworks liegen in der Plattformstrategie. Sowohl Java EE- als auch. Hierdurch werden auch heterogene Softwarekomponenten, in denen Java EE,. Im objektorientierten Kontext besteht ein Muster aus einem System von wenigen Klassen.

Muster sind in nahezu jeder gut strukturierten objektorientierten Architektur zu finden und besitzen vier grundlegende Elemente. Jedes Muster wird durch einen Mustername benannt. Der Problemabschnitt beschreibt, wann ein Muster anzuwenden ist, welches Problem adressiert wird und was sein Kontext ist. Erzeugungsmuster, Strukturmuster und Verhaltensmuster. Erzeugungsmuster betreffen die Erzeugung von Objekten. Die Unterscheidung der anderen beiden Kategorien ist nicht sehr trennscharf und ihre Beschreibungen sind recht generisch: Entwurfsmuster basieren auf den beiden Mechanismen Vererbung und Delegation, d.

Weitergabe einer Anfrage an ein per Assoziation angebundenes Nachbarobjekt. Es wird beschrieben, wann sie einsetzbar sind und welche Konsequenzen deren Einsatz hat. Unterschiedliche Look-and-Feel-Standards legen jeweils ein unterschiedliches Aussehen und Verhalten der Interaktionselemente einer Benutzungsschnittstelle Widgets fest.

Entwurfsmuster Abstrakte Fabrik am Beispiel. Eine abstrakte Fabrik verlagert folglich die Erzeugung von Objekten auf ihre konkreten Unterklassen. Ein Swing-Fenster sollte nur mit einem Swing-Scrollbar ausgestattet werden. Das Abstrakte-Fabrik-Muster hat die folgenden Vorteile. Um verschiedene Look-and-FeelObjekte zu erzeugen, sollten Klienten unterschiedliche konkrete Fabriken haben.

Als Nachteil von abstrakten Fabriken ist deren Erweiterbarkeit bzw. Dies liegt daran, dass die Schnittstelle der Fabrik die Menge von generierbaren Produkten festlegt. Problem ist, dass bei der Framework-Erstellung diese Klassen nicht bekannt sind und das Framework dennoch manchmal Objekte dieser Klassen erzeugen muss. Als Beispiel wird im Folgenden der Adapter bzw.

Im Allgemeinen passt ein Adapter die Schnittstelle des zu adaptierenden Objekts an eine andere Schnittstelle an und bietet so eine einheitliche Abstraktion von mehreren unterschiedlichen Schnittstellen. Entwurfsmuster Adapter am Beispiel. Jedes dieser grafischen Objekte kann editiert werden und einen passenden, rechteckigen Begrezungsrahmen ermitteln.

Nehmen wir an, dass eine vorhandene Klasse TextAnzeige bereits die Begrenzung eines Texts ermitteln kann und dass wir diese nutzen wollen. Ein Klassenadapter verwendet Mehrfachvererbung, um eine Schnittstelle an eine andere anzupassen vgl.

Ein Objektadapter verwendet Delegation vgl. Ein Klassenadapter passt die zu adaptierende Klasse an genau eine konkrete Zielklasse an.

Daraus ergibt sich der Nachteil, dass ein Klassenadapter nicht funktioniert, wenn wir eine Klasse und all ihre Unterklassen anpassen wollen. Zudem wird lediglich ein einzelnes Objekt verwendet. Im Gegensatz dazu erlaubt ein Objektadapter sowohl mit der anzupassenden Klasse selbst als auch mit allen ihren Unterklassen zusammenzuarbeiten.

In solchen Anwendungen vermeidet dieses Muster die Erstellung einer sehr komplexen Klassenhierarchie. Intern leitet die Fassadenklasse Aufrufe an die passenden Klassen des Subsystems weiter. Hierbei wird ein Befehl eine Operation als ein Objekt gekapselt.

Im einfachsten Fall ist dies eine abstrakte FuehreAus-Operation, welche von konkreten Unterklassen implementiert wird. Jeder MenueEintrag wird mit einer konkreten Unterklasse von Befehl konfiguriert. Welche konkrete Unterklasse sich hinter ihrem Befehlsobjekt verbirgt, ist einem Exemplar der Klasse MenueEintrag nicht bekannt. Das Befehlsmuster hat mehrere Vorteile. Weiterhin kann ein Befehlsobjekt wie jedes andere Objekt auch manipuliert und erweitert werden.

So lassen sich mehrere Befehlsobjekte zu einem komplexeren Makro-Befehl zusammensetzen. Als Reaktion darauf synchronisiert sich jedes Darstellungsobjekt mit dem Zustand des Datenobjekts mit Hilfe von Anfragen.

Eine eingehende Anfrage wird die entstandene Kette entlang geleitet, bis ein Objekt die Anfrage beantworten kann. Einige hiervon werden im Folgenden kurz skizziert: Dann wird die Automatisierung des Testens behandelt. Insbesondere darf in T nicht der Konstruktor von E verwendet werden.

Stattdessen sollte beispielsweise eine abstrakte Fabrik vgl. Im Normalbetrieb wird dann eine abstrakte Fabrik verwendet, die E-Objekte erzeugt. Im Falle von Java bedeutet dies, dass E nicht final sein darf. Extreme Programming, verlangen eine solche Automatisierung sogar vgl. Bei diesem Ansatz wird zu einer zu testenden Klasse eine Testklasse als Testtreiber erstelllt.

In diesen Testmethoden werden im Framework vordefinierte Methoden wie z. Entsprechend erlaubt die Methode tearDown, nach den Tests solche Ressourcen wieder frei zu geben. MyList implementiert eine lineare Liste und bietet neben einer Iteratorschnittstelle eine Methode insertFirst. Solche Tools erlauben auch das Testen von konventionellen, d. Beim Black-Box-Testen geht man von der Spezifikation aus, wie sie z. Java ist QuickCheck [Sou08]. Dieses Werkzeug erzeugt mit Hilfe eines Zufallsgenerators z.

Lediglich Fehler in Codeteilen, die nur mit einer sehr geringen Wahrscheinlichkeit durchlaufen werden, werden, sofern es solche gibt, teilweise nicht gefunden. In dem ersten, rot dargestellten Testfall wird der Wert 5 in einem 2-elementigen Array mit den Werten 17 und 42 gesucht; im anderen, blau dargestellten Testfall wird im gleichen Array der Wert 42 gesucht.

Die wesentliche Aufgabe einer Versionsverwaltung besteht darin, die unterschiedlichen Versionen der Dateien eines Projektes zu speichern. Beim Checkout werden dabei alle betroffenen Dateien gesperrt, was zur Folge hat, dass dieselbe Datei nur von einem Benutzer ausgecheckt und bearbeitet werden kann. Wie in Abbildung 8. Wichtige Anforderungen sind vgl. Hier nennt Balzert [Bal93, S. Nach Abgleich der allgemeinen und firmenspezifischen Anforderungen ergibt sich ein Kriterienkatalog, der die ideale, auf die Anforderungen der Firma zugeschnittene CASE-Umgebung beschreibt.

Selenium [ope08] und Watij [Wat08] das Testen von Webapplikationen. Middleware-Plattformen oder Integrationsarchitekturen z. Service Orientierte Architekturen gleichgesetzt. Diese kann zum Beispiel durch zueinander inkompatible Hardwareplattformen, Datenbankmanagementsysteme, Kommunikationsmechanismen oder Programmiersprachen entstehen.

Diese betreffen die Datenmodelle, welche der Speicherung von Informationen in einer Anwendung zugrunde liegen. Wenngleich im Kontext eines bestimmten Informationssystems implizit gelten kann, dass es sich bei einem Attribut mit dem Namen Preis stets um einen Bruttopreis handelt, so kann das Vorhandensein dieser impliziten Bedeutung Semantik in einem anderen Informationssystem nicht vorausgesetzt werden.

Bei einer prozessorientierten Betrachtung werden die Anforderungen an die Integration der betrieblichen Informationssysteminfrastruktur unmittelbar sichtbar. Um ein neues System in eine Infrastruktur mit n Systemen einzubinden, muss nur eine standardisierte Schnittstelle zum Hub geschaffen werden. Wie auch bei der Hub-and-Spokes-Topologie ist zur Integration eines Systems in eine Infrastruktur mit n bestehenden Systemen lediglich eine Schnittstelle erforderlich.

Eine Integration auf diesen Ebenen ist mit spezifischen Vor— und Nachteilen verbunden. Ein wesentlicher Vorteil dieser Methode liegt darin, dass keine Modifikationen der Datenstrukturen oder der Anwendungslogik der zu integrierenden Anwendun- 9. Dennoch ist eine Datenintegration keine triviale Angelegenheit. Eine direkte Vergleichbarkeit der Technologien ist nicht gegeben, da der Funktionsumfang sehr stark variiert. Soll hingegen die Anwendungslogik eines Systems genutzt werden, so ist eine Integration auf Funktionsebene der Datenintegration vorzuziehen.

Die integrierte Informationssysteminfrastruktur kann als System von mehr oder weniger lose miteinander gekoppelten Komponenten betrachtet werden. Dies erfordert eine flexible und skalierbare Integration der zugrunde liegenden Informationssysteme. Als Ordnungsrahmen dient dabei eine Unterscheidung nach komponentenorientierten, objektorientierten und dienstorientierten Integrationstechnologien vgl. Der Quellcode der Anwendung selbst wird dabei in der Regel nicht angepasst.

Die zentrale Aufgabe einer komponentenorientierten Middleware-Plattform besteht demnach darin, eine Verbindung zwischen einem Klienten und einem entfernten Objekt zu etablieren und die Interaktion zwischen diesen zu vermitteln. Diese sollen an dieser Stelle jedoch nicht weiter vertieft werden. Aus diesem Grund zeichnet sich asynchrone nachrichtenbasierte Kommunikation vor allem in einem verteilten heterogenen Umfeld aus, in welchem die zu integrierenden Anwendungen unterschiedlichen Verantwortlichkeiten unterstehen oder u ussen.

Ein Nachteil nachrichtenbasierter Kommunikation besteht darin, dass sie die Suche nach Fehlern erschwert. Eine Service Orientierte Architektur stellt ein Netzwerk von lose gekoppelten und miteinander interagierenden Diensten dar. Die Interaktionen zwischen einem Dienstanbieter und einem Konsumenten sind in Abbildung 9.

Eine Integration auf Datenebene verleitet dazu, in Ermangelung eines Zugriffs auf die Verarbeitungslogik einer Anwendung, diese in unterschiedlichen Systemen redundant zu implementieren. Mit dem Vorliegen der Modelle entstand dann die Idee, Teile eines objektorientierten Softwaresystems nicht von Hand zu erstellen, sondern automatisch aus den Modellen zu generieren.

Dies geschieht durch so genannte Stereotype, mit denen sich Modellelemente wie z. Klassen und Methoden genauer charakterisieren lassen. Der in diesem Beispiel generierte Java-Code kann wie in Abbildung Das hier verwendete Template ist in Abbildung In diesem Template werden einige Hilfsfunktionen wie z. Dann lassen sich die Transformationen wiederholt nutzen. Bei Einzelentwicklungen bringt dieser Ansatz wenig Vorteile. Exemplarisch wurde so ein Bibliotheksverwaltungssystem vollkommen automatisch aus UML-Modellen erzeugt.

Die Modell-getriebene Softwareentwicklung ist ein noch junger und in Entwicklung befindlicher Zweig der Softwareentwicklung. Extreme Programming Explained - Embrace Change. Addison Wesley, [Bal93] Balzert, Helmut: Wissenschaftsverlag, [Bal98] Balzert, Helmut: Version Control System Comparison. Spektrum Akademischer Verlag, [Col07] Collabnet.

Risk Management for Software Projects. Test Web Applications with HttpUnit. Refactoring - Oder wie Sie das Design vorhandener Software verbessern. Elemente wiederverwendbarer objektorientierter Software. Addison Wesley, [Hen06] Henning, Michi: Component Technologies 4 , Nr.

International Function Point User Group. Professional Java Development with the Spring Framework. Packt Publishing, [Jun02] Jungmayr, Stefan: Improving testability of object-oriented systems.

Addison Wesley, [Lin05] Link, Johannes: Testfallerzeugung mit einer symbolischen virtuellen Maschine und Constraint Solvern. GI Jahrestagung 2 Bd. Praxisbuch Objektorientierung — Von den Grundlagen zur Umsetzung.

Morgan Kaufmann, [Mic07a] Microsoft. A symbolic Java virtual machine for test case generation. Web Services for Remote Portlets Version 1. Verlag Hanser, [Oes05] Oestereich, Bernd: Oldenbourg, [Omo07] Omondo. Dies erfolgt an den Servern wie auch an den Clients. Metriken sind für uns Performancetester die Grundsubstanz für die Analyse des zu testenden Systems. Sie bilden oft die Entscheidungsgrundlage für weitere Messungen.

Wie die Messungen graphisch dargestellt werden, ist in den Diagrammen der nachfolgenden Abschnitte ersichtlich. Ein häufig anzutreffendes Phänomen zeigt das nachfolgende Bild. Geprüft wurde hier ein Geschäftsprozess mit vier Schritten. Im nachfolgenden Diagramm sind der Übersicht halber nur die erfolgreich durchgeführten Transaktionen dargestellt. Infolge eines Ausbaus der Infrastruktur Hinzunahme eines 2. Servers wurden in einer Vergleichsmessung die Anfragen auf 2 Servern verteilt.

Dadurch konnte in einer vorgegebenen Zeit mehr als die doppelte Menge an Transaktionen gestartet werden. Diese Steigerung ist im Diagramm unter dem Schritt 1 erkennbar. Beim Blick auf den 2. Schritt muss dann festgestellt werden, dass dieser sehr viel weniger erfolgreiche Transaktionen verzeichnet.

Der Trend setzt sich bei den Folgeschritten nicht mehr ganz so stark fort. Anzahl an erfolgreichen Transaktionen eines Workflows, aufgeschlüsselt auf die Teilschritte. Betrachtet man jedoch die Anzahl der erfolgreich abgeschlossenen Prozesse, dann stellt man fest, dass diese in beiden Situationen fast identisch hoch sind.

Die Aufstockung durch einen zweiten Server brachte keine nennenswerte Verbesserung. In Analysen wurde die Applikation selbst als Flaschenhals identifiziert. Die Applikationsinstanzen wurden verdoppelt und trotzdem erfolgte kein entsprechend höherer Durchsatz. Die Datenbank selbst hat sich gelangweilt.

So entstand ein Verarbeitungs-Stau innerhalb der Anwendung, der ab einer bestimmten Transaktionsrate nur noch zu Fehlern führte — Bad Gateway. Im nachfolgenden Beispiel beschreiben wir ein zu testendes System mit Lastverteilung. Dabei ist der Aufbau so konfiguriert, dass jeder Service doppelt vertreten ist und von den verfügbaren Lastverteilern die Arbeit zugeteilt bekommt.

Im Backend sollte der Lastverteiler die Anfragen gleichmässig round robbin verteilen. Wie das Resultat zeigt kann bei der Performance Messung eine einseitige Lastverteilung festgestellt werden. Eine hohe Belastung bei Server 1 blau und keine bis kaum Belastung bei Server 2 rot oder andersherum. Idealerweise würden beide Server ähnlich hoch bei der eingezeichneten Ideallinie liegen, wenn sie gleichmässig ausgelastet wären.

Nach einer unbestimmten Zeit erhält der 2. Server die komplette Last, die der 1. Server zuvor bewältigen musste. Der Grund für dieses Phänomen lag in der Konfiguration des Loadbalancers. Die Anforderungen besagten, dass der Loadbalancer jede Transaktion an einen der zwei Webserver verteilt. Stattdessen wird nach einer bestimmten Zeit die gesamte Kommunikation vom einen Server auf den anderen umgelenkt.

Wie im folgenden Bild zu sehen ist, zeigen sich Anwortzeiten von ungefähr ms. Dazwischen und zum Ende hin häufiger auftretend, erstrecken sich Spitzenwerte. Diese reichen in den Sekunden- oder sogar Minutenbereich hineinreichen. Das System wurde mit mehreren Szenarien getestet, welche verschiedene Services angesprochen haben.