\documentclass{beamer}

\mode<presentation>{\usetheme{Madrid}}

\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}


\title[Perl-Monitoring] % (optional, nur bei langen Titeln nötig)
{Monitoring von Perl-basierten Web Anwendungen mit Kieker}

\subtitle{Bachelor-\\Abschlusskolloquium}
\author{Nis Wechselberg}
\institute[CAU Kiel]{Institut für Informatik\\Christian-Albrechts-Universität zu Kiel}

\date{26. März 2013}

% Folgendes sollte gelöscht werden, wenn man nicht am Anfang jedes
% Unterabschnitts die Gliederung nochmal sehen möchte.
\AtBeginSection[]
{
  \begin{frame}<beamer>{Gliederung}
    \tableofcontents[currentsection,hideothersubsections,hideothersections,sectionstyle=show/hide]
  \end{frame}
}


% Falls Aufzählungen immer schrittweise gezeigt werden sollen, kann
% folgendes Kommando benutzt werden:

% \beamerdefaultoverlayspecification{<+->}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}{Gliederung}
  \tableofcontents[hidesubsections]
  % Die Option [pausesections] könnte nützlich sein.
\end{frame}

\section{Motivation}

\subsection{System}
\begin{frame}{Kielprints}
  \begin{center}
    \includegraphics[width=0.93\textwidth]{images/kielprints}
  \end{center}
\end{frame}
\begin{frame}{Projektbeschreibung}
  \begin{itemize}
    \item 
      Plattform zur Veröffentlichung von wissenschaftlichen Dokumenten (\emph{self archiving})
    \item
      Ergänzte und modifizierte Version von EPrints
    \item
      Betrieben durch das GEOMAR | Helmholtz Zentrum für Ozeanforschung Kiel
    \item
      Erweiterung des OceanRep GEOMAR
    \item 
      Über 15000 Veröffentlichungen von mehr als 1000 Autoren
  \end{itemize}
\end{frame}

\subsection{Beobachtete Performanceprobleme}
\begin{frame}{Benutzerperspektive}
  \begin{itemize}
    \item
      Abrufen von Einträgen über die Plattform: \\[0.5cm]
    \item
      Erhöhte Antwortzeiten
    \item
      Langsame Suche in den Fachbereichen
  \end{itemize}
\end{frame}
\begin{frame}{Administration/Betrieb}
  \begin{itemize}
    \item
      Hohe Wartezeiten bei Seitenwechseln im Backend
    \item
      Beispiel: Beim Eintragen von neuen Publikationen über das Backend und hinzufügen von Autoren dauert die Generierung von Dropdown-Menüs etwa 10 Sekunden.
  \end{itemize}  
\end{frame}

\section{Technologien und Methoden}
\subsection{Kieker-Framework}
\begin{frame}{Kieker Monitoring Framework}
  \begin{itemize}
    \item Monitoring Tool aus diesem Lehrstuhl
    \item Empfohlenes Tool im SPEC RG Software Repository
  \end{itemize}
    \includegraphics[scale=0.7]{images/kiekerComponentDiagram-woCloud-bw-w-record-newNames-withTraceAnalysis-colors}
\end{frame}
 
 \begin{frame}{Überblick über Kieker}
   \begin{itemize}
     \item Aufteilung in \emph{Kieker.Monitoring} und \emph{Kieker.Analysis}
     \item \emph{Kieker.Monitoring} zur Instrumentierung und Überwachung
     \item \emph{Kieker.Analysis} zur Auswertung und Veranschaulichung
     \item Kommunikation über Monitoring Log oder Stream\\[0.5cm]
     \item Bisher keine Unterstützung für Perl
   \end{itemize}
 \end{frame}
 
\subsection{Programmiersprache Perl}

 \begin{frame}{Programmiersprache Perl}
   \begin{itemize}
     \item imperative, plattformunabhängige, interpretierte Sprache
     \item Entwickelt 1987, heute in Version 5.16 verfügbar
     \item Module für Objektorientierung über CPAN verfügbar
     \item Sehr viele Freiheiten für Programmierer (freie Syntax)
     \item Starke Funktionen für String-Manipulationen und Reguläre Ausdrücke
     \item Direkte Integration in Webserver mittels mod\_perl
   \end{itemize}
 \end{frame}

\subsection{Performance-Monitoring}

 \begin{frame}{Vorgehen bei Performance-Monitoring}
   \begin{enumerate}
     \item Instrumentierung des Codes mit \emph{Probes}
     \item Ausführung des instrumentierten Codes
     \item Protokollierung von Monitoring Daten
     \item Auswertung der Daten mittels geeigneter Tools
   \end{enumerate}
 \end{frame}
 
 \begin{frame}{Erfasste Daten}
   \begin{itemize}
     \item Anwendungsdaten
       \begin{itemize}
         \item Aufrufreihenfolge
         \item Aufrufhäufigkeiten
         \item Ausführungszeiten
       \end{itemize}
     \item Systemdaten
       \begin{itemize}
         \item CPU-Auslastung
         \item Arbeitsspeicher
         \item aktive Prozesse
         \item ...
       \end{itemize}
   \end{itemize}
 \end{frame} 

\section{Perl.Kieker Implementierung}

\subsection{Architektur}

 \begin{frame}{Architekturentwurf}
   \includegraphics[width=0.95\textwidth]{images/Deployment-Diagram-Client-Server-Model}
 \end{frame}

 \begin{frame}{Neuimplementierungen in Perl}
   \includegraphics[width=0.95\textwidth]{images/Classdiagram-Kieker-Perl}
   \begin{itemize}
     \item Implementierung von Monitoring Records, Monitoring Writer und Kontrollmechanismen
     \item Unterstützte Records: OperationEntryEvent, OperationExitEvent, Trace
     \item Auswertung mit \emph{Kieker.Analysis}
   \end{itemize}
 \end{frame}

\subsection{Basismodule}

\begin{frame}{Kieker in Perl}
  \begin{itemize}
    \item Kieker
      \begin{itemize}
        \item Kapselt die weiteren Module zur einfacheren Verwendung
        \item Hält die Instanzen von Kieker::Writer und Kieker::Controlling
      \end{itemize}
    \item Kieker::Controlling
      \begin{itemize}
        \item Verwaltet Trace-IDs und Order-Indices
        \item Erzeugt bei Bedarf neue Traces 
      \end{itemize}
    \item Kieker::Util
      \begin{itemize}
        \item Verwaltet Zeitmessung
        \item Rechnet Perl-Mikrosekunden in Nanosekunden um
      \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{Kieker in Perl - Writer}
  \begin{itemize}
    \item Kieker::Writer::FileWriter
      \begin{itemize}
        \item Schreibt serialisierte Records in angelegte Datei
        \item Wurde für frühe Test verwendet
      \end{itemize}          
    \item Kieker::Writer::JMSWriter
      \begin{itemize}
        \item Verwendet den Java Message Service zur Übertragung der Nachrichten
        \item Anbindung an Kieker mittels Kieker-Data-Bridge
      \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{Kieker in Perl - Records}
  \begin{itemize}
    \item Kieker::Record::Trace
    \item Kieker::Record::OperationEntryEvent // OperationExitEvent
      \begin{itemize}
        \item Zeigen Start und Ende einer Funktion an
        \item Benötigte Daten: Funktionsname, Paketname, Zeitstempel, Trace, OrderIndex
        \item Rekonstruktion durch Kieker.Analysis
      \end{itemize}
  \end{itemize}
\end{frame}

\subsection{Kieker-Data-Bridge}
\begin{frame}{Kieker-Data-Bridge I}
  \includegraphics[width=0.95\textwidth]{images/kieker-data-bridge}
\end{frame}

\begin{frame}{Kieker-Data-Bridge II}
  \begin{itemize}
    \item Entwickelt aus dem MENGES-Projekt heraus
    \item Stellt eine einheitliche Schnittstelle für neue Erweiterungen dar
    \item Verschiedene Konnektoren \\
      (TCP Client, TCP Server, JMS Client, JMS Embedded)
    \item Empfängt Binärdaten und Textnachrichten
  \end{itemize}
\end{frame}

\begin{frame}{Kieker-Data-Bridge III}
  \begin{itemize}
    \item Textnachrichten mit Semikolon getrennt
    \item Records werden mit Mapping-Datei identifiziert
    \item Parameter hängen von Record-Typ ab
    \item Beispiel: \texttt{1;1362747533540734000;6889; \\5;EPrints.current\_repository;EPrints}
  \end{itemize}
\end{frame}

\section{Instrumentierung}

\begin{frame}{Automatische Instrumentierung}
  \begin{itemize}
    \item Verwendung von CPAN-Modul Sub::WrapPackages
    \item Automatische Erstellung von Wrappern
    \item[] \includegraphics[width=0.7\textwidth]{images/Instrument-Code}
  \end{itemize}
\end{frame}

\section{Testdurchführung}
\subsection{System}
\begin{frame}{Vergleichstest}
  \begin{itemize}
    \item Virtuelle Maschine unter Ubuntu 12.04 LTS
    \item Datenbasis vom GEOMAR vom 7. Februar 2013
    \item Vergleich von EPrints 3.2 und Kielprints
  \end{itemize}
\end{frame}

\begin{frame}{Komponenten}
  \begin{center}
  \includegraphics[width=0.7\textwidth]{images/Kielprints-Deployment}
  \end{center}
\end{frame}

\subsection{Requests}
\begin{frame}
  \begin{itemize}
    \item 5 beispielhafte Anfragen auf der Admin-Oberfläche
    \item Anwendungsfall \emph{Neue Publikation eintragen} (Skizze)
    \item 4 normale Requests, 1 AJAX Request
    \item[] \includegraphics[width=0.7\textwidth]{images/Screenshot-Trace4}
  \end{itemize}
\end{frame}

\section{Ergebnisse}
\subsection{Zeitliches Verhalten}
\begin{frame}[shrink=15]{Zeitmessungen}
\begin{table}
  \begin{tabular}{l|rrrrr}
    Request & 1 & 2 & 3 & 4 & 5 \\ 
    \hline 
    EP norm. & 402 ms & 220 ms & 136 ms & 413 ms & 348 ms \\ 
    EP inst. & 15389 ms & 15043 ms & 18408 ms & \textbf{23430 ms} & \textbf{7066 ms} \\ 
    \hline 
    KP norm. & 10270 ms & 227 ms & 166 ms & 13420 ms & 18890 ms \\ 
    KP inst. & 28505 ms & 16623 ms & 17414 ms & \textbf{280927 ms} & \textbf{342662 ms} \\
    \hline
    F1  & 25,5 & 1,0 & 1,2 & 32,5 & 54,3 \\
    F2  & 1,8 & 1,1 & 0,9 & 11,9 & 48,5
  \end{tabular} 
  \caption{Zeitliches Verhalten von Eprints und Kielprints vor und nach Instrumentierung}
\end{table}
\textbf{Requests}
\begin{enumerate}
  \item Admin Homepage
  \item Neue Publikation eintragen
  \item Dateiupload
  \item Metadaten
  \item AJAX: Mehr Autorenfelder
\end{enumerate}
\end{frame}
\subsection{Funktionsaufrufe}
\begin{frame}[shrink=15]{Funktionsaufrufe}
\begin{table}[h!tb]
  \begin{tabular}{l|rrrrr|r}
    Request & 1 & 2 & 3 & 4 & 5 & Summe \\ 
    \hline 
    Eprints & 20875 & 28590 & 33171 & 43056 & 16980 & 142672 \\ 
  %  \hline 
    Kielprints & 31742 & 36681 & 40165 & 905580 & 934760 & 1948928 \\
  %  \hline
    Faktor & 1,5 & 1,3 & 1,2 & 21,0 & 55,1 & 13,7
  \end{tabular} 
  \caption{Funktionsaufrufe von EPrints und Kielprints}
\end{table}
\end{frame}
\subsection{Aktive Pakete}
\begin{frame}[shrink=10]{Aktive Pakete}
\begin{table}[h!tb]
  \begin{tabular}{lrlr}
    \textbf{EPrints} & \textbf{Aufrufe} & \textbf{Kielprints} & \textbf{Aufrufe} \\
    EPrints.Script.Compiler & 30304 & EPrints.MetaField           & 501872 \\
    EPrints.Repository      & 25980 & EPrints.DataSet             & 253493 \\
    EPrints.MetaField       & 18374 & EPrints.Repository          & 243699 \\
    EPrints.XML             & 12486 & EPrints.Database            & 189624 \\
    EPrints.DataSet         &  7488 & EPrints.DataObj             & 156391 \\
    EPrints.Utils           &  7220 & EPrints.MetaField.Id        & 155978 \\
    EPrints.XML.EPC         &  5703 & EPrints.Utils               & 118036 \\
    EPrints.DataObj         &  5439 & EPrints.XML                 & 107939 \\
    EPrints.Database        &  3466 & EPrints.MetaField.Multilang &  45312 \\
    EPrints.Script.Compiled &  3404 & EPrints.Script.Compiler     &  39550
  \end{tabular}
  \caption{Die 10 aktivsten Pakete}
\end{table}
\end{frame}
\subsection{Abhängigkeiten}
\begin{frame}{Abhängigkeitsgraph EPrints}
\begin{center}
  \includegraphics[width=0.6\textwidth]{images/Dependency-Graph-EPrints}
\end{center}
\end{frame}

\begin{frame}{Reduzierter Abhängigkeitsgraph}
\begin{center}
  \includegraphics[width=0.65\textwidth]{images/Condensed-Dependency-Graph}
\end{center}
\end{frame}


\section{Fazit}

\begin{frame}{Fazit}
\begin{itemize}
  \item Es wurde ein erstes Monitoringverfahren für Perl-Anwendungen etabliert.
  \item Die Perl-Data-Bridge wurde das erste Mal \emph{produktiv} eingesetzt.
  \item Es wurde ein Vergleichstest von EPrints und Kielprints durchgeführt.
  \item Es wurden häufige Datenbankanfragen in Kielprints festgestellt.
  \item Es wurden Schwächen in der Architektur sowohl von EPrints und Kielprints erkannt.
\end{itemize}
\end{frame}

\end{document}