Jeder, der Moodle etwas näher kennt weiss, dass das Open-Source LMS ein ausgeklügeltes Caching-System besitzt. Dazu werden häufig genutzte Daten in einem Cache-Verzeichnis abgelegt, um diese bei der nächsten Anfrage schneller ausliefern zu können. Dies umfasst vor allem Datenbankabfragen, Sprachdateien und -Einstellungen, Design-Informationen des Themes, sowie Sitzungsinformationen.
Per Voreinstellung landen diese Informationen in verschiedenen Unterverzeichnissen des „moodledata“-Verzeichnisses auf der Festplatte des Servers. Diese Daten sind dann zwar schon in der Art aufbereitet, um direkt an den Client ausgeliefert zu werden, dennoch erfolgen bei jedem Client-Request Festplattenzugriffe auf die benötigten Cache-Dateien, die ebenfalls Zeit in Anspruch nehmen.
Wenn diese Dateien so häufig benötigt werden, warum diese dann nicht direkt aus dem vielfach schnelleren RAM-Speicher des Servers ausliefern? – Ohne verzögernde Festplattenzugriffe?
tmpfs, die RAM-Disk
Bei tmpfs handelt es ich um ein Linux/Unix-Dateisystem, das einen bestimmten Teil des RAM als Partition definiert, die dann an eine beliebige Stelle des Verzeichnisbaums gemountet werden kann.
Klingt so genial wie einfach – hat aber auch Nachteile: Da es sich bei RAM um flüchtigen Speicher handelt, werden die Cache-Daten bei einem Neustart des Betriebssystems gelöscht. Die Folge: Moodle muss nach jedem Neustart den Cache neu aufbauen, was zusätzlich CPU-Zeit kostet und die ersten Zugriffe deutlich verlangsamt. Innerhalb weniger Minuten ist dies aber geschehen und die Cache-Dateien aus dem RAM können wieder genutzt werden. (Ein einfacher Work-around dieses Problems wird ganz unten beschrieben.)
Des weiteren funktioniert die Lösung nicht bei jedem Setup: Moodle-Installationen, die mehrere Webserver umfassen (Cluster mit Load-Balancing), müssen bestimmte Informationen wie Anwendungs- und Session-Daten zentral verwalten können. Hier kommt meist eine memcache-Lösung zum tragen.
Voraussetzungen
- tmpfs-Support des Betriebssystems
- Moodle-Administrator Rechte
- Hosting mit root-Zugriff auf Betriebssystemebene
- Je nach Größe der Moodle-Installation 128 MB freies RAM
- Empfohlen: ECC-RAM
Konfiguration
ACHTUNG – think before you type
Diese Konfiguration bezieht sich auf CentOS 6.x/7.x Systeme. Erkundigen Sie sich ggf. über abweichende Konfigurations-Optionen Ihres Linux-/Unix-Derivats. Alle Befehle und Änderungen in Konfigurationsdateien müssen mit root-Rechten erfolgen.
Unsachgemäße Änderungen an der /etc/fstab-Konfiguration können ein nicht mehr startfähiges Betriebsystem nach sich ziehen. Wir empfehlen ein Backup des Servers zu erstellen. Nutzen Sie ggf. das Rettungssystem, um eine fehlerhafte Einstellung zu korrigieren.
Der Autor übernimmt keine Haftung für etwaige Schäden oder Datenverluste.
1. Speicherbedarf ermitteln
Um den Speicherbedarf Ihrer Cache-Dateien zu ermitteln, summieren Sie die Verzeichnisgrößen von
- moodledata/cache
- moodledata/localcache
- moodledata/lock
- moodledata/sessions
- moodledata/temp
Lassen Sie genügend Spielraum nach oben: Die Werte 64M oder 128M sind wahrscheinlich ausreichend.
2. tmpfs-Partition erstellen
CentOS legt bereits bei der Installation eine tmpfs-Partition an, die maximal die Hälfte des installierten RAMs nutzen darf. Diese wird normalerweise unter /dev/shm gemountet. Der Befehl df -h gibt eine Übersicht über Partitionen und deren Mount-Points.
Man hat also die Möglichkeit, /dev/shm zu nutzen oder eine separate Partition anzulegen:
Durch einen zusätzlichen Eintrag in der /etc/fstab-Konfigurationsdatei wird bereits beim Bootvorgang die tmpfs-Partition angelegt und ins System eingehängt.
tmpfs /var/cache/moodle tmpfs size=128M,mode=775,uid=apache,gid=apache 0 0
Erläuterung: Partition Mount-Point Format Optionen dump pass
Hinweis: Prüfen Sie, ob das Verzeichnis /var/cache/moodle bereits existiert und über die nötigen Zugriffsrechte (Webserver) verfügt. Legen Sie dieses ggf. an und setzen die Rechte.
Wichtig: Passen Sie die Größe (size=128M) sowie die Benutzerrechte (uid=apache,gid=apache) an Ihr System an. Beachten Sie, dass die Optionen ausschließlich mit Kommata getrennt werden dürfen! KEINE Leerzeichen!
Sichern Sie die Änderungen.
3. Neustart des Betriebssystems
Mit einem reboot und dem nachfolgenden Neustart des Systems werden die Änderungen aktiv und die tmpfs-Partition steht unter /var/cache/moodle zur Verfügung.
Dies kann wiederum mit dem Befehl df -h überprüft werden.
4. Moodle-Konfiguration
Jetzt muss Moodle nur noch mitgeteilt werden, dass die Cache-Dateien nicht mehr im moodledata-Verzeichnis sondern unter /var/cache/moodle gespeichert werden sollen:
Dazu melden Sie sich als Administrator bei Moodle an und navigieren zu Website-Administration -> Plugins -> Caching -> Konfiguration
Im Bereich „Installierte Cache-Speicher“ legen Sie zunächst 2 neue Instanzen an: Datei-Cache -> Instanz hinzufügen:
- Speichername: „TMPFS moodle-anwendung“, Cache-Pfad: „/var/cache/moodle/anwendung“, „Verzeichnis automatisch anlegen“ aktivieren.
- Speichername: „TMPFS moodle-sessions“, Cache-Pfad: „/var/cache/moodle/sessions“, „Verzeichnis automatisch anlegen“ aktivieren.
Jetzt müssen die beiden neuen Speicher ihrer Verwendung zugeordnet werden:
Im Bereich „Speicherort wenn keine Definition erstellt wurde“ (ganz unten) auf „Bearbeiten“ klicken und die Einstellungen wie folgt vornehmen:
Klicken Sie „Änderung speichern“ um die neuen Cache-Einstellungen zu übernehmen.
Moodle nutzt nun fortan die tmpfs-Partition als Cache-Speicher.
Nutzen
- Bei mehreren Installationen konnten wir eine um 50-100% schnellere Generierung der Moodle-Seiten erreichen.
- Festplatten-Zugriffe werden minimiert (somit auch die Auslastung und Abnutzung)
Der Geschwindigkeitsgewinn fällt beim Einsatz von SSDs nicht ganz so groß aus, ist aber dennoch spürbar und schont die Hardware.
Weitere Anwendungsgebiete
Dieses System lässt sich natürlich auf alle Anwendungsfälle anwenden, bei denen Cache-Dateien auf die Festplatte ausgelagert werden. Sehr effektiv kann es bei Content-Management-Systemen sein, z.B. WordPress mit SuperCache-Plugin, oder als Cache-Verzeichnis von Google’s mod_pagespeed bzw. ngx_pagespeed, die teilweise mehrere hundert Megabyte statische Cache-Dateien erzeugen.
Moodle-tmpfs-Cache über den Neustart hinweg retten
Den Nachteil, dass die tmpfs-Partition des Moodle-Caches nach einem Neustart des Betriebssystems leer ist und Moodle den Cache neu aufbauen muss, lässt dich durch einen Trick abmildern:
Der Plan ist, das tmpfs-Verzeichnis /var/cache/moodle in regelmäßigen Abständen in ein Backup-Verzeichnis auf der Festplatte zu sichern. Am einfachsten und effektivsten funktioniert das mit einem RSYNC-Befehl, der stündlich per Cron ausgeführt wird.
Dazu ergänzt man folgende Zeile in der Datei /etc/crontab:
00 */1 * * * root rsync -a --delete /var/cache/moodle/ /var/cache/moodle-backup/ > /dev/null 2>&1
Das Verzeichnis /var/cache/moodle-backup sollte vorher existieren.
Damit die Cache-Dateien nach dem Neustart wieder im korrekten Verzeichnis landen, kopiert man unmittelbar nach dem Start des Betriebssystems die Inhalte des Backup-Verzeichnisses mit unveränderten Benutzerrechten zurück.
In der Datei /etc/rc.config ergänzt man folgende Zeile (ggf. vor dem Befehl „exit 0“)
cp -Rpf /var/cache/moodle-backup/* /var/cache/moodle/
Jetzt wird Moodle auch unmittelbar nach einem Neustart des Server-Betriebssystems mit bestmöglicher Performance arbeiten.
Fazit
Natürlich kann die Optimierung des Moodle-Cachings mit tmpfs nur ein Aspekt in einer Reihe von Optimierungsmöglichkeiten sein. Dabei liegt das Hauptaugenmerk auf dem Einsatz eines Bytecode-Caches für kompilierte PHP-Dateien (z.B. mit APC oder OPcache) und natürlich der Optimierung der Datenbankverbindung (Abfrage-Cache, Tabellen-Cache, Index, usw). Ziel sollte dabei jeweils sein, so viele Daten wie möglich aus dem Hauptspeicher des Servers auszuliefern und Festplattenzugriffe zu minimieren.
Weblinks
LEADING INTERACTIVE bietet Beratung, Gestaltung, Installation, Konfiguration und Support für Lernplattformen an und unterstützt auch gerne bei individuellen Konfigurationen und Performance-Optimierungen.
Weitere Infos: Unternehmensinterne Lernplattform