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?
Odpowiedzi:
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.
źródło
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
źródło
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.
źródło
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.
źródło
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.
źródło
Pomocne może być użycie tune2fs do włączenia dir_index. Aby sprawdzić, czy jest włączony:
Jeśli nie jest włączony:
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.
źródło
/dev/sad1
celowe zapobieganie błędowi kopiowania / makaronu?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.
źródło
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
źródło
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.
źródło
Nie określiłeś rodzaju danych w tych plikach. Ale z jego brzmienia powinieneś używać jakiejś bazy danych z indeksowaniem do szybkiego wyszukiwania.
źródło
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ć.
źródło