Jakie są konsekwencje wydajności dla milionów plików w nowoczesnym systemie plików?

30

Powiedzmy, że używamy ext4 (z włączonym dir_index) do hostowania około 3M plików (o średnim rozmiarze 750 KB) i musimy zdecydować, jakiego schematu folderów będziemy używać.

W pierwszym rozwiązaniu stosujemy funkcję skrótu do pliku i używamy folderu dwupoziomowego (1 znak dla pierwszego poziomu i 2 znaki do drugiego poziomu): dlatego, że filex.forskrót jest równy abcde1234 , będziemy przechowywać go na / path / a / bc /abcde1234-filex.for.

W drugim rozwiązaniu stosujemy funkcję skrótu do pliku i używamy folderu dwóch poziomów (2 znaki dla pierwszego poziomu i 2 znaki dla drugiego poziomu): dlatego, że filex.forskrót jest równy abcde1234 , będziemy przechowywać go na / path / ab / de /abcde1234-filex.for.

W przypadku pierwszego rozwiązania mamy następujący schemat /path/[16 folders]/[256 folders]ze średnią 732 plików na folder (ostatni folder, w którym plik będzie się znajdować).

Podczas gdy na drugim rozwiązaniu będziemy mieli /path/[256 folders]/[256 folders]ze związkiem średnio 45 plików w folderze .

Biorąc pod uwagę, że zamierzamy zapisywać / rozłączać / czytać pliki ( ale głównie czytać ) z tego schematu (zasadniczo system buforowania nginx), czy ma to znaczenie pod względem wydajności, jeśli wybraliśmy jedno lub drugie rozwiązanie?

Jakich narzędzi możemy użyć do sprawdzenia / przetestowania tej konfiguracji?

Leandro Moreira
źródło
7
Oczywiście pomocne będą testy porównawcze. Ale ext4 może być do tego nieodpowiednim systemem plików. Patrzyłbym na XFS.
ewwhite,
4
Nie patrzyłbym tylko na XFS, od razu używałbym go bez zbędnych ceregieli. Drzewo B + bije tabelę skrótów za każdym razem.
Michael Hampton
Dzięki za wskazówki, testy porównawcze są trochę trudne, starałem się, hdparm -Tt /dev/hdXale może nie być to najbardziej odpowiednie narzędzie.
leandro moreira,
2
Nie, hdparmnie jest właściwym narzędziem, jest to sprawdzenie surowej wydajności urządzenia blokowego, a nie test systemu plików.
HBruijn,

Odpowiedzi:

28

Powodem utworzenia takiej struktury katalogów jest to, że systemy plików muszą zlokalizować plik w katalogu, a im większy katalog, tym wolniej działa.

O ile wolniej zależy od projektu systemu plików.

System plików ext4 używa B-drzewa do przechowywania pozycji katalogu. Oczekuje się, że sprawdzenie tej tabeli zajmie czas O (log n) , który przez większość czasu jest krótszy niż naiwna liniowa tabela używana przez ext3 i poprzednie systemy plików (a gdy nie jest, katalog jest zbyt mały, aby mógł naprawdę ważne).

System plików XFS używa zamiast tego drzewa B + . Zaletą tego nad tabelą skrótów lub drzewkiem B jest to, że dowolny węzeł może mieć wiele potomków b , gdzie w XFS b jest różny i może wynosić nawet 254 (lub 19 w przypadku węzła głównego; liczby te mogą być nieaktualne ). Daje to złożoność czasową O (log b n) , ogromną poprawę.

Każdy z tych systemów plików może obsłużyć dziesiątki tysięcy plików w jednym katalogu, przy czym XFS jest znacznie szybszy niż ext4 w katalogu z taką samą liczbą i-węzłów. Ale prawdopodobnie nie chcesz jednego katalogu z i-węzłami 3M, ponieważ nawet w przypadku drzewa B + wyszukiwanie może zająć trochę czasu. To właśnie doprowadziło do utworzenia katalogów w ten sposób.

Jeśli chodzi o proponowane struktury, pierwszą podaną opcją jest dokładnie to, co pokazano w przykładach nginx. Będzie działał dobrze na każdym systemie plików, choć XFS nadal będzie miał pewną przewagę. Druga opcja może działać nieco lepiej lub nieco gorzej, ale prawdopodobnie będzie całkiem blisko, nawet w testach porównawczych.

Michael Hampton
źródło
A w przypadku XFS lub ext4 sprzęt, na którym system plików będzie miał ogromny wpływ na wydajność. Wolny dysk SATA o prędkości 5400 obr./min może wykonać około 50 losowych operacji IO / s, dobry dysk SAS o prędkości 15000 obr./min może wykonać kilkaset, a dysk SSD prawdopodobnie będzie miał ograniczoną przepustowość i może uzyskać kilka milionów losowych operacji IO / s Jeśli nie więcej.
Andrew Henle,
1
Ściśle mówiąc, $ O (\ log_b n) $ dla ustalonego $ b $ ma taką samą złożoność jak $ O (\ log n) $. Ale dla OP rzeczywiste stałe będą miały znaczenie.
Hagen von Eitzen,
O ile coś jest nie tak z moim systemem plików, ext4 nie może obsłużyć 10 000 plików w jednym katalogu. Wykonanie prostego ls -lzajmuje całą minutę, jeśli katalog spadł z bufora i-węzłów. A kiedy jest buforowany, nadal zajmuje sekundę. Jest to z dyskiem SSD i Xeon z tonami pamięci RAM na dość niskim serwerze ruchu sieciowego.
Abhi Beckert,
@AbhiBeckert Czy został zaktualizowany z ext3? Jeśli tak, spróbuj utworzyć nowy katalog i przenieś do niego pliki.
Michael Hampton
@Hampton Nie. To (dość) niedawno skonfigurowany serwer na nowoczesnym sprzęcie. Pracuję nad tym problemem z naszym sysadmin / centrum danych od kilku miesięcy. Płacimy tysiące dolarów miesięcznie za dzierżawę serwera i nie osiągamy z niego zadowalającej wydajności. Wygląda na to, że jedyną opcją jest przejście do nowej struktury katalogów - być może przy użyciu skrótów zamiast dat dla nazw plików, aby rozłożyć go bardziej równomiernie.
Abhi Beckert
5

Z mojego doświadczenia wynika, że ​​jednym z czynników skalujących jest rozmiar i-węzłów, dla których zastosowano strategię partycjonowania nazw skrótów.

Obie proponowane opcje tworzą maksymalnie trzy wpisy i-węzłów dla każdego utworzonego pliku. Ponadto pliki 732 utworzą i-węzeł, który jest nadal mniejszy niż zwykle 16 KB. Dla mnie oznacza to, że każda z opcji będzie działać tak samo.

Oklaskuję cię za twój krótki hasz; poprzednie systemy, nad którymi pracowałem, pobierały sumę podanego pliku i splicowały katalogi na podstawie tego ciągu, co jest znacznie trudniejszym problemem.

sysadmin1138
źródło
1
Co sprawia, że ​​użycie sum SHA1 (i innych dłuższych sum skrótu) jest „o wiele trudniejszym problemem”? To jest nieporęczne dla użytkowników, tak, ale to samo dotyczy systemu operacyjnego, systemu plików i innych programów.
kbolino
4

Z pewnością każda z tych opcji pomoże zredukować liczbę plików w katalogu do czegoś, co wydaje się rozsądne, dla XFS, Ext4 lub innego systemu plików. Nie jest oczywiste, co jest lepsze, musiałbym przetestować, aby powiedzieć.

Benchmark z aplikacją symulującą coś takiego jak rzeczywiste obciążenie pracą jest idealny. W przeciwnym razie wymyśl coś, co symuluje wiele małych plików. Mówiąc o tym, oto open source o nazwie smallfile . Jego dokumentacja odwołuje się do innych narzędzi.

hdparmrobienie trwałych operacji we / wy nie jest tak przydatne. Nie pokaże wielu małych I / O lub gigantycznych pozycji katalogu związanych z bardzo wieloma plikami.

John Mahowald
źródło
1

Jednym z problemów jest sposób skanowania folderu.

Wyobraź sobie metodę Java, która uruchamia skanowanie folderu.

Będzie musiał przydzielić dużą ilość pamięci i zwolnić ją w krótkim czasie, co jest bardzo ciężkie dla JVM.

Najlepszym sposobem jest uporządkowanie struktury folderów tak, aby każdy plik znajdował się w dedykowanym folderze, np. Rok / miesiąc / dzień.

Sposób pełnego skanowania polega na tym, że dla każdego folderu jest jedno uruchomienie funkcji, więc JVM wyjdzie z funkcji, zwolni pamięć RAM i uruchomi ją ponownie w innym folderze.

To tylko przykład, ale posiadanie tak ogromnego folderu nie ma sensu.

Andrew Smith
źródło
2
Zakładasz Javę i skanujesz folder. Żaden z nich nie jest wspomniany w pytaniu, a istnieją inne sposoby przetwarzania folderu w Javie oprócz skanowania.
user207421,
1

Mam ten sam problem. Próba przechowywania milionów plików na serwerze Ubuntu w ext4. Skończyłem uruchamiać własne testy porównawcze. Okazało się, że płaski katalog działa znacznie lepiej, a jednocześnie jest o wiele prostszy w użyciu:

reper

Napisał artykuł .

Hartator
źródło
To zdecydowanie nie jest oczekiwany wynik. Zanim przejdziesz do tego lub polecisz go, powinieneś głębiej zastanowić się, dlaczego uzyskałeś ten nieoczekiwany wynik.
Michael Hampton