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).
Köszi, a find -ctime paraméterrel talán jó is lenne, mivel időben eloszló, folyamatosan gyűlő fájlokról van szó, de itt is annyiszor kellene kiadnom, hogy vagy írok rá egy kis scriptet, vagy találok valami céleszközt.
Az xargs lesz neked jó szerintem, és két adag között lehet egy sleep.
A nice/ionice teljesen fölösleges ebben az esetben sajnos.
Én is így vettem észre, bár nem értem, hisz a problémát épp az alacsony io sebesség okozza.
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 ??
Mindent
Ha a
find -delete
nem jó, mert zabálja a CPU-t, akkor tényleg egyéni fejlesztés kellene, megfelelő várakoztatásokkal.Esetleg figyelni, hogy a CPU -használat mikor esik bizonyos szint , % alá és akkor törölni egy adaggal.
Vagy éjjel ??
Igen, ha scriptet írok, valami efféle lesz.
Az egész mappa törlése (rm -rf) és újra létrehozása (mkdir) nem járható?
Semmivel sem lesz sem gyorsabb, sem kevésbé IO igényes.
"Sose a gép a hülye."
Így hirtelen
find mappa/ -type f -print -exec rm -f {} && sleep 0.1 \;
"Sose a gép a hülye."
find mappa/ -type f -delete
Ennek így önmagában eléggé megszalad az io igénye, próbáltam.
ez másodpercenként 10x forkol shell-t, rm és sleep parancsokat, a szándék jó, de az eredmény nem lesz az.
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:
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.
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...
É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"
Ez tetszik, jó ötlet! Kár, hogy már nincs meg a mappa, szívesen kiteszteltem volna, ez mennyire öli meg a rendszert.
az unlink() -et annak is meg kell csinálni, az io-t az is megöli
Gábriel Ákos
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