2024-07-31 22:12:53 +02:00
|
|
|
% !TeX root = ../../thesis.tex
|
2024-01-27 13:37:35 +01:00
|
|
|
|
|
|
|
\chapter{Konzept}
|
|
|
|
\label{ch:concept}
|
|
|
|
|
2024-09-28 16:16:31 +02:00
|
|
|
Das folgende Kapitel enthält die im Rahmen dieser Arbeit entstandenen Konzepte, um die vorhandenen Probleme zu
|
2024-07-07 22:57:05 +02:00
|
|
|
identifizieren und mit entsprechenden Maßnahmen entgegenzusteuern. Hierbei werden zum einen die Konfigurationen
|
|
|
|
der eingesetzten Software überprüft. Zum anderen werden die verschiedenen Schichten der entwickelten Software
|
|
|
|
auf mögliche Optimierungen untersucht und bewertet.
|
2024-04-02 22:10:08 +02:00
|
|
|
|
2024-01-27 13:37:35 +01:00
|
|
|
\section{Allgemeine Betrachtung des Systems}
|
2024-03-26 22:18:55 +01:00
|
|
|
\label{sec:concept:viewsystem}
|
|
|
|
|
2024-09-26 23:43:15 +02:00
|
|
|
Für die Untersuchung des Systems wird der direkte Zugang zum Server benötigt. Hierbei werden zuerst die im
|
|
|
|
\autoref{sec:basics:services} beschriebenen Einstellungen überprüft.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
2024-09-12 23:02:22 +02:00
|
|
|
Zuerst wird am PostgreSQL"=Server die Konfiguration der Speicher mit der Vorgabe für Produktivsysteme abgeglichen.
|
2024-09-26 23:43:15 +02:00
|
|
|
Hierunter fallen die Einstellungen für die \texttt{shared\_buffers}, der bei einem Arbeitsspeicher von mehr als 1 GB
|
2024-09-28 16:16:31 +02:00
|
|
|
circa 25\% des Arbeitsspeichers besitzen sollte \cite{PostgresC20.4:2024}.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
2024-09-26 23:43:15 +02:00
|
|
|
Bei der Einstellung \texttt{temp\_buffers} geht es um den Zwischenspeicher für jede Verbindung, die bei der Verwendung
|
2024-09-27 20:58:59 +02:00
|
|
|
von temporären Tabellen verwendet wird. Dieser Wert sollte auf dem Standardwert von 8 MB belassen werden und lediglich
|
|
|
|
bei der Verwendung von großen temporären Tabellen verändert werden.
|
2024-09-12 23:02:22 +02:00
|
|
|
|
2024-09-26 23:43:15 +02:00
|
|
|
Der Speicher, der für eine Abfrage verwendet werden darf, wird über die Konfiguration \texttt{work\_mem} gesteuert.
|
2024-09-12 23:02:22 +02:00
|
|
|
Wenn der Speicher zu gering wird, werden die Zwischenergebnisse in temporäre Dateien ausgelagert. Der empfohlene Wert
|
2024-09-28 16:16:31 +02:00
|
|
|
berechnet sich aus \texttt{shared""\_buffers} dividiert durch \texttt{max\_connections} \citep{ConfigTo12:online}.
|
2024-09-26 23:43:15 +02:00
|
|
|
Sollte die Berechnung außerhalb der Grenzwerte von 1 MB und 256 MB liegen, ist der jeweilige Grenzwert zu verwenden.
|
2024-09-28 16:16:31 +02:00
|
|
|
Um zu ermitteln, ob die Konfiguration richtig ist, muss im PostgreSQL die Einstellung \texttt{log\_""temp\_""files} auf 0
|
2024-09-28 21:50:12 +02:00
|
|
|
gesetzt werden. Mit dieser wird ermittelt, ob temporäre Dateien verwendet werden sowie deren Größe. Bei vielen kleineren
|
2024-09-12 23:02:22 +02:00
|
|
|
Dateien sollte der Grenzwert erhöht werden. Bei wenigen großen Dateien ist es ist sinnvoll den Wert so zu belassen.
|
|
|
|
|
2024-09-26 23:43:15 +02:00
|
|
|
Für die Wartungsaufgaben wie VACUUM oder dem Erstellen von Indexen wird die Begrenzung über die Einstellung
|
|
|
|
\texttt{maintenance\_work\_mem} gesetzt. Dieser Wert sollte 5\% des verfügbaren Arbeitsspeicher entsprechen und größer
|
|
|
|
als \texttt{work\_mem} sein.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
2024-09-29 11:02:28 +02:00
|
|
|
Nachfolgend wird mit den Systemtools, wie den Konsolenanwendungen \textit{htop} und \textit{free}, die Auslastung des Servers
|
2024-09-12 23:02:22 +02:00
|
|
|
überprüft. Hierbei ist die CPU"=Leistung, der aktuell genutzte Arbeitsspeicher, sowie die Zugriffe auf die Festplatte
|
2024-09-29 11:02:28 +02:00
|
|
|
die wichtigsten Faktoren zur Bewertung.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
2024-09-28 13:33:24 +02:00
|
|
|
Die CPU"=Leistung sollte im Schnitt 70\% nicht überschreiten, für kurze Spitzen wäre dies zulässig, um die gestellten
|
|
|
|
Anfragen schnell genug abarbeiten zu können. Daher soll verhindert werden, dass der Server an seiner Leistungsgrenze
|
|
|
|
arbeitet.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
2024-09-12 23:02:22 +02:00
|
|
|
Da unter Linux der Arbeitsspeicher nicht mehr direkt freigegeben wird, ist hier die Page"=Datei der wichtigere Indikator.
|
2024-07-07 22:57:05 +02:00
|
|
|
Wenn dieses in Verwendung ist, dann benötigen die aktuell laufenden Programme mehr Arbeitsspeicher als vorhanden ist,
|
2024-09-27 20:58:59 +02:00
|
|
|
wodurch der aktuell nicht verwendete in die Page"=Datei ausgelagert wird. Zu beachten ist hierbei allerdings, dass sich
|
|
|
|
die Zugriffszeiten auf die Elemente drastisch erhöhen.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
|
|
|
Die Zugriffsgeschwindigkeit, die Zugriffszeit sowie die Warteschlange an der Festplatte zeigt deren Belastungsgrenze auf.
|
2024-09-26 23:43:15 +02:00
|
|
|
In diesem Fall kann es mehrere Faktoren geben. Zum einem führt das Paging des Arbeitsspeicher zu erhöhten Zugriffen.
|
|
|
|
Ein zu klein gewählter Cache oder gar zu wenig Arbeitsspeicher erhöhen die Zugriffe auf die Festplatte, da weniger
|
2024-03-27 19:23:22 +01:00
|
|
|
zwischengespeichert werden kann und daher diese Daten immer wieder direkt von der Festplatte geladen werden müssen.
|
|
|
|
|
2024-04-02 22:10:08 +02:00
|
|
|
\section{Untersuchung der Anwendung}
|
|
|
|
\label{sec:concept:softwarestructure}
|
|
|
|
|
2024-09-27 20:58:59 +02:00
|
|
|
Bei der Performance"=Untersuchung der Anwendung wird sich im ersten Schritt auf die Dokumentenliste beschränkt. Anhand
|
2024-07-07 22:57:05 +02:00
|
|
|
dieser können die Optimierungen getestet und überprüft werden. Im Nachgang können die daraus gewonnenen Kenntnisse auf
|
2024-06-02 15:43:11 +02:00
|
|
|
die anderen Abfragen übertragen werden.
|
|
|
|
|
|
|
|
Die Dokumentenliste zeigt direkte und indirekte Informationen zu einem Dokument an. Hierzu gehört die Kennung des
|
|
|
|
Dokumentes, das Schreibdatum, der Autor, der Adressat, der Schreibort und die Korrespondenzform. Nach jeder dieser
|
2024-09-10 00:46:35 +02:00
|
|
|
Informationen kann der Bediener die Liste auf"= oder absteigend sortieren lassen. Zusätzlich wird die Liste immer nach
|
2024-06-02 15:43:11 +02:00
|
|
|
dem Schreibdatum sortiert, um die Ergebnisse bei gleichen Werten der zu sortierenden Informationen, wie dem Schreibort,
|
2024-09-28 13:33:24 +02:00
|
|
|
immer in einer chronologisch aufsteigenden Form darzustellen.
|
2024-06-02 15:43:11 +02:00
|
|
|
|
2024-09-28 13:33:24 +02:00
|
|
|
Aktuell verwenden die Editoren die Dokumentenliste, um die Briefe eines Adressaten zu filtern und diese in
|
|
|
|
chronologische Reihenfolge aufzulisten und zu untersuchen, wie die Kommunikation zwischen Herrn Wedekind und dem Adressaten
|
2024-09-28 21:50:12 +02:00
|
|
|
abgelaufen ist. Ebenso wird nach Standorten sortiert, um zu ermitteln, welche Personen sich in einem Zeitraum am gleichen
|
2024-09-24 23:56:07 +02:00
|
|
|
Ort aufgehalten haben.
|
2024-06-02 15:43:11 +02:00
|
|
|
|
|
|
|
Da die Daten in der 3. Normalform in der Datenbank gespeichert werden, sind einige Relationen für die Abfragen
|
2024-09-26 23:43:15 +02:00
|
|
|
notwendig. Dies wird durch die generische Abfrage in \autoref{lst:documentlist} gezeigt. Zusätzlich wird für jedes
|
2024-09-27 20:58:59 +02:00
|
|
|
dargestellte Dokument eine zusätzliche Abfrage durchgeführt, wie in \autoref{lst:documentlist_sub} zeigt, dass auch hier
|
2024-06-02 15:43:11 +02:00
|
|
|
weitere Relationen notwendig sind.
|
|
|
|
|
|
|
|
\includecode[SQL]{chapters/thesis/chapter03_documentlist.sql}{lst:documentlist}{Generische Abfrage der Dokumentenliste}
|
|
|
|
\includecode[SQL]{chapters/thesis/chapter03_documentlist_sub.sql}{lst:documentlist_sub}{Sub-Abfrage pro Dokument}
|
|
|
|
|
2024-09-11 19:34:36 +02:00
|
|
|
Nach aktuellem Stand beinhaltet die Datenbank circa 5400 Briefe, für die jeweils zwei bis sieben eingescannte Faksimile
|
2024-09-28 21:50:12 +02:00
|
|
|
gespeichert werden. Diese Graphik"=Dateien werden im TIFF"=Format abgespeichert und benötigen zwischen 1 und 80 MB
|
2024-09-11 19:34:36 +02:00
|
|
|
Speicherplatz. Dadurch kommt die Datenbank aktuell auf circa 3,8 GB.
|
2024-06-02 15:43:11 +02:00
|
|
|
|
2024-09-27 20:58:59 +02:00
|
|
|
Wie in \autoref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die
|
|
|
|
PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher werden nun die weiteren Schichten des
|
2024-09-28 21:50:12 +02:00
|
|
|
GlassFish"=Servers in aufsteigender Reihenfolge betrachtet.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
2024-09-27 20:58:59 +02:00
|
|
|
Die OpenJPA Cache Schicht wird nun einzeln untersucht. Hierfür werden zuerst die Cache"=Statistik für Object"=Cache
|
2024-09-28 13:33:24 +02:00
|
|
|
und Query"=Cache aktiviert \citep[315]{MüllerWehr2012}. Die somit erfassten Werte werden über eine Webseite
|
2024-09-27 20:58:59 +02:00
|
|
|
bereitgestellt, um die Daten Live vom Server verfolgen zu können. Zusätzlich wird die Webseite über ein Script
|
2024-09-03 23:48:35 +02:00
|
|
|
aufgerufen und die Aufrufzeiten sowie andere externe Statistiken darüber erstellt und gespeichert.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
|
|
|
In der \ac{JPA} Schicht sind die Anzahl der Entitäten im Persistence Context zu beobachten. Die Anzahl der verschiedenen
|
2024-09-26 23:43:15 +02:00
|
|
|
Klassen soll ermittelt werden und die Statistik"=Webseite um diese Daten erweitern. Um die Daten zu ermitteln, kann der
|
2024-04-18 00:51:19 +02:00
|
|
|
Quellcode aus \ref{lst:persistence-context-statistics} verwendet werden.
|
|
|
|
|
|
|
|
\begin{lstlisting}[language=Java,caption={Persistence"=Kontext Statistik},label=lst:persistence-context-statistics]
|
|
|
|
EntityManagerFactory emf = Persistence.createEntityManagerFactory(...);
|
|
|
|
EntityManager em = emf.createEntityManager();
|
|
|
|
for(EntityType<?> entityType : em.getMetaModel().getEntities())
|
|
|
|
{
|
|
|
|
Class<?> managedClass = entityType.getBindableJavaType();
|
|
|
|
System.out.println("Managing type: " + managedClass.getCanonicalName());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Oder bei JPA 2.0
|
|
|
|
emf.getCache().print();
|
|
|
|
\end{lstlisting}
|
|
|
|
|
2024-09-28 13:33:24 +02:00
|
|
|
Die Schicht \ac{EJB} besitzt keine Möglichkeit, um eine sinnvolle Messung durchzuführen, daher wird hierfür keine
|
2024-09-03 23:48:35 +02:00
|
|
|
direkte Messungen eingefügt. Hier werden nur die externen Statistiken durch das Skript verwendet, um zu prüfen in
|
|
|
|
welchen Umfang die Umstellungen eine Veränderung im Verhalten der Webseite bewirken.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
2024-09-28 13:33:24 +02:00
|
|
|
Bei den \ac{JSF} wird eine Zeitmessung einfügt, wofür eine \textit{Factory} benötigt wird. Diese wird in den Pipeline
|
|
|
|
Prozess, der die Verarbeitung der Seiten steuert, eingebunden und erstellt die Klasse für die Messung.
|
|
|
|
In dieser werden die Zeiten zum Ermitteln der Daten, das Zusammensetzen und das Rendern
|
2024-09-28 16:16:31 +02:00
|
|
|
der Sicht ermittelt. Die Zeiten werden in die Log"=Datei des \textit{GlassFish}"=Servers hinterlegt und durch das
|
2024-09-27 20:58:59 +02:00
|
|
|
Skript ausgewertet. Somit ist es relativ leicht aufzuzeigen, an welcher Stelle die größte Verzögerung auftritt.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
2024-07-07 22:57:05 +02:00
|
|
|
Die Abfragen werden ebenfalls untersucht und mit verschiedenen Methoden optimiert. Hierfür werden zum einen auf native
|
2024-09-27 20:58:59 +02:00
|
|
|
SQL"=Anfragen umgestellt und die Ausführungszeiten überprüft. Zum anderen werden die Abfragen durch Criteria API erzeugt
|
2024-07-07 22:57:05 +02:00
|
|
|
und dessen Ausführungszeit ermittelt.
|
|
|
|
|
2024-09-28 21:50:12 +02:00
|
|
|
Zusätzlich werden im PostgreSQL"=Server Optimierungen vorgenommen, darunter zählen die \textit{Materialized View}, welche eine
|
|
|
|
erweiterte Sicht ist. Neben der Abfrage der Daten beinhalteten diese auch vorberechnete Daten der Abfrage, womit
|
2024-09-29 11:02:28 +02:00
|
|
|
diese viel schneller abgefragt werden können. Zusätzlich werden die \textit{Cached queries} überprüft, ob diese eine Verbesserung
|
|
|
|
der Performance ergeben und damit eine Reduzierung der Abfragedauern erreichen.
|
2024-07-07 22:57:05 +02:00
|
|
|
|
2024-09-28 21:50:12 +02:00
|
|
|
Damit die Messungen nachvollziehbar bleiben, werden die Testaufrufe durch ein Bash"=Script automatisiert gerufen.
|
2024-09-26 23:43:15 +02:00
|
|
|
Wichtig hierbei ist, dass die Webseite immer vollständig gerendert vom Server an den Client übertragen wird.
|
2024-09-28 13:33:24 +02:00
|
|
|
Somit kann die clientseitige Performance ignoriert werden, da alle Daten bereits direkt in diesem einem Aufruf bereitgestellt
|
|
|
|
werden. In dem Skript werden zum einen die Laufzeiten der Webanfragen ermittelt, zum anderen die kürzeste, die längste und die
|
2024-09-28 21:50:12 +02:00
|
|
|
durchschnittliche Laufzeit ermittelt. Auf Grund der Speicherprobleme wird auch die Speicherbenutzung des
|
2024-09-28 16:16:31 +02:00
|
|
|
\textit{GlassFish}"=Servers vor und nach den Aufrufen ermittelt. Zum Schluss werden noch die Log"=Dateien des
|
2024-09-03 23:48:35 +02:00
|
|
|
\textit{PostgreSQL}"=Servers über das Tool \textit{pgBadger} analysiert und als Bericht aufbereitet.
|
2024-01-27 13:37:35 +01:00
|
|
|
|
2024-09-03 23:48:35 +02:00
|
|
|
Um die Netzwerklatenz ignorieren zu können, wird das Skript auf dem gleichen Computer aufgerufen, auf dem der Webserver
|
2024-09-27 20:58:59 +02:00
|
|
|
gestartet wurde. Das zugehörige Script ist in \autoref{ap:timing} zu finden.
|