[ Megoldva ] Sok kis fájl törlése lassítás nélkül

Fórumok

Törölnöm kellene egy nem túl gyors meghajtón egy mappából minden fájlt, úgy, hogy a mappa megmarad, anélkül, hogy a rendszert lassítanám.

A fájlrendszer ext4, a fájlok átlagos mérete 1kb, és több mint 5 500 000 darab van belőlük. A

nice -n 19 ionice -c2 -n7 rm mappa/*

parancs le sem fut (túl sok paraméter), és ennél amúgy is kíméletesebb módszerre lenne szükségem. Félek, még c3 esetén is megszaladhat a load értéke, ráadásul a Ctrl+C sem hat rá, max kill-lel lehetne védekezni. Valami olyasmi kellene, amit direkt erre a problémára készítettek, és mondjuk másodpercenként töröl n fájlt. Nem baj az sem, ha napokig fut.

Van erre valamilyen céleszköz, vagy álljak neki saját scriptet fabrikálni?

Hozzászólások

Szerintem xargs --max-args (-n) paraméterrel használd az rm parancsot. Ha mondjuk 100-at adsz meg, akkor 100-as csomagokban törli a fájlokat és akkor nem lesz túl hosszú a paraméter.

Törölhetsz dátum szerint is, vagy bármi olyan fájl tulajdonságot felhasználva, amivel korlátozhatod az egyszerre törlendő fájlok számát (find).

Szerkesztve: 2021. 04. 08., cs – 09:36

A nice/ionice teljesen fölösleges ebben az esetben sajnos.

A probléma a művelet naplózása, ez esetben az fogja elvinni az IO tetemes részét, ott pedig nem számít hogy maga a művelet milyen ionice-szal futott, egy kalap alá kerül az összes. Magyarán a magas prioritású IO-t is megakasztja az alacsony prioritású műveletek naplózása az időnkénti journal commit-nál. Ez a naplózás egyik rákfenéje.

Van valami szempont, tulajdonság, ami alapján tudni lehet, hogy miket kell törölni ??

Ha a find -delete nem jó, mert zabálja a CPU-t, akkor tényleg egyéni fejlesztés kellene, megfelelő várakoztatásokkal.

Az egész mappa törlése (rm -rf) és újra létrehozása (mkdir) nem járható?

Így hirtelen

find mappa/ -type f -print -exec rm -f {} && sleep 0.1 \;

"Sose a gép a hülye."

homepc$ seq 1 10000 | timeout 1s xargs -I{} bash -c '/bin/echo {} && sleep 0' | tail -1
280

Magyarán a 10 fork/mp nem jelent semmiféle problémát, ennek 28x -osát tudja egy átlag rendszer 1 cpu magon. Ráadásul nálam most épp fut a backup is ami koppra veri a cpu-t.

ha io nincs, cpu van, akkor ez még jó lehet azért.

én talán a find mtime-jával játszogatnék, oda talán kerülhet a helyére egy for ciklusból valami, és a batchek között sleep 10.

elborultabb: a logolást memóriába kitenni vagy rögvest /dev/null-ba küldeni, vagy éppen full kikapcsolni (már ha lehet, dunno)?

perl script:

my $i;
while( <*> ) {
  $i++;
  unlink or die "cannot delete $_";
  if( $i % 100 == 0 ) {
     warn "sleep";
     sleep 30;
  }
}

ezt ha lefuttatod mindent töröl az adott könyvtárban és minden 100 elem után várakozik.
cd mappa && perl /tmp/torol.pl

Eddig ez áll legközelebb hozzám, ha már nincs erre külön tool. Sajnos azonban a <*> elég lassú. Gondolom, betölti a teljes fájlnévlistát. (Eddig nem ismertem ezt.) Azonban lecserélve az opendir-re már egészen gyorsan szalad. Kibővítettem még egy load ellenőrzéssel, és így úgy tűnik, 500-as blokkokkal tud dolgozni.

Szerkesztve: 2021. 04. 08., cs – 12:01

az mc eleg lassu ha az a cel hogy sokaig fusson :)

egyebkent

mv mappa mappa_old; mkdir mappa; rm -fR mappa_old

neked aztan fura humorod van...

Szerkesztve: 2021. 04. 09., p – 11:42

Én éjszaka belökném a fájlnevek listáját egy fájlba ls-el vagy find-al ízlés szerint és abból felolvasva egy python (vagy ízlés szerint más) scripttel minden 50 fájl törlése után egy kis sleeppel törölném. Ha közben keletkeztek fájlok az úgyis olyan kevés, hogy egyetlen rm is észrevehető terhelés nélkül fogja törölni.  

Köszönöm a válaszokat. Először is úgy tűnik, nincs erre kész tool, így én is egy scripttel töröltem.

Végül nem automatizáltam teljesen, mert túl nagy várakozási időt kellett volna beiktatnom az egyes törlések közé. Inkább úgy 50 000 és 100 000 közötti blokkokban töröltem a fájlokat, figyelve a load értékére.

Érdekessége a törlésnek, hogy a terhelés megugrása nincs közvetlen kapcsolatban a törléssel. Néha a törlés befejezése után fél perccel kezdett csak emelkedni a load, és míg a törlés alatt alig ment 1 fölé, utána, volt, hogy ennek a tízszeresét is elérte. Gyanítom, hogy a fájlrendszer napló kiírása az, ami ilyenkor erősen lassítja a rendszert.

Még egyszer köszönöm az ötleteket.

én rsyncel szoktam ilyen nagyobbacska mappákat törölni :)

Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"

x=0.1 sec

valahogy úgy lehetett volna csinálni, hogy:

- 100 vagy 1000-esével törölni a fileokat

- várni x-et

- megnézni a loadot

- ha a load nagyobb 5-nél (mondjuk) akkor x=2*x

- ha a load kisebb mint 2 akkor x=x/2

... és újra

(igen, sleep-el lehet tört másodpercet várni)

x-re lehet maximumot mondani, hogy max 10mp, fölötte nem szorzunk

x-re lehet minimumot mondani, hogy min 0.1, alatta nem osztunk

Gábriel Ákos