\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 dem 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 \emph{RPC-Mountd}.
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 dem
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}

Wir haben uns für GlusterFS als verteiltes Dateisystem 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 einzige 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 Compute-Node:

\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 den 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 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.
