find, xargs, sleep

Gegeben

  • Linux-Server
  • RAID-1 aus zwei SATA-Platten (spinning rust)
  • ext4 Filesystem
  • ein Directory-Tree mit vielen Millionen Files + Sub-Directories

Aufgabe

In diesem Tree rekursiv leere Sub-Directories finden und diese löschen.

Bonusaufgabe

Das Ganze soll auf einem Produktionsserver laufen, die I/O muss niedrig gehalten werden, um die eigentlichen Aufgaben des Servers nicht zu beeinträchtigen.

Hinweis

Es handelt sich um etwa 1 Million leere Directories, welche zum Schluss gelöscht werden müssen.

Ansatz 1

find + xargs

find . -type d -empty -print0 | xargs -0 rmdir -v

Löst die Aufgabe, allerdings geht die die Average Queue Depth für die Platten hier nach kürzester durch die Decke und der Maschine kann mit ihrem Storage nicht mehr viel anfangen. Die Bonusaufgabe wird damit zumindest nicht bestanden.

Ansatz 2

find + xargs + sleep: Nach dem Löschen von n Directories kurz warten, damit die Platten genügend Zeit haben, um ihre Aufgaben abzuarbeiten.

find . -type d -empty -print0 | \
xargs -0 -n 100 bash -c '{ rmdir "$@" ; sleep 3 ; }'

Löst Aufgabe + Bonus zufriedenstellend und reicht mir für die einmalige Anwendung.

Veröffentlicht von

Marcus Jaschen

Ich bin selbstständiger Webentwickler und Systemadministrator und bin unter anderem für MTB-News.de, Europas größte Mountainbike-Website tätig. Meine freie Zeit verbringe ich mit Radsport und Fotografie.