\subsection{Netzwerk-Dateisysteme} \label{sub:netzwerk_dateisysteme} \subsubsection{NFS} \label{ssub:nfs} Unter Archlinux ist der NFS-Server im Packet {\tt nfs-utils} zu finden. Um NFS zu exportieren starten wir auf dem Head-Node den rpc-mountd.service. Das ID-Mapping übernimmt in unserem Fall der ldap-Dienst (\ref{sub:ldap}). Auf den Compute-Node wurde jeweils ein Eintrag für die Verzeichnisse {\tt home} und {\tt cluster} in der fstab angelegt. (siehe {\tt aufgabe3.1/fstab}). \subsubsection{Verteiltes Dateisystem} \label{ssub:verteiltes_dateisystem} Als Dateisystem haben wir uns für GlusterFS entschieden. Dieses hat im Vergleich zu anderen verteilten Dateisystemen keine zentrale Metadaten-Server. Stattdessen setzt es auf das Elastic-Hashing. Dieser verteilte Ansatz verbessert die Verfügbar- und Skalierbarkeit, da bei Dateisystemen wie Lustre, der Metadatenserver häufigt 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 mit fstab eine 50GB Partition angelegt, diese mit folgenden Befehl formatiert. \shellcmd{mkfs.xfs -i size=512 /dev/sda5} und nach {\tt /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 {\tt aufgabe3.3/fstab}: \begin{center} {\tt zotac0:/gv0 /fastfs glusterfs defaults 0 0} \end{center} Um die Schreibrate zu ermitteln, verwendeten wir den Befehl {\tt 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 {\tt conv=fdatasync} sorgt für einen Dateisystem-Sync nach dem Schreiben um die korrekte Schreibrate zu ermitteln. Für 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 in /fastfs entspricht. Die Rohdaten befinden sich in {\tt 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 das 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.