Defragmentation unter Btrfs?

Nein, auf einer SSD ist Defragmentierung, wie auch Balance nicht empfohlen, weil es zusätzliche Schreibzyklen verbrennt und keinen Performance-Vorteil bietet.

Defragmentierung ist nur HDDs empfohlen, auch sollte es um Fragmentierung zu minimieren mit der Option “autodefrag” eingehängt werden. Allerdings ist Fragmentierung ganz natürlich auf einem COW Dateisystem, da es nie Dateien überschreibt, sondern immer neue Dateien erstellt, bei jedem Schreiben, was es auch perfekt zum wiederherstellen von gelöschten Dateien macht.

Ich konnte mehrmals versehentlich gelöschte Dateien wiederherstellen mit: GitHub - danthem/undelete-btrfs: A script that attempts to undelete files in a BTRFS file system. Make sure you read the README. Dazu musst du aber in einen Live-Sitzung booten, wenn es deinen Wurzelverzeichnis ist, da die Partition ausgehängt sein muss.

Mit einer Defragmentierung würdest du auch die Wahrscheinlichkeit deine Dateien wiederherstellen zu können, drastisch minimieren.

Wenn du dennoch glaubst, defragmentieren zu müssen, dann beachte einfache nur Dateien mit einer hohen Datei-Fragmentierung ab 500. Bei Datei-Fragmentierung ca. ab 10000, wäre die nodatacow Markierung fällig, (anfällig sind zb Datenbanken wie sqlite, oder VM Images) also:

sudo chattr +C /pfad/zu/datei

Damit findest du Dateien, die eine Datei-Fragmentierung über 500 haben:

sudo find / -xdev -type f | \
xargs filefrag 2>/dev/null | \
sed 's/^\(.*\): \([0-9]\+\) extent.*/\2 \1/' | \
awk -F ' ' '$1 > 500' | \
sort -n -r 

Siehe auch:

Balance ist auch eine Art Defragmentierung, jedoch nicht der Extents, sonder der Chunks. Es befüllt die 1GB Chunks wieder. Stelle es dir mal so vor: Du hast Eimer in Reihe mit exakt einem Liter. Du nimmst Wasser aus einem in Mitte (löscht Dateien). Was eine Balancierung machen würde, ist Wasser aus dem letzten Eimer nehmen und die ersten Eimer kippen, bis diese voll sind. Ggf. Kannst du den letzten Eimer entfernen, da leer.

Da BTRFS empfindlich auf zu wenig freien Speicher regiert, wäre ein kontrollierter Balance in manchen Fällen notwendig, um Speicher freizugeben. Zum Beispiel (befülle alle Daten-Chunks bis auf 90%):

sudo btrfs balance start -dusage=90 --bg /
sudo watch -n5 btrfs balance status /

:warning: Niemals eine volle Balancierung vornehmen, außer du konvertierst in ein anderes Profil, zb Single → DUP oder Single → RAID1 usw.

Jedenfalls ist das in der Regel nicht notwendig. Je nach Nutzungsgrad und freier Speicher, muss man das selbst abwägen. Ich mach das on demand mal alle ca. 6 Monate. Oder wenn der Speicher voll ist, lösche ich de Cache und andere unnötige Daten und führe eine kontrollierte Balancierung durch.

Generell gilt auch hier: Immer 20% Speicher freihalten auf der Partition, wo sich das Wurzelverzeichnis befindet.

2 Likes