\documentclass[aspectratio=169]{beamer} \input{beamer-config} \usetheme{cleangreen} \include{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} % -- 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} % -- SLIDES -- \section{Aufbau} \begin{frame} \frametitle{Schichten} \begin{figure}[centered] \begin{tikzpicture}[scale=.6,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} ] %https://docs.oracle.com/javaee/6/tutorial/doc/bnacj.html \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} %\caption{Ablauf einer Web-Anfrage} \label{fig:webrequest} \end{figure} \end{frame} \section{Untersuchungen} \begin{frame} \frametitle{Allgemein} \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 \item OutOfMemory-Ausnahme ausgelöst nach dem vierten Script Aufruf ($\sim$40 Webseitenaufrufe) \item Vor jeder Messung werden die Container neugestartet und die Startroutinen abgewartet \end{itemize} \end{frame} \subsection{Ohne Cache} \begin{frame} \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} \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} \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} \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 \item Die Datenbankabfragen nehmen den kleinsten Teil der Laufzeit ein \item Materialized View geringste Datenbankabfragezeiten, aber nicht schneller als großen OpenJPA-Cache \end{itemize} \pause \begin{block}{Zusammenfassung} Dies zeigt, die größten Optimierspotenziale sind in der Anwendung versteckt \end{block} \end{columns} \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}