System plików duża liczba plików w jednym katalogu

29

OK, nie tak duże, ale muszę użyć czegoś, w którym około 60 000 plików o średniej wielkości 30 kb jest przechowywanych w jednym katalogu (jest to wymóg, więc nie można po prostu włamać się do podkatalogów z mniejszą liczbą plików).

Pliki będą dostępne losowo, ale po utworzeniu nie będzie zapisywanych do tego samego systemu plików. Obecnie używam Ext3, ale uważam, że jest bardzo powolny. Jakieś sugestie?

bugmenot77
źródło
3
Dlaczego muszą znajdować się w jednym katalogu?
Kyle Brandt,
1
Interesuje mnie również aktualna odpowiedź na oryginalne pytanie, zważywszy na wystarczającą poprawę w XFS i Ext4.

Odpowiedzi:

15

Powinieneś rozważyć XFS. Obsługuje bardzo dużą liczbę plików zarówno na poziomie systemu plików, jak i na poziomie katalogu, a wydajność pozostaje względnie stała nawet przy dużej liczbie wpisów ze względu na struktury danych drzewa B +.

Na ich wiki znajduje się strona z dużą liczbą artykułów i publikacji opisujących projekt. Polecam spróbować i porównać go z obecnym rozwiązaniem.

Kamil Kisiel
źródło
zgodnie ze slajdami w odpowiedzi @ nelaar, ext4 byłby lepszy od xfs dla tego zadania.
mulllhausen
13

Miliard plików w systemie Linux

Autor tego artykułu zagłębia się w niektóre problemy z wydajnością w systemach plików z dużą liczbą plików i dokonuje kilku przyjemnych porównań wydajności różnych systemów plików ext3, ext4 i XFS. Udostępniono to jako pokaz slajdów. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf

czas na uruchomienie mkfs czas na utworzenie plików 1M 50kb Czas naprawy systemu plików usuwanie plików 1m

nelaaro
źródło
2
Naprawdę wolimy, aby odpowiedzi zawierały treść, a nie wskaźniki do treści. Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
user9517 obsługuje GoFundMonica
@Iain Mam nadzieję, że tak jest lepiej, ponieważ samo pobranie pliku PDF dałoby te same informacje.
nelaaro
19
wow, są to wyjątkowo trudne do odczytania wykresy. ~
ThorSummoner
8

Wiele plików w katalogu na ext3 zostało omówionych szczegółowo na stronie siostrzanej stackoverflow.com

Moim zdaniem 60 000 plików w jednym katalogu na ext3 jest dalekie od ideału, ale w zależności od innych wymagań może być wystarczająco dobre.

Ludwig Weinzierl
źródło
5

DOBRZE. Przeprowadziłem wstępne testy przy użyciu ReiserFS, XFS, JFS, Ext3 (włączony dir_hash) i Ext4dev (jądro 2.6.26). Moje pierwsze wrażenie było takie, że wszystkie były wystarczająco szybkie (na mojej rozbudowanej stacji roboczej) - okazuje się, że maszyna do zdalnej produkcji ma dość wolny procesor.

Doświadczyłem trochę dziwności z ReiserFS nawet podczas wstępnych testów, więc to wykluczyłem. Wygląda na to, że JFS ma o 33% mniejsze zapotrzebowanie na procesor niż wszystkie inne i dlatego przetestuje to na zdalnym serwerze. Jeśli działa wystarczająco dobrze, użyję tego.

bugmenot77
źródło
5

Piszę aplikację, która również przechowuje wiele plików, chociaż moje są większe i mam 10 milionów z nich, które podzielę na wiele katalogów.

ext3 działa powoli, głównie z powodu domyślnej implementacji „listy połączonej”. Więc jeśli masz wiele plików w jednym katalogu, oznacza to, że otwieranie lub tworzenie innego będzie coraz wolniejsze. Istnieje coś takiego jak indeks htree, który jest dostępny dla ext3, który podobno znacznie poprawia sytuację. Ale jest dostępny tylko przy tworzeniu systemu plików. Zobacz tutaj: http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

Ponieważ i tak będziesz musiał odbudować system plików, a ze względu na ograniczenia ext3, zalecam, abyś używał ext4 (lub XFS). Myślę, że ext4 jest trochę szybszy z mniejszymi plikami i ma szybsze przebudowy. O ile mi wiadomo, indeks Htree jest domyślny na ext4. Tak naprawdę nie mam żadnego doświadczenia z JFS ani Reiserem, ale słyszałem, że ludzie wcześniej to polecają.

W rzeczywistości prawdopodobnie przetestowałbym kilka systemów plików. Dlaczego nie wypróbować ext4, xfs i jfs i przekonać się, który z nich zapewnia najlepszą ogólną wydajność?

Coś, co powiedział mi deweloper, który może przyspieszyć działanie w kodzie aplikacji, nie polega na wywołaniu „stat + open”, ale raczej na „open + fstat”. Pierwszy jest znacznie wolniejszy niż drugi. Nie jestem pewien, czy masz na to jakąkolwiek kontrolę lub wpływ.

Zobacz mój post tutaj na stackoverflow. Przechowywanie i uzyskiwanie dostępu do 10 milionów plików w systemie Linux zawiera bardzo przydatne odpowiedzi i łącza.

Matt
źródło
3

Pomocne może być użycie tune2fs do włączenia dir_index. Aby sprawdzić, czy jest włączony:

sudo tune2fs -l /dev/sda1 | grep dir_index

Jeśli nie jest włączony:

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

Ale mam wrażenie, że podążasz niewłaściwą ścieżką ... dlaczego nie wygenerować płaskiego indeksu i użyć jakiegoś kodu, aby wybrać losowo na tej podstawie. Następnie można użyć podkatalogów, aby uzyskać bardziej zoptymalizowaną strukturę drzewa.

Kyle Brandt
źródło
1
było /dev/sad1celowe zapobieganie błędowi kopiowania / makaronu?
Anwar
2

ext3 i poniżej obsługują do 32768 plików na katalog. ext4 obsługuje do 65536 rzeczywistej liczby plików, ale pozwoli ci mieć więcej (to po prostu nie zapisze ich w katalogu, co nie ma znaczenia dla większości celów użytkownika).

Ponadto sposób przechowywania katalogów w systemach plików ext * jest zasadniczo jedną dużą listą. W bardziej nowoczesnych systemach plików (Reiser, XFS, JFS) są one przechowywane jako drzewa B, które są znacznie wydajniejsze w przypadku dużych zestawów.

koenigdmj
źródło
2
obsługa takiej liczby plików w katalogu nie jest tym samym, co robienie tego z rozsądną prędkością. nie wiem jeszcze, czy ext4 jest lepszy, ale ext3 znacznie zwalnia, gdy ma więcej niż kilka tysięcy plików w katalogu, nawet przy włączonym dir_index (pomaga, ale nie eliminuje całkowicie problemu).
cas
1

Zamiast nazw plików można przechowywać i-węzły plików: dostęp do numerów i-węzłów powinien być znacznie szybszy niż rozwiązywanie nazw plików

kolypto
źródło
Powiedz mi teraz. Jak otworzyć plik według numeru i-węzła?
Matt
1
@Matt, Wygląda na to, że pytanie zmieniło się po tym, jak odpowiedziałem. Albo byłem o wiele głupszy 1,5 roku temu :)))
kolypto
0

Nie chcesz upychać tylu plików w jednym katalogu, potrzebujesz jakiejś struktury. Nawet jeśli jest to coś tak prostego, jak posiadanie podkatalogów rozpoczynających się od pierwszego znaku pliku, może skrócić czas dostępu. Inną głupią sztuczką, którą lubię, jest wymuszenie na systemie aktualizacji pamięci podręcznej za pomocą metainformacji - regularne uruchamianie updatedb. W jednym oknie uruchom slabtop, w innym uruchom zaktualizowanyb, a zobaczysz, że dużo pamięci zostanie przydzielone do buforowania. W ten sposób jest znacznie szybszy.

Marcin
źródło
-1

Nie określiłeś rodzaju danych w tych plikach. Ale z jego brzmienia powinieneś używać jakiejś bazy danych z indeksowaniem do szybkiego wyszukiwania.

Xeon
źródło
-1

System plików prawdopodobnie nie jest idealnym miejscem do przechowywania takich wymagań. Lepszy jest pewien rodzaj pamięci bazy danych. Mimo to, jeśli nie możesz pomóc, spróbuj podzielić pliki na kilka katalogów i użyć unionfs do zamontowania (powiązania) tych katalogów w jednym katalogu, w którym mają się pojawiać wszystkie pliki. W ogóle nie użyłem tej techniki do przyspieszenia, ale warto spróbować.

Saurabh Barjatiya
źródło