Swappiness
Wenn sich Linux in einer Desktop-Umgebung langsam anfühlt, z.B. beim Entpacken von großen Dateien oder wenn man an den laufenden Computer zurück kehrt und es eine Weile dauert, bis sich jede Anwendung wieder schnell verhält.
Die Ursache des Problems hat wenig mit der tatsächlichen Leistung des Rechners zu tun, sondern mit dem Festplatten-Caching.
Wenn zu wenig Arbeitsspeicher zur Verfügung steht, kann der Blockcache mit Anwendungen um den übrigen RAM kämpfen. Und der Blockcache kann zusätzlich mit dem Inode/Dentry Cache konkurrieren.
Auf einem Rechner mit wenig RAM versucht Linux aggressiv den Speicher zu leeren, um den Cache zu vergrößern. Dies geschieht normalerweise, indem nicht verwendete Teile von Anwendungen auf die Festplatte ausgelagert werden. Das ist nicht gut, weil Festplatten langsam sind.
Für Datenbank-Workloads (MySQL, MariaDB, …) ist der Swap-Speicher von der Festplatte ebenfalls weitaus langsamer als der direkte Zugriff auf den RAM.
Optimieren über Swappiness
Linux verfügt über eine Swappiness-Einstellung, die das Gleichgewicht zwischen dem Auslagern von Seiten (Speicherblöcken) aus dem RAM in einen vorkonfigurierten Swap-Bereich auf der Festplatte bestimmt.
Die Einstellung liegt zwischen 0 und 100, wobei niedrigere Werte eine geringere Wahrscheinlichkeit des Austauschs bedeuten. Der Standardwert ist normalerweise 60. Dies kann mit folgendem Kommando überprüft werden:
sysctl vm.swappiness
Auf Datenbankservern wie MySQL/MariaDB etc. ist es empfehlenswert, das Auslagern auf den niedrigsten Wert zu setzen, indem man swappiness auf 1 setzt.
Dazu setzt man die Variable vm.swappiness in der Datei sysctl.conf (normalerweise in /etc/sysctl.conf) auf 1.
vm.swappiness=1
Dies wird normalerweise erst nach einem Neustart wirksam. Man kann den Wert ohne Neustart wie folgt ändern:
sysctl -w vm.swappiness=1
Eine komplette Deaktivierung von swappiness ist nicht empfehlenswert, weil das Risiko von OOM (Out-Of-Memory) steigt. OOM tritt auf, wenn die Anforderung an RAM größer ist als der freie Speicher + Swap.
Cache Pressure
Dateisystem-Caches sind wichtiger als alle anderen Caches, daher wollen wir Linux sagen, dass wir Inode/Dentry Caches vor anderen Caches bevorzugen wollen. Es handelt sich dabei um einen prozentualen Wert.
Standardmäßig ist der Wert auf 100%. Umso geringer der Wert, desto mehr zieht der Kernel es vor, Inode/Dentry-Caches im RAM beizubehalten und nicht auszulagern. Beim Wert 0 wird gar kein Speicher/RAM mehr freigegeben, das kann allerdings zu einem Out-of-Memory Problem werden. Man kann den Wert auch erhöhen. Wenn der Wert über 100 angehoben wird, erhöht es das Zurückfordern von Inode/Dentry-Caches so, dass es einen negativen Einfluss auf die Systemleistung haben kann.
Optimieren des VFS Cache Pressure
Wenn man den Inode/Dentry Cache bevorzugen möchte, setzt man den Wert vfs_cache_pressure in der Datei sysctl.conf auf 50.
vm.vfs_cache_pressure=50
Um den Wert zur Laufzeit ohne Neustart anzupassen, führt man folgendes Kommando aus:
sysctl -w vm.vfs_cache_pressure=50
Speichercaches leeren
Pages/Seiten, die über einen Eintrag auf der Festplatte verfügen, werden im schnelleren RAM vorgehalten. Mit der Hilfe von Dentry/Inode-Caches wird ein Dateisystem im Speicher abgebildet. Siehe vfs.txt.
Page-Cache leeren:
echo 1 > /proc/sys/vm/drop_caches
Inode/Dentry-Caches leeren:
echo 2 > /proc/sys/vm/drop_caches
Page-/Dentry-/Inode-Cache leeren:
echo 3 > /proc/sys/vm/drop_caches
Das top-Tool zeigt diese speziellen Caches nicht gesondert an, aber im htop kann man schön sehen, wie viel gerade belegt ist (die Anzeige beim Speicher, h drücken für die Hilfe).