\documentclass[aspectratio=169]{beamer}
\graphicspath{ {./gfx/} }
\input{beamer-config}
\usetheme{cleangreen}

\input{marco-galster-config}
\addbibresource{expose-ref.bib}

% ACHTUNG: Damit sich die Datei sauber im Visual Studio Code übersetzten lässt, muss in den Benutzer-Einstellungen
%   das Element "latex-workshop.latex.tools" aufgenommen werden und der erscheinende Eintrag für latexmk bei den
%   args am Anfang um den folgenden Eintrage erweitert werden:
%       "-shell-escape"

\title{\myTitle}
%\subtitle{}
\author[M. Galster]{\myName}
\footlinetext{\insertshortauthor \hspace{4em} Multi-Layer Optimization Strategies for Enhanced Performance in Digital Editions}
\institute{Universität~in~Hagen,~Deutschland}
\date{\myTime}

\begin{document}
\selectlanguage{ngerman}

% - Vergleich mit barchart nicht die Tabellen
% - Prozess zeigen was wo gemessen wird, also was genau wurde wo verändert. hier könnte man die Schichtdarstellung nutzen
%    und dort markieren, was genau verändert wurde

% -- SLIDE -- Title
\begin{frame}[plain]
\titlepage
\end{frame}

% -- SLIDE -- TOC
\begin{frame}[c]
    \frametitle{Übersicht}

    %left space
    \begin{addmargin*}{2.5em}
        %enhance line space
        \begin{spacing}{1}
            \parbox{\linewidth}{%
                \tableofcontents
            }
        \end{spacing}
    \end{addmargin*}

    \addtocounter{framenumber}{-1}

\end{frame}
\def\showHorizontalNavBar{True}

% -- SLIDES --
\section{Übersicht}
\begin{frame}[c]
    \frametitle{Problemstellung}
    \begin{columns}
        \column{.5\textwidth}
        \centering
        \includegraphics[width=0.9\textwidth]{Webseite_FrankWedekind}

        \column{.5\textwidth}        
        \begin{itemize}
            \item Eine webbasierte Anwendung der Frank Wedekind Briefedition 
            \item Performance Problem bei der Abfrage der Briefe sowie der Recherchen der Korrespondenzen
            \item entsprechend geringere Akzeptanz der Anwendung
        \end{itemize}
    \end{columns}
\end{frame}

\begin{frame}[c]
    \frametitle{Ablauf einer Web-Anfrage}
    \begin{figure}[centered]
        \begin{tikzpicture}[scale=.55,transform shape,node distance=4em,
            block/.style={rectangle, rounded corners,minimum width=3cm,minimum height=.5cm,text centered, draw=black,fill=green!30},
            lineArrow/.style={arrows={-Latex[length=5pt 3 0]}},
            every fit/.style={inner sep=.4em,draw}
        ]
            \node (browser) [block] {Webbrowser};
            \node (fitClient) [rounded corners,fit=(browser)] {};
            \node [left] at (fitClient.west) {Client};
            
            \node (JSF) [block,below of=browser,node distance=5em] {Java Server Faces};
            \node (EJB) [block,below of=JSF] {Enterprise Java Beans};
            \node (JPA) [block,below of=EJB] {Java Persistance API};
            \node (openJPA) [block, below of=JPA] {OpenJPA Cache};
            \node (fitGlassfish) [rounded corners,fit=(JSF) (EJB) (JPA) (openJPA)] {};
            \node [left] at (fitGlassfish.west) [text width=1.5cm] {Glassfish/ Payara};
    
            \node (memoryBuffers) [block, below of=openJPA] {Memory Buffers};
            \node (services) [block, right of=memoryBuffers, xshift=2cm] {Services};
            \node (database) [block, below of=memoryBuffers] {Database};
            \node (fitPostgreSQL) [rounded corners,fit=(memoryBuffers) (services) (database)] {};
            \node [left] at (fitPostgreSQL.west) {PostgreSQL};
    
            \node (fitServer) [rounded corners,fit=(fitGlassfish) (fitPostgreSQL),inner xsep=3em] {};
            \node [left] at (fitServer.west) {Server};
    
            \draw[lineArrow] (browser)--(JSF);
            \draw[lineArrow] (JSF)--(EJB);
            \draw[lineArrow] (EJB)--(JPA);
            \draw[lineArrow] (JPA)--(openJPA);
            \draw[lineArrow] (openJPA)--(memoryBuffers);
            \draw[lineArrow] (memoryBuffers)--(database);
            \draw[lineArrow] (services)|-(database);
        \end{tikzpicture}
        \label{fig:webrequest}
    \end{figure}
\end{frame}

\section{Untersuchungen}
\begin{frame}[c]
    \frametitle{Vorgehen}
    \begin{itemize}
        \item Vor jeder Messung werden die Container neugestartet und die Startroutinen abgewartet
        \item Aufruf eines Bash-Script auf dem gleichen Rechner wie die Docker-Container um die Latenz des Netzwerkes auszuschließen
        \item Ermittlung des Speicherbedarfs vor und nach dem Webseitenaufrufen
        \item Messung der Aufruf der Index-Seite (ohne Datenbankaufrufe) und der Dokumentenliste, jeweils 10 mal
        \item Report über die SQL-Abfragen mit pgBadger erstellen
    \end{itemize}
\end{frame}

\begin{frame}[c]
    \frametitle{Voraussetzungen}
    \begin{itemize}
        \item Verwendung von Docker, zur Performance-Limitierung
        \item Eigene Container für die Datenbank und den Webserver
        \item Für die Untersuchung wird nur die Dokumentenliste beobachtet
    \end{itemize}

    \vspace{10pt}
    Erste Auffälligkeiten
    \begin{itemize}
        \item OutOfMemory-Ausnahme ausgelöst nach dem vierten Script Aufruf ($\sim$40 Webseitenaufrufe)
        \item Erhöhung des Java-Heapspeichers von 512MB auf 4096MB hat nur die Anzahl der Aufrufe bis zum Absturz verzögert
    \end{itemize}
\end{frame}

%\subsection{Ohne Cache}
\begin{frame}[c]
    \frametitle{Ohne Cache}
    \begin{columns}
        \onslide<2->{
            \column{0.5\textwidth}
            \begin{itemize}
                \item Auffälliger Speicheranstieg, trotz deaktiviertem Cache
                \item Gleichmässige Anzahl an Datenbankabfragen
                \item Gleichmässige Laufzeit der Datenbankabfragen
                \item Laufzeitanteil der Datenbankabfragen unter 10\%
            \end{itemize}
        }

        \onslide<1->{
            \column{0.5\textwidth}
            \begin{table}[h!]
                \centering
                \resizebox{\textwidth}{!}{ \begin{tabular}{r|r|r|r|r|r|r|r|r}
                    & \multicolumn{3}{c|}{Aufrufzeit (ms)} & \multicolumn{2}{c|}{Datenbankabfragen} & \multicolumn{3}{c}{Speicherverbrauch (MB)} \\
                    \# & min & avg & max & \#-avg & avg (ms) & davor & danach & diff \\
                    \hline
                    \hline
                    1 &  360 & 623 & 2079 & 1224.0 & 30.3 &  872.8 &  914.1 &  41.3 \\ % 12240 -  303 ms (135+ 79+ 39+ 22+17+11) (#2-6,8)
                    2 &  331 & 372 &  430 & 1208.0 & 31.2 &  914.5 & 1008.0 &  93.5 \\ % 24320 -  615 ms (270+156+ 78+ 56+34+21) (#2-7)
                    3 &  291 & 428 &  815 & 1208.0 & 33.5 & 1030.0 & 1297.0 & 267.0 \\ % 36400 -  950 ms (406+256+118+ 79+55+36) (#2-7)
                    \textbf{4} &  288 & 357 &  433 & 1208.0 & 33.7 & 1299.0 & 1461.0 & 162.0 \\ % 48480 - 1287 ms (564+334+167+105+72+45) (#2-7)
                    5 &  294 & 404 &  499 & 1208.0 & 32.9 & 1462.0 & 1638.0 & 176.0 \\ % 60560 - 1616 ms (699+428+210+128+92+59) (#2-7)
                \end{tabular} }
                \caption{Messung ohne Caches}
            \end{table}
        }
  \end{columns}
\end{frame}

% Hier 2-3 der aktuellen erarbeiten Ansätze Vorstellen und nach dem Warum fragen
% Genau beschreiben was Signifikant besser/schlechter ist

%\subsection{OpenJPA-Cache}
\begin{frame}[c]
    \frametitle{Caching mit OpenJPA}
    \begin{columns}
        \onslide<2->{
            \column{0.5\textwidth}
            \begin{itemize}
                \item Erwartete Reduzierung der Datenbankabfragen
                \item Laufzeit in der Datenbank halbiert sich nicht, trotz halbierter Abfragen 
                \item Speicheranstieg wurde reduziert
            \end{itemize}
        }

        \onslide<1->{
            \column{0.5\textwidth}
            \begin{table}[h!]
                \small
                \centering
                \resizebox{\textwidth}{!}{ \begin{tabular}{r|r|r|r|r|r|r|r|r}
                    & \multicolumn{3}{c|}{Aufrufzeit (ms)} & \multicolumn{2}{c|}{Datenbankabfragen} & \multicolumn{3}{c}{Speicherverbrauch (MB)} \\
                    \# & min & avg & max & \#-avg & avg (ms) & davor & danach & diff \\
                    \hline
                    \hline
                    ref-4 & 288 & 357 & 433 & 1208.0 & 33.7 & 1299.0 & 1461.0 & 162.0 \\ % 48480 - 1287 ms (564+334+167+105+72+45) (#2-7)
                    \hline
                    \hline
                    1 & 338 & 567 & 1853 & 741.8 & 28.8 &  874.8 &  923.5 &  48.7 \\ %  7418 -  288 ms (145+ 42+ 40+ 24+18+ 8+ 7+ 4) (#2-8,12)
                    2 & 235 & 290 &  460 & 685.2 & 25.8 &  923.5 &  926.4 &   2.9 \\ % 14270 -  546 ms (282+ 81+ 70+ 47+33+14+11+ 8) (#2-9)
                    3 & 225 & 254 &  313 & 683.6 & 27.6 &  927.4 & 1018.0 &  90.6 \\ % 21106 -  822 ms (430+120+ 99+ 77+49+20+16+11) (#2-9)
                    4 & 235 & 289 &  403 & 683.9 & 27.6 & 1018.0 & 1018.0 &   0.0 \\ % 27945 - 1098 ms (569+160+137+ 99+68+26+22+17) (#2-9)
                    5 & 193 & 265 &  359 & 687.9 & 27.6 & 1025.0 & 1140.0 & 115.0 \\ % 34824 - 1374 ms (704+202+171+128+86+34+27+22) (#2-9)
                    \hline
                    \hline
                    1 & 151 & 368 & 1904 & 142.2 & 20.8 & 878.1 & 919.9 & 41.8 \\ % 1422 -  208 ms (133+ 40+ 23+9+2+1) (#2,4-6,10,12)
                    2 & 133 & 143 &  159 &   6.0 & 20.5 & 919.8 & 921.0 &  1.2 \\ % 1482 -  413 ms (274+ 80+ 47+9+2+1) (#2-3,5,6,10,12)
                    3 & 120 & 126 &  132 &   6.0 & 19.9 & 922.8 & 924.1 &  1.3 \\ % 1542 -  612 ms (412+119+ 69+9+2+1) (#2,3,5,6,10,12)
                    4 & 120 & 124 &  128 &   6.0 & 21.4 & 924.1 & 925.4 &  1.3 \\ % 1602 -  826 ms (550+168+ 96+9+2+1) (#2-4,6,10,12)
                    5 & 109 & 114 &  131 &   6.0 & 19.7 & 926.1 & 926.8 &  0.7 \\ % 1662 - 1023 ms (683+209+119+9+2+1) (#2-4,6,10,12)
                \end{tabular} }
                \caption{Messung mit OpenJPA-Cache und Größe auf 1000 bzw. 10000}
            \end{table}
        }
    \end{columns}
\end{frame}

%\subsection{Materialized View}
\begin{frame}[c]
    \frametitle{Abfragen über materialized views}
    \begin{columns}
        \onslide<2->{
            \column{0.5\textwidth}
            \begin{itemize}
                \item Deutliche Reduzierung der Datenbankabfragen und \=laufzeiten
                \item Unter-Abfragen werden als Json-Objekte direkt hinterlegt
                \item Teuer beim erstellen, aber selten notwendig
                \item Geringe Schwankung der Aufrufzeiten
                \item Anteil der Datenbank nochmals reduziert
            \end{itemize}
        }

        \onslide<1->{
            \column{0.5\textwidth}
            \begin{table}
                \centering
                \resizebox{\textwidth}{!}{ \begin{tabular}{r|r|r|r|r|r|r|r|r}
                    & \multicolumn{3}{c|}{Aufrufzeit (ms)} & \multicolumn{2}{c|}{Datenbankabfragen} & \multicolumn{3}{c}{Speicherverbrauch (MB)} \\
                    \# & min & avg & max & \#-avg & avg (ms) & davor & danach & diff \\
                    \hline
                    \hline
                    ref & 288 & 357 & 433 & 1208.0 & 33.7 & 1299.0 & 1461.0 & 162.0 \\ % 48480 - 1287 ms (564+334+167+105+72+45) (#2-7)
                    \hline
                    \hline
                    1 &  203 & 315 & 808 & 17.8 & 3.0 & 851.4 &  883.9 & 32.5 \\ % 178 -  30 ms (19+11+0) (#2,4,8)
                    2 &  154 & 172 & 187 &  9.0 & 2.2 & 883.2 &  887.0 &  3.8 \\ % 268 -  52 ms (33+18+1) (#2,3,8)
                    3 &  145 & 151 & 163 &  9.0 & 2.8 & 887.7 &  895.3 &  7.6 \\ % 358 -  80 ms (52+27+1) (#2,3,8)
                    4 &  132 & 143 & 152 &  9.0 & 2.8 & 896.0 &  900.0 &  4.0 \\ % 448 - 108 ms (70+37+1) (#2,3,8)
                    5 &  121 & 125 & 132 &  9.0 & 2.4 & 900.6 &  901.0 &  0.4 \\ % 538 - 132 ms (85+46+1) (#2,3,8)
                \end{tabular} }
                \caption{Messung mit Materialized View}
            \end{table}
        }
    \end{columns}
\end{frame}

\section{Vergleich}
\begin{frame}[c]
    \frametitle{Vergleich}
    \begin{columns}
    \column{0.3\textwidth}
        \centering
        \begin{tikzpicture}[scale=.4]
        \centering
        \begin{axis}[
            title={Laufzeitvergleich Webseitenaufrufe},
            %width=\textwidth,height=\textheight,
            xlabel={Aufruf},
            ylabel={Laufzeit [ms]},
            enlargelimits=0.05,
            ymin=0, ymax=2100,
            xtick={0,1,2,3,4,5}, %Ticks explizit angeben, dass bei grpßerer Darstellung nicht Zwischenticks existieren
            ytick={0,500,1000,1500,2000,2500},
            legend pos=north east,
            ymajorgrids=true,
            grid style=dashed,
        ]
            \addplot coordinates { (0,2079)(1,623)(2,372)(3,428)(4,357)(5,404) };
            \addplot coordinates { (0,1853) (1,567)(2,290)(3,254)(4,289)(5,265)};
            \addplot coordinates { (0,1904) (1,143)(2,126)(3,126)(4,124)(5,114)};
            \addplot coordinates { (0,808) (1,315)(2,172)(3,151)(4,143)(5,125)};
            \legend{Ohne Cache,OpenJPA Cache,OpenJPA Cache groß,Materialized View}
        \end{axis}
        \end{tikzpicture}

        \begin{tikzpicture}[scale=.4]
        \centering
        \begin{axis}[
            title={Laufzeitvergleich Datenbankabfragen},
            %width=\textwidth,height=\textheight,
            xlabel={Aufruf},
            ylabel={Laufzeit [ms]},
            enlargelimits=0.05,
            ymin=0, ymax=60,
            xtick={1,2,3,4,5}, %Ticks explizit angeben, dass bei grpßerer Darstellung nicht Zwischenticks existieren
            legend pos=north east,
            ymajorgrids=true,
            grid style=dashed,
        ]
            \addplot coordinates { (1,30.3)(2,31.5)(3,33.5)(4,33.7)(5,32.9) };
            \addplot coordinates { (1,28.8)(2,25.8)(3,27.6)(4,27.6)(5,27.6) };
            \addplot coordinates { (1,20.8)(2,20.5)(3,19.9)(4,21.4)(5,19.7) };
            \addplot coordinates { (1,3.0)(2,2.2)(3,2.8)(4,2.8)(5,2.4) };
            \legend{Ohne Cache,OpenJPA Cache,OpenJPA Cache groß,Materialized View}
        \end{axis}
        \end{tikzpicture}

    \pause

    \column{0.7\textwidth}
        \begin{itemize}
            \item Keine Start-Phase auf der Datenbank zu erkennen, im Gegensatz zur Anwendung
            \item Die Datenbankabfragen nehmen den kleinsten Teil der Laufzeit ein
            \item Materialized View geringste Datenbankabfragezeiten, aber nicht schneller als OpenJPA-Cache mit größerem Cache
        \end{itemize}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{Ausblick}

    \begin{itemize}
        \item Größte Optimierungspotenziale sind in der Anwendung vorhanden
        \item Ermittlung welcher Teil der Anwendung die meiste Zeit benötigt
        \item Weitere Prüfung der anderen Caches
        \item Suche des Speicherlecks
    \end{itemize}
\end{frame}

% -- SLIDE -- REFERENCES
% hier alle Keys aus der BIB einfügen, die mit dargestellt werden sollen
\nocite{IbmOpenJPACaching2023,PostgresPro:Chap20.4:2023}
%% Für mehreren Seite bei den Referenzen ein ",allowframebreaks" in den [] hinzufügen
\begin{frame}[t]
    \frametitle{Referenzen}
    \printbibliography[title=Referenzen]
\end{frame}

\end{document}