Miałem katalog wypełniony milionami obrazów gif. Za dużo dla komendy rm.
Próbowałem polecenia find w następujący sposób:
find . -name "*.gif" -print0 | xargs -0 rm
Problem polega na tym, że bardzo źle psuje moją maszynę i powoduje przerwy dla klientów, ponieważ jest to serwer.
Czy jest jakiś sposób na szybsze usunięcie wszystkich tych plików ... bez blokowania urządzenia?
rm -rf
byłoby szybsze. Warto spróbować.Odpowiedzi:
Szybsze niekoniecznie jest tym, czego chcesz. Możesz chcieć działać wolniej , więc usuwanie powoduje zubożenie mniejszej ilości zasobów podczas jego działania.
Użyj nice (1), aby obniżyć priorytet polecenia.
Dla procesów związanych z I / O nice (1) może nie być wystarczające. Harmonogram systemu Linux bierze pod uwagę operacje we / wy, a nie tylko procesor, ale możesz chcieć dokładniejszej kontroli nad priorytetem operacji we / wy.
Jeśli to nie pomoże, możesz również spać, aby naprawdę spowolnić.
źródło
sleep
dodanie - miałem problemy z serwerami dławiącymi się na IO pomimo używaniaionice -c 3
. To znaczniePonieważ używasz Linuksa, a to zadanie prawdopodobnie wiąże się z operacjami we / wy, radzę nadać priorytet poleceniu bezczynnego harmonogramu operacji we / wy za pomocą
ionice(1)
:W porównaniu do twojego oryginalnego polecenia, może nawet zaoszczędzić trochę więcej cykli procesora, unikając potoku do
xargs
.źródło
find ... -exec
ma sensu.find(1)
roszczenia dokumentacja tak. :) I powinno być oczywiste, że pozwoleniefind
sobie na usunięcie plików jest bardziej wydajne niż wykonanierm
polecenia w tym celu.ionice -c3
obniża prio do uruchomienia, gdy IO jest bezczynne, w przeciwnym razie jest to idealne rozwiązanie. Zwróć uwagę, że ponieważ-delete
nie jest to standardowe dla wyszukiwania, możesz zrobić to samo (włączając informację zwrotną, że to działa) za pomocą tego polecenia:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Powolne, ale nie ma żadnych ważnych procesów.Nie.
Nie ma szybszego sposobu, odejdź od miękkiego formatu dysku. Pliki są przekazywane do rm jednocześnie (do limitu wiersza poleceń, może być również ustawiony na
xargs
), co jest znacznie lepsze niż wywoływanie rm na każdym pliku. Więc nie, zdecydowanie nie ma szybszego sposobu.Używanie
nice
(lubrenice
uruchomionego procesu) pomaga tylko częściowo, ponieważ służy to do planowania zasobów procesora , a nie dysku! A użycie procesora będzie bardzo niskie. Jest to słabość linuksa - jeśli jeden proces „zje” dysk (tj. Dużo z nim działa), cała maszyna utknie. Rozwiązaniem może być zmodyfikowane jądro do użytku w czasie rzeczywistym.To, co zrobiłbym na serwerze, to ręczne zezwolenie innym procesom na wykonanie swojej pracy - w tym przerwy, aby serwer „oddychał”:
Będzie to czekać 5 sekund po każdych 100 plikach. Zajmie to znacznie dłużej, ale Twoi klienci nie powinni zauważać żadnych opóźnień.
źródło
rm *
, rozszerza*
się w zgodzie z wszystkimi nazwami i przekazać gorm
? To bardzo głupie. Dlaczego shell rozwinąć symbole wieloznaczne?*
ani nie/*
podał w wątpliwość takiej decyzji użytkownika.Jeśli liczba plików, które mają zostać usunięte, znacznie przewyższa liczbę pozostawionych plików, przejście do drzewa plików do usunięcia i wykonanie wszystkich aktualizacji systemu plików może nie być najbardziej efektywnym podejściem. (Jest to analogiczne do robienia niezręcznego zarządzania pamięcią z liczeniem odniesień, odwiedzania każdego obiektu w dużym drzewie w celu usunięcia odniesienia, zamiast przekształcania wszystkiego w śmieci w jednym kroku, a następnie przeglądania tego, co jest możliwe do wyczyszczenia.)
Oznacza to, że sklonuj części drzewa, które mają być przechowywane w innym tomie. Ponownie utwórz świeży, pusty system plików na oryginalnym woluminie. Skopiuj zachowane pliki z powrotem do ich oryginalnych ścieżek. Jest to nieco podobne do kopiowania śmieci .
Nastąpi pewien czas przestoju, ale może być lepszy niż ciągła zła wydajność i przerwy w świadczeniu usług.
Może to być niepraktyczne w twoim systemie i sytuacji, ale łatwo wyobrazić sobie oczywiste przypadki, w których jest to właściwy sposób.
Załóżmy na przykład, że chcesz usunąć wszystkie pliki w systemie plików. Po co powtarzać i usuwać jeden po drugim? Po prostu odmontuj go i wykonaj „mkfs” nad partycją, aby utworzyć pusty system plików.
A może chcesz usunąć wszystkie pliki oprócz kilku ważnych? Wydobądź stąd pół tuzina i ... „mkfs” na górze.
W końcu jest pewien próg rentowności, gdy jest wystarczająca liczba plików, które muszą zostać, że tańsze jest usuwanie rekurencyjne, biorąc pod uwagę inne koszty, takie jak wszelkie przestoje.
źródło
Czy próbowałeś:
Znak + na końcu spowoduje, że find będzie zawierać więcej plików do wykonania pojedynczej komendy rm. Sprawdź to pytanie, aby uzyskać więcej informacji.
źródło
-delete
), która nie zawsze musi tam być ..