\subsection{Netzwerk-Dateisysteme}
\label{sub:netzwerk_dateisysteme}

\subsubsection{NFS}
\label{ssub:nfs}

Wir haben uns für das NFS-Dateisystem entschieden. Dieses ermöglicht
ressourcensparend Verzeichnisse zwischen der Head-Node und den Compute-Nodes zu
teilen.

Unter Archlinux ist der NFS-Server im Paket \emph{nfs-utils} zu finden.
Um NFS zu exportieren, starteten wir auf dem Head-Node den rpc-mountd.service.
Das ID-Mapping der symbolischen Benutzer und Gruppen auf die User- und Group-IDs
übernimmt in unserem Fall der LDAP-Dienst (\ref{sub:ldap}). Auf den
Compute-Node wurde jeweils ein Eintrag für die Verzeichnisse \emph{home} und
\emph{cluster} in der Datei \emph{/etc/fstab} angelegt. (siehe \emph{aufgabe3.1/fstab}).

\subsubsection{Verteiltes Dateisystem}
\label{ssub:verteiltes_dateisystem}

Als Dateisystem haben wir uns für GlusterFS entschieden. Im Vergleich zu anderen
verteilten Dateisystemen besitzt GlusterFS keine zentrale Metadaten-Server.
Stattdessen verteilt es die Metadaten durch eine Netzwerktechnologie, die sich
Elastic-Hashing nennt. Dieser verteilte Ansatz verbessert die Verfügbar- und
Skalierbarkeit, da bei Dateisystemen wie Lustre, der Metadatenserver häufig zum
Flaschenhals wird. Das Dateisystem lässt sich im laufenden Betrieb um weitere
Nodes erweitern. GlusterFS kann auf beliebige Dateisysteme aufgesetzt werden,
was die Wiederherstellung im Falle eines Absturzes vereinfacht. Der einzigste
Nachteil, der uns aufgefallen ist, ist das GlusterFS auf Basis von Fuse im
User-Space implementiert ist, was potentiell langsamer als eine entsprechende
Kernel-Implementierung ist.

Als Dateisystem für GlusterFS wird XFS empfohlen. Dafür haben wir eine 50GB
Partition angelegt, diese mit Befehl:

\shellcmd{mkfs.xfs -i size=512 /dev/sda5}

formatiert und nach \emph{/mnt/glusterfs} gemountet (siehe aufgabe3.3/fstab).
Nach dem Starten des GlusterFS-Dienstes, sowohl auf Head- und Computenode:

\shellcmd{systemctl enable glusterfs.service}

\shellcmd{systemctl start glusterfs.service}

legten wir das Dateisystem an:

\shellcmd{gluster volume create gv0 zotac1:/mnt/glusterfs}

\shellcmd{gluster volume start gv0}

Letztendlich mounten wir das GlusterFS mit folgenden Eintrag in der \emph{aufgabe3.3/fstab}:

\begin{center}
zotac0:/gv0 /fastfs glusterfs defaults 0 0
\end{center}

Um die Schreibdurchsatz zu ermitteln, verwendeten wir den Befehl \emph{dd}:

\shellcmd{dd bs=1M count=512 if=/dev/zero of=/path/to/file conv=fdatasync}

um einen 512MB Block auf die Festplatte. Die Option \emph{conv=fdatasync} sorgt
für einen Dateisystem-Sync nach dem Schreiben um die korrekte Schreibrate zu
ermitteln. Für die Leserate haben wir folgenden Befehl benutzt um dieselbige
erstellte Datei zu lesen:

\shellcmd{dd bs=1M count=512 if=/path/to/file of=/dev/null conv=fdatasync}

Um zu verhindern, dass das Betriebssystem hierfür den Cache benutzt, habe wir
diesem vor jedem Durchlauf geleert:

\shellcmd{sync; echo 3 | tee /proc/sys/vm/drop\_caches}

Die Tests wurden auf dem Host zotac1 ausgeführt, wobei {\emph Lokal}, dem
lokalen Ext4-Dateisystem entspricht, NFS dem gemounten NFS von zotac0 und
GlusterFS, dem Dateisystem im Pfad \emph{/fastfs} entspricht. Die Rohdaten
befinden sich in \emph{aufgabe3.3/benchmark.txt}

\pgfplotsset{
  select row/.style={
    x filter/.code={\ifnum\coordindex=#1\else\def\pgfmathresult{}\fi}
  }
}

\pgfplotstableread[header=false]{
  92.3 Lokal
  38.4 NFS
  56.9 GlusterFS
}\writetable

\pgfplotstableread[header=false]{
  125 Lokal
  104 NFS.
  67.9 GlusterFS
}\readtable

\begin{tikzpicture}
  \begin{axis}[
      title=Lesen mit dd,
      xbar, bar shift=0pt,
      enlarge y limits=0.2,
      xmin=0,
      ytick={0,...,4},
      yticklabels from table={\readtable}{1},
      xmajorgrids = true,
      bar width=6mm,
      width=12cm, height=5.5cm,
      xlabel={Leserate [MB/s]},
      nodes near coords, nodes near coords align={horizontal},
    ]
    \pgfplotsinvokeforeach{0,...,3}{
      \addplot table [select row=#1, y expr=#1] {\readtable};
    }
  \end{axis}
\end{tikzpicture}

\begin{tikzpicture}
  \begin{axis}[
      title=Schreiben mit dd,
      xbar, bar shift=0pt,
      enlarge y limits=0.2,
      xmin=0,
      ytick={0,...,4},
      yticklabels from table={\writetable}{1},
      xmajorgrids = true,
      bar width=6mm,
      width=12cm, height=5.5cm,
      xlabel={Schreibrate [MB/s]},
      nodes near coords, nodes near coords align={horizontal},
    ]

    \pgfplotsinvokeforeach{0,...,3}{
      \addplot table [select row=#1, y expr=#1] {\writetable};
    }
  \end{axis}
\end{tikzpicture}

Das lokale Dateisystem war wie zu erwarten sowohl beim Lesen als auch beim
Schreiben das schnellste Dateisystem. Der offensichtliche Nachteil dieser
Methode ist, dass nur die Node selber Zugriff auf diese Daten hat und die Daten
nicht größer als der lokale Speicher werden kann.

Während beim Schreiben GlusterFS einen höheren Durchsatz verzeichnen konnte,
war es in diesem Test deutlicher langsamer als NFS beim Lesen.
Zu beachten hierbei sei, dass in diesem Test nur eine Node auf NFS
zugegriffen hat. Sobald von mehren Nodes auf das NFS geschrieben wird, kann dies
schnell zum Flaschenhals werden. GlusterFS hingegen kann die Datenmengen auf die
einzelnen Nodes verteilen und so höhere Performance erreichen. Ein Nachteil
von GlusterFS dabei ist das die Fuse-Implementierung die CPU stärker belastet,
als dies bei NFS der Fall wäre.
