Jak buforować lub w inny sposób przyspieszać podsumowania `du`?

33

Mamy duży system plików, w którym pełne dupodsumowanie (użycie dysku) zajmuje ponad dwie minuty. Chciałbym znaleźć sposób na przyspieszenie podsumowania użycia dysku dla dowolnych katalogów w tym systemie plików.

W przypadku małych gałęzi zauważyłem, że duwyniki wydają się w jakiś sposób buforowane, ponieważ powtarzające się żądania są znacznie szybsze, ale w przypadku dużych gałęzi przyspieszenie staje się znikome.

Czy istnieje prosty sposób na przyspieszenie dulub bardziej agresywne buforowanie wyników dla gałęzi, które nie zostały zmodyfikowane od poprzedniego wyszukiwania?

A może istnieje alternatywne polecenie, które może szybciej dostarczać podsumowania użycia dysku?

Ian Mackinnon
źródło
8
Dwie minuty nie wydają mi się tak długie. Ale prawdziwe pytanie brzmi: „Czy naprawdę chcesz, żeby Du coś buforował?” Czy nie powinienem podawać dokładnych, rzeczywistych liczb bloków dysku?
Bruce Ediger,
Zgadzam się, że zastąpienie dubyłoby złe, ale szybszy skrypt opakowania z identycznym interfejsem byłby dla nas bardzo przydatny. Ponadto spodziewałbym się, że wyniki buforowania zależne od czasu ostatniej modyfikacji (i przy założeniu braku operacji na całym dysku, np. Defragmentacji) dałyby dokładne wyniki: czy czegoś brakuje?
Ian Mackinnon
2
Jeśli obawiasz się zbyt dużego zużycia dysku, możesz rozważyć zastosowanie przydziału.
pyasi
2
Bruce - możesz zadać to samo pytanie find. Ale potem jest locate.
Yuval,
Jeśli korzystasz z Androida , spójrz na StatFssuper szybką ocenę rozmiarów katalogów. W porównaniu do dużych, złożonych katalogów było prawie 1000 razy szybsze du.
Joshua Pinter

Odpowiedzi:

21

Po ponownym uruchomieniu polecenia du widzisz efekt buforowania dysku. Po odczytaniu bloku jego bufor dyskowy jest przechowywany w pamięci podręcznej bufora, dopóki ten blok nie jest potrzebny. W przypadku du należy przeczytać katalog i i-węzeł dla każdego pliku w katalogu. W tym przypadku wyniki du nie są buforowane, ale można je uzyskać przy znacznie mniejszej liczbie operacji na dysku.

Chociaż można by zmusić system do buforowania tych informacji, ogólna wydajność ucierpiałaby, ponieważ wymagana przestrzeń bufora nie byłaby dostępna dla plików aktywnie uzyskiwanych.

Sam katalog nie ma pojęcia, jak duży jest plik, więc należy uzyskać dostęp do i-węzła każdego pliku. Aby zachować wartość w pamięci podręcznej za każdym razem, gdy plik zmieniał rozmiar, wartość w pamięci podręcznej musiałaby zostać zaktualizowana. Ponieważ plik może być wymieniony w 0 lub więcej katalogach, wymagałoby to, aby i-węzeł każdego pliku wiedział, w których katalogach jest wymieniony. To znacznie skomplikowałoby strukturę i-węzła i zmniejszyłoby wydajność IO. Ponieważ du pozwala uzyskać wyniki przy założeniu różnych rozmiarów bloków, dane wymagane w pamięci podręcznej musiałyby zwiększać lub zmniejszać buforowaną wartość dla każdego możliwego rozmiaru bloku, co dodatkowo spowalnia działanie.

BillThor
źródło
7

Jeśli możesz ustalić, że różne hierarchie plików należą do różnych grup, możesz skonfigurować przydziały dysku . Nie podawaj górnego limitu (lub zmień go na rozmiar dysku), chyba że chcesz. Nadal będziesz w stanie od razu powiedzieć, ile z jego (efektywnie nieskończonej) kwoty wykorzystuje grupa.

Wymaga to, aby Twój system plików obsługiwał przydziały dla poszczególnych grup. Linux Ext [234] i zfs Solaris / * BSD / Linux. Byłoby dobrze dla twojego przypadku użycia, gdyby przydziały grupowe brały pod uwagę listy ACL, ale nie sądzę, że tak.

Gilles „SO- przestań być zły”
źródło
7

Typowe użycie dumożna znacznie przyspieszyć za pomocą ncdu.

ncdu - NCurses Disk Usage

wykonuje du, buforuje wyniki i pokazuje je w przyjemnym gui wiersza poleceń, nieco podobnym do du -hc -d 1 | sort -h. Początkowe indeksowanie zajmuje tyle samo czasu du, ale szukanie faktycznego „winowajcy” wypełniającego cenne miejsce jest przyspieszone, ponieważ wszystkie podkatalogi mają początkowo buforowane informacje.

W razie potrzeby podkatalogi można odświeżyć, naciskając [r], a pliki / foldery można usunąć, naciskając [d], przy czym oba z nich aktualizują statystyki dla wszystkich katalogów nadrzędnych. Usunięcie wymaga potwierdzenia.

Jeśli to konieczne, dalsze przyspieszenie można osiągnąć przez nauczanie ncdu -1xo- / | gzip >export.gzw kronice towarzyskiej i późniejszy dostęp do niej zcat export.gz | ncdu -f-, ale oczywiście daje więcej nieaktualnych informacji.

DennisH
źródło
7

Wolę korzystać z agedu

Agedu to oprogramowanie, które próbuje znaleźć stare i nieregularnie używane pliki, zakładając, że najprawdopodobniej nie będą one potrzebne. (np. Pliki do pobrania, które były przeglądane tylko raz).

Zasadniczo wykonuje ten sam rodzaj skanowania dysku du, ale rejestruje również czasy ostatniego dostępu dla wszystkich skanowanych plików. Następnie buduje indeks, który pozwala mu efektywnie generować raporty zawierające podsumowanie wyników dla każdego podkatalogu, a następnie generuje te raporty na żądanie.

SHW
źródło
4
Nie odpowiada na pytanie, ale nadal daje +1. Dobra wskazówka.
0xC0000022L
Zredagowałem pytanie, aby wyjaśnić, że to faktycznie odpowiada na pytanie (agedu indeksuje użycie dysku oraz czas dostępu).
Anthony G - sprawiedliwość dla Moniki
5

Jak wspomniano przez SHW, agedurzeczywiście stworzył indeks. Po przeczytaniu pomyślałem, że podzielę się innym sposobem na stworzenie indeksu locatedb. Można utworzyć własną wersję locatedbz duwyjściem:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkprzestawia wyjście du tak, aby najpierw miały nazwy plików, dzięki czemu frcodedziała poprawnie. Następnie użyj locatetej bazy danych, aby szybko zgłosić użycie dysku:

locate --database=du.locatedb pingus

Możesz go rozwinąć, aby dostosować do swoich potrzeb. Myślę, że jest to miłe wykorzystanie zlokalizowanego.

Yuval
źródło
3
duc

(patrz https://duc.zevv.nl ) może być tym, czego szukasz.

Duc przechowuje użycie dysku w zoptymalizowanej bazie danych, co zapewnia szybki interfejs użytkownika. Brak czasu oczekiwania po zakończeniu indeksu.

Aktualizacja indeksu jest dla mnie bardzo szybka (mniej niż 10 sekund na około 950 tys. Plików w katalogach 121 tys., 2,8 TB). Ma również GUI i interfejs użytkownika ncurses.

Zastosowanie np .:

duc index /usr
duc ui /usr

Ze strony:

Duc został stworzony do skalowania do ogromnych systemów plików: bez problemu indeksuje i wyświetla setki milionów plików na petabajtach pamięci.

Piotr
źródło
2

Mam cronjob skonfigurowany do uruchamiania aktualizowanego co 10 minut. Utrzymuje wszystkie bufory systemu plików ładne i świeże. Równie dobrze możesz użyć tej taniej pamięci RAM do czegoś dobrego. Użyj płyty głównej, patrz „przed” i „po”.

Marcin
źródło
Nie rozumiem, jak twoja odpowiedź odnosi się do pytania. updatedbnic nie mówi o użyciu dysku. Jeśli robisz to tylko po to, aby przejechać dysk, narazisz ogólną wydajność.
Gilles „SO- przestań być zły”
3
Zliczanie rozmiarów plików dujest powolne, ponieważ musisz uzyskać dostęp do metadanych potencjalnie dużej liczby plików, rozproszonych na dysku. Jeśli agresywnie uruchomisz updatedb, metadane wszystkich plików będą musiały być przechowywane w pamięci RAM. Następnym razem, gdy uruchomisz inną operację obciążającą metadane, zamiast wykonywać tysiące wyszukiwań na dyskach, używasz pamięci podręcznej. Zwykle masz niewielką szansę na buforowanie tej konkretnej części metadanych drzewa. Przy moim „ładowaniu pamięci podręcznej metadanych” jest wysoce prawdopodobne, że potrzebne dane są świeżo buforowane. Brak fizycznych poszukiwań == SZYBKO.
Marcin
2

Jeśli potrzebujesz tylko znać rozmiar katalogu, możesz go znacznie przyspieszyć, po prostu unikając zapisywania informacji na ekranie. Ponieważ suma całkowita jest ostatnim wierszem dupolecenia, możesz po prostu potokować ją tail.

du -hc | tail -n 1

Struktura katalogów o pojemności 2 GB zajmuje sekundę dla pełnego wpisu, ale mniej niż 5 tego w tym formularzu.

Szczery
źródło
2
Myślę, że du -hsjest to wygodniejsze w tym celu.
lepe
także--max-depth 1
stevesliva