Page Cache & Buffer Cache: I/O Acceleration (Artikel 385)
Tiefgehende Analyse der Linux-Caching-Mechanismen. Erfahren Sie den Unterschied zwischen Page-Cache und Buffer-Cache sowie die Optimierung von Disk-I/O durch den Kernel.
# Page Cache mastery: Warum Linux keinen ‘freien’ RAM mag
TL;DR / Management Summary Ein Senior Admin gerät nicht in Panik, wenn
free -mfast null MB freien Speicher anzeigt. Er weiß: Linux nutzt jedes freie Byte als Page Cache, um langsame Festplatten-Zugriffe durch extrem schnelle RAM-Lesezugriffe zu ersetzen. In diesem Modul lernen wir die Architektur des Page Caches kennen, verstehen den Unterschied zum alten Buffer Cache und erfahren, wie wir den Cache kontrollieren können, ohne die Systemstabilität zu gefährden.
# 1. Einführung & Architektur
Alles ist eine Seite.
Der Kernel arbeitet im Speicher mit “Pages” (meist 4KB).
- Page Cache: Speichert Inhalte von Dateien. Wenn Sie
cat file.txtzweimal aufrufen, kommt der zweite Aufruf aus dem RAM. - Buffer Cache: Speichert rohe Disk-Blöcke (Metadaten, Dateisystem-Strukturen). Heute ist er technologisch in den Page Cache integriert.
# Die Caching-Logik (Mermaid)
graph LR
A[Application: Read Request] --> B{Kernel: Check RAM}
B -->|Cache Hit| C[Return Data from RAM: ~100ns]
B -->|Cache Miss| D[Read from SSD/HDD: ~100us - 10ms]
D --> E[Store in Page Cache]
E --> C
subgraph "The 'Used' RAM Trap"
F[Application RAM]
G[Page Cache]
H[Free RAM]
end
# 2. Den Cache überwachen
Transparenz im Speicher.
Nutzen Sie cat /proc/meminfo, um die Wahrheit zu sehen:
grep -E "Cached|Buffers" /proc/meminfo
# Cached: Die Größe des Page Caches.
# Dirty: Daten im Cache, die noch nicht auf Disk geschrieben wurden.
# Pro-Tipp: pcstat
Es gibt Tools (wie pcstat), die Ihnen anzeigen, welche spezifische Datei gerade zu wie viel Prozent im RAM liegt.
# 3. Manuelle Intervention: Drop Caches
Den Reset-Knopf drücken (mit Vorsicht).
Manchmal (z.B. für Benchmarks) müssen wir den Cache leeren.
# 1. Page Cache leeren
echo 1 | sudo tee /proc/sys/vm/drop_caches
# 2. Inodes und Dentries leeren
echo 2 | sudo tee /proc/sys/vm/drop_caches
# 3. Alles leeren
echo 3 | sudo tee /proc/sys/vm/drop_caches
Gefahr: Das Leeren der Caches verursacht einen massiven Performance-Einbruch für alle Applikationen, da jeder Zugriff nun wieder die langsame Disk triggert. Nutzen Sie dies niemals in Produktion!
# 4. Day-2 Operations: Cache-Preloading
Daten bereitstellen, bevor sie gebraucht werden.
Wenn Sie wissen, dass ein Backup oder eine Datenbankabfrage gleich startet, können Sie die Dateien in den Cache “zwingen”.
# Liest die Datei und wirft sie weg (bleibt aber im Page Cache)
cat large_database.db > /dev/null
# 5. Troubleshooting & “War Stories”
Wenn der Cache den OOM-Killer triggert.
# Story 1: “Der hängende ‘Drop Caches’”
Symptom: Der Befehl echo 3 > /proc/sys/vm/drop_caches bleibt für Sekunden hängen und der Server reagiert nicht.
Ursache: Der Kernel muss vor dem Leeren des Caches alle “Dirty Pages” auf die Disk schreiben (sync). Wenn die Disk langsam ist, blockiert der Prozess.
Lösung: Führen Sie immer erst ein manuelles sync aus, bevor Sie die Caches droppen.
# Story 2: “Das Backup-Problem”
Symptom: Nach dem nächtlichen Backup ist der Webserver für den ersten User extrem langsam.
Ursache: Das Backup hat hunderte GB an Daten gelesen und dabei die Webserver-Dateien aus dem Page Cache verdrängt (Cache Eviction).
Lösung: Nutzen Sie fadvise (posix_fadvise), um dem Kernel zu sagen, dass das Backup-Programm die Daten nicht cachen soll (POSIX_FADV_DONTNEED).
# 6. Fazit & Empfehlung
- Verständnis: “Cached RAM” ist guter RAM. Er steht Applikationen sofort zur Verfügung, wenn sie ihn brauchen.
- Performance: Wenn Ihr System bei wiederholten Aufgaben schneller wird, ist der Page Cache Ihr Freund.
- Wartung: Nutzen Sie
vmtouch, um wichtige Files (z.B. Shared Libraries) permanent im RAM zu sperren (Locking).
# Anhang: Cheatsheet
| Aufgabe | Befehl / Pfad |
|---|---|
| Cache Größe sehen | free -h (Spalte buff/cache) |
| Dirty Pages prüfen | `cat /proc/meminfo |
| Cache leeren | echo 3 > /proc/sys/vm/drop_caches |
| Sync erzwingen | sync |
| File im RAM sperren | vmtouch -l <file> |
| Cache Usage pro File | pcstat <file> |
| Kernel Flush-Timer | sysctl vm.dirty_expire_centisecs |
| Hugepages Status | `cat /proc/meminfo |