Sobald sich die Anzahl der OSDs in einem ceph-Cluster ändert, versucht der CRUSH Algorithmus die Daten neu auf den OSDs zu verteilen. Diesen Vorgang nennt man Backfilling.
Das Backfilling hat natürlich direkte Auswirkung auf die Performance des Produktivbetriebs. Will man das Backfilling steuern, kann man den Wert "osd_max_backfills" anpassen. Die aktuelle Last beobachtet man dabei stets mit iotop bzw. iostat.
Aktuellen Wert lesen:
ceph daemon /var/run/ceph/ceph-mon.*.asok config show | grep -i backfill
Neuen Wert schreiben:
ceph tell 'osd.' injectargs '--osd-max-backfills 16'
ceph tell 'osd.' injectargs '--osd-recovery-max-active 4'
Bei der Gelegenheit lohnt es sich oft auch gleich die beiden nächsten Parameter anzupassen: osd_recovery_sleep. Das ist die Zeit (in Sekunden), die Ceph bei einem Backfill zwischen den Elementen (=Dateien) wartet – bei einem Dateisystem mit einigen Millionen Dateien ist der Standardwert von 0.1 – also eine Zenntelsekunde – natürlich viel zu lang.
ceph tell 'osd.*' config set osd_recovery_sleep_hdd 0 ceph tell 'osd.*' config set osd_recovery_sleep_ssd 0
"ceph status" kann dazu verwendet werden, um die Anzahl der tatsächlichen und in der Schlange wartenden backfills abzurufen:
root@ceph03:~# ceph status
[...]
data:
pools: 3 pools, 161 pgs
objects: 38.12M objects, 5.8 TiB
usage: 23 TiB used, 10 TiB / 33 TiB avail
pgs: 7092801/114365247 objects misplaced (6.202%)
134 active+clean
19 active+remapped+backfill_wait
8 active+remapped+backfilling
[...]