% !TeX root = ../../thesis.tex \chapter{Performance-Untersuchung} \label{ch:performance-checking} \section{Auswertung des Systems} \label{sec:performance-checking:system} \mytodos{Hier die Auswertung des Produktionsservers unterbringen} \section{Statistiken im PostgreSQL auswerten} \label{sec:performance-checking:postgresql-statistics} \mytodos{Logs auswerten, am besten vom Produktionsserver. Ebenfalls sollte man die Webseite prüfen, die den Cache von OpenJPE auswerten} \section{Überprüfung des PostgreSQL und Servers} \label{sec:performance-checking:postgresql-checking} Die einfachste Art die Einstellungen zu prüfen ist, die Abfrage in \ref{lst:postgresql-select-settings} am Datenbankserver auszuführen. \begin{lstlisting}[language=SQL,caption={Ermitteln der PostgreSQL Einstellungen},label=lst:postgresql-select-settings] SELECT name AS setting_name , setting AS setting_value , unit AS setting_unit FROM pg_settings WHERE name IN ( 'shared_buffers' , 'temp_buffers' , 'work_mem' , 'max_connections' , 'maintenance_work_mem' ) \end{lstlisting} \mytodos{Konfiguration vom Produktionsserver prüfen} \section{Einbau und Aktivieren von Performance-Messung} \label{sec:performance-checking:performance-measure} Um eine Messung der Performance in der Webseite durchführen zu können, gibt es in \ac{JSF} die Möglichkeit, über eine eigene Implementierung der Klasse \textbf{ViewDeclarationLanguageWrapper} sich in das generieren der Webseite einzuhängen. Hierbei können die Funktionen für das Erstellen, des Bauen und das Rendern der Webseite überschrieben werden. In den überschriebenen Funktionen werden nun Laufzeiten gemessen und die ermittelten Zeiten mit einer Kennung in die Log"=Datei eingetragen. Durch die Kennung, können die Zeiten im Nachgang über ein Script ermittelt und ausgewertet werden. Zusätzlich wird noch eine Implementierung der zugehörigen Factory"=Klasse \textbf{ViewDeclarationLanguageFactory} benötigt. Durch diese Factory"=Klasse wird der eigentlichen Wrapper mit der Performance-Messung in die Bearbeitungsschicht eingehängt. Diese Implementierung wird dann noch in der \textbf{faces-config.xml} eingetragen, wie das in \ref{lst:activate-factory} gezeigt wird, damit die Factory durch das System aufgerufen wird. \begin{lstlisting}[language=xml,caption={Einbindung Factory},label=lst:activate-factory] de.wedekind.utils.VdlLoggerFactory \end{lstlisting} Der Quellcode der Klassen ist im Anhang \ref{ap:jsf_performance_measure} zu finden. Um die Abfragen im \textit{PostgreSQL} untersuchen zu können, ist es am leichtesten, wenn man die Konfiguration so anpasst, dass alle Abfragen mit entsprechenden Zeitmessungen in die Log"=Datei des ausgegeben werden. Zuerst werden über die Einstellungen unter \ref{lst:postgresql_logfile} die Datei und das Format definiert. \begin{lstlisting}[language=yaml,caption={PostgreSQL Dateikonfiguration},label=lst:postgresql_logfile] log_destination = 'jsonlog' logging_collector = on log_directory = 'log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_file_mode = 0640 log_rotation_size = 100MB \end{lstlisting} Über die Konfiguration unter \ref{lst:postgresql_logconf} wird definiert welche Werte mit protokolliert werden. Die wichtigste Einstellung ist \textit{log\_min\_duration\_statement}, diese definiert ab welcher Laufzeit eine Abfrage protokolliert werden soll. Mit dem Wert 0 werden alle Abfragen protokolliert. Alle weitere Einstellungen sind so gesetzt, dass nicht unnötige Abfragen für die spätere Auswertung mit \textit{pgBadger} protokolliert werden. Zusätzlich ist die Einstellung \textit{log\_temp\_files} auf 0 zu setzen. Dadurch werden alle erzeugten temporären Dateien und ihre Größe ebenfalls protokolliert. Diese Dateien entstehen, wenn der temporäre Puffer für die Abfrage nicht ausreicht und die Zwischenergebnisse ausgelagert werden müssen. \begin{lstlisting}[language=yaml,caption={PostgreSQL Ausgabekonfiguration},label=lst:postgresql_logconf] log_min_duration_statement = 0 log_autovacuum_min_duration = 10 log_checkpoints = off log_connections = on log_disconnections = on log_disconnections = on log_duration = off log_error_verbosity = default log_hostname = on log_lock_waits = on log_statement = 'none' log_temp_files = 0 log_timezone = 'Europe/Berlin' \end{lstlisting}