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?
- 613 megtekintés
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).
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Az xargs lesz neked jó szerintem, és két adag között lehet egy sleep.
- A hozzászóláshoz be kell jelentkezni
A nice/ionice teljesen fölösleges ebben az esetben sajnos.
- A hozzászóláshoz be kell jelentkezni
Én is így vettem észre, bár nem értem, hisz a problémát épp az alacsony io sebesség okozza.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Van valami szempont, tulajdonság, ami alapján tudni lehet, hogy miket kell törölni ??
- A hozzászóláshoz be kell jelentkezni
Mindent
- A hozzászóláshoz be kell jelentkezni
Ha a find -delete
nem jó, mert zabálja a CPU-t, akkor tényleg egyéni fejlesztés kellene, megfelelő várakoztatásokkal.
- A hozzászóláshoz be kell jelentkezni
Esetleg figyelni, hogy a CPU -használat mikor esik bizonyos szint , % alá és akkor törölni egy adaggal.
Vagy éjjel ??
- A hozzászóláshoz be kell jelentkezni
Igen, ha scriptet írok, valami efféle lesz.
- A hozzászóláshoz be kell jelentkezni
Az egész mappa törlése (rm -rf) és újra létrehozása (mkdir) nem járható?
- A hozzászóláshoz be kell jelentkezni
Semmivel sem lesz sem gyorsabb, sem kevésbé IO igényes.
"Sose a gép a hülye."
- A hozzászóláshoz be kell jelentkezni
Így hirtelen
find mappa/ -type f -print -exec rm -f {} && sleep 0.1 \;
"Sose a gép a hülye."
- A hozzászóláshoz be kell jelentkezni
find mappa/ -type f -delete
- A hozzászóláshoz be kell jelentkezni
Ennek így önmagában eléggé megszalad az io igénye, próbáltam.
- A hozzászóláshoz be kell jelentkezni
ez másodpercenként 10x forkol shell-t, rm és sleep parancsokat, a szándék jó, de az eredmény nem lesz az.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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)?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
én rsyncel szoktam ilyen nagyobbacska mappákat törölni :)
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"
- A hozzászóláshoz be kell jelentkezni
Ez tetszik, jó ötlet! Kár, hogy már nincs meg a mappa, szívesen kiteszteltem volna, ez mennyire öli meg a rendszert.
- A hozzászóláshoz be kell jelentkezni
az unlink() -et annak is meg kell csinálni, az io-t az is megöli
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
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
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni