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-07-07 22:57:05 +02:00
|
|
|
Das folgende Kapitel enthält die im Rahmen dieser Arbeit entstandenen Konzepte, um die vorhanden Probleme zu
|
|
|
|
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-03-27 19:23:22 +01:00
|
|
|
Für die Untersuchung des Systems wird der direkte Zugang zum Server benötigt. Hierbei werden zuerst die im Kapitel
|
|
|
|
\ref{sec:basics:services} beschriebenen Einstellungen überprüft.
|
|
|
|
|
2024-03-31 22:25:29 +02:00
|
|
|
Zuerst wird am PostgreSQL"=Server die Konfiguration der Speicher mit der Vorgabe für Produktivsystem abgeglichen.
|
2024-03-27 19:23:22 +01:00
|
|
|
Hierunter fallen die Einstellungen für die \textit{shared\_buffers}, der bei einem Arbeitsspeicher von mehr als 1 GB
|
|
|
|
ca. 25\% des Arbeitsspeicher definiert sein soll \cite{PostgresC20.4:2024}.
|
|
|
|
|
|
|
|
\mytodos{die anderen Speicher abarbeiten?}
|
|
|
|
|
2024-03-29 11:36:34 +01:00
|
|
|
Dann wird mit dem Systemtools, wie den Konsolenanwendungen \textit{htop} und \textit{free}, die Auslastung des Servers
|
2024-03-27 19:23:22 +01:00
|
|
|
überprüft. Hierbei ist die CPU-Leistung, der aktuell genutzte Arbeitsspeicher, sowie die Zugriffe auf die Festplatte
|
2024-03-29 11:36:34 +01:00
|
|
|
die wichtigen Faktoren zur Bewertung.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
|
|
|
Die CPU-Leistung sollte im Schnitt nicht die 70\% überschreiten, für kurze Spitzen wäre dies zulässig. Da sonst der
|
|
|
|
Server an seiner Leistungsgrenze arbeitet und dadurch es nicht mehr schafft die gestellten Anfragen schnell genug
|
|
|
|
abzuarbeiten.
|
|
|
|
|
|
|
|
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-04-02 22:10:08 +02:00
|
|
|
wodurch der aktuell nicht verwendete in die Page-Datei ausgelagert wird. Hierdurch erhöhen sich die Zugriffszeiten auf
|
|
|
|
diese Elemente drastisch.
|
2024-03-27 19:23:22 +01:00
|
|
|
|
|
|
|
Die Zugriffsgeschwindigkeit, die Zugriffszeit sowie die Warteschlange an der Festplatte zeigt deren Belastungsgrenze auf.
|
|
|
|
Hierbei 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
|
|
|
|
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-06-02 15:43:11 +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
|
|
|
|
Information kann der Bediener die Liste auf"= oder absteigend sortieren lassen. Zusätzlich wird die Liste immer nach
|
|
|
|
dem Schreibdatum sortiert, um die Ergebnisse bei gleichen Werten der zu sortierenden Informationen, wie dem Schreibort,
|
|
|
|
immer in einer chronologisch aufsteigenden Form zu darzustellen.
|
|
|
|
|
|
|
|
Aktuell verwenden die Editoren die Dokumentenliste um die Briefe eines Adressaten zu filtern und diese in
|
2024-07-07 22:57:05 +02:00
|
|
|
chronologische Reihenfolge aufzulisten und zu untersuchen wie Kommunikation zwischen Herrn Wedekind und dem Adressaten
|
2024-06-02 15:43:11 +02:00
|
|
|
abgelaufen ist. Ebenso wird nach Standorten sortiert, um zu prüfen mit welchen Personen sich an den ...
|
|
|
|
|
2024-07-07 22:57:05 +02:00
|
|
|
\mytodos{Hier noch mehr Infos dazu, für was genau die Editoren diese tun}
|
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
|
|
|
|
notwendig. Dies wird durch die generische Abfrage in \autoref{lst:documentlist} gezeigt. Zusätzlich wird für jedes
|
|
|
|
dargestellte Dokument eine zusätzliche Abfrage durchgeführt, die in \autoref{lst:documentlist_sub} zeigt, dass auch hier
|
|
|
|
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}
|
|
|
|
|
|
|
|
Nach aktuellem Stand beinhaltet die Datenbank ca. 5400 Briefe, für die jeweils 2-7 eingescannte Faksimile gespeichert
|
|
|
|
werden. Diese Graphik-Dateien werden im TIFF-Format abgespeichert und benötigen zwischen 1 und 80 MB Speicherplatz.
|
|
|
|
Dadurch kommt die Datenbank aktuell auf ca. 3,8 GB.
|
|
|
|
|
|
|
|
\mytodos{Die unteren Punkte nochmal untergliedern in Performance-messen und Statistiken prüfen, dann kann mit den
|
|
|
|
Performance-messen die unterschiedlichen Aktionen durchgeführt werden in Kapitel 4}
|
|
|
|
|
2024-04-18 00:51:19 +02:00
|
|
|
Wie im Kapitel \ref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die
|
2024-06-02 15:43:11 +02:00
|
|
|
PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher gehen wir nun weiter nach oben in den Schichten
|
|
|
|
vom Glassfish"=Server.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
|
|
|
Die OpenJPA Cache Schicht wird nun einzeln untersucht. Hierfür werden die zuerst die Cache"=Statistik für Object"=Cache
|
|
|
|
und Query"=Cache aktiviert \citep[315]{MüllerWehr2012}. Die somit erfassten Werte, werden über eine Webseite
|
|
|
|
bereitgestellt, um die Daten Live vom Server verfolgen zu können. Zusätzlich können diese Daten über ein Skript
|
|
|
|
zyklisch abgefragt, gespeichert und vergleichen werden.
|
|
|
|
|
|
|
|
In der \ac{JPA} Schicht sind die Anzahl der Entitäten im Persistence Context zu beobachten. Die Anzahl der verschiedenen
|
|
|
|
Klassen soll ermittelt und die Statistik"=Webseite um diese Daten erweitern. Um die Daten zu ermitteln, kann der
|
|
|
|
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}
|
|
|
|
|
|
|
|
% \mytodos{\url{https://eclipse.dev/eclipselink/api/2.1/org/eclipse/persistence/jpa/JpaCache.html#getObject(java.lang.Class,%20java.lang.Object)}}
|
|
|
|
|
|
|
|
Die Schicht \ac{EJB} besitzt keine Möglichkeit um eine sinnvolle Messung durchzuführen, daher wird hierfür keine
|
2024-06-02 15:43:11 +02:00
|
|
|
direkte Messungen eingefügt.
|
2024-04-18 00:51:19 +02:00
|
|
|
|
2024-06-02 15:43:11 +02:00
|
|
|
Bei den \ac{JSF} wird eine Zeitmessung eingefügt. Hierfür müssen die Seiten so erweitert werden, dass zum einen die
|
2024-04-18 00:51:19 +02:00
|
|
|
Zeit gemessen wird um die Daten zu ermitteln. Zum anderen wird die Zeit gemessen wie lange es dann noch dauert um die
|
|
|
|
Seite mit den Daten zu rendern um diese an den Client auszuliefern. Diese 2 Zeiten sollen dann im Footer direkt auf der
|
|
|
|
Seite mit dargestellt werden. Somit kann der Benutzer auch direkt sehen, wenn das laden länger gedauert hat, an welcher
|
|
|
|
Stelle die Verzögerung aufgetreten ist.
|
|
|
|
|
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
|
|
|
|
SQL"=Anfragen umgestellt und die Ausführungszeiten überprüft. Ebenfalls werden die Abfragen durch Criteria API erzeugt
|
|
|
|
und dessen Ausführungszeit ermittelt.
|
|
|
|
|
|
|
|
% https://www.tutorialspoint.com/jpa/jpa_jpql.htm
|
|
|
|
|
|
|
|
Zusätzlich werden im SQL-Server Optimierungen vorgenommen, darunter zählen die materialized views, welche eine erweiterte
|
|
|
|
View sind. Neben der Abfrage der Daten beinhalteten diese auch noch nicht vorberechneten Daten der Abfrage, womit diese
|
|
|
|
viel schneller abgefragt werden können. Zusätzlich werden die cached queries überprüft ob diese eine Verbesserung der
|
|
|
|
Performance und der Abfragedauern verkürzen können.
|
|
|
|
|
|
|
|
Um die Optimierungen in der Anwendung zu überprüfen, werden die Webseiten über ein Shell-Skript abgefragt. Das Skript
|
|
|
|
ruft automatisiert die URLs der Webseite mehrfach ab. Die Dauer der Aufrufe der Webseiten werden gemessen und
|
2024-04-18 00:51:19 +02:00
|
|
|
statistisch ausgewertet. Für einen späteren Vergleich werden diese Informationen gesichert und mit einem erneuten Aufruf
|
|
|
|
nach den Optimierungen verglichen. Hierdurch kann auch festgestellt werden, ob die Optimierungen erfolgreich waren.
|
2024-06-02 15:43:11 +02:00
|
|
|
Um die Netzwerklatenz ignorieren zu können, wird das Skript auf dem gleichen Computer aufgerufen, auf dem die Webseite
|
|
|
|
gestartet wurde.
|
2024-01-27 13:37:35 +01:00
|
|
|
|
2024-07-07 22:57:05 +02:00
|
|
|
Das zugehörige Script ist im Anhang \ref{ap:timing} angehängt.
|