Zgodnie z tym artykułem na Facebooku Haystack:
„ Ze względu na sposób, w jaki urządzenia NAS zarządzają metadanymi katalogu, umieszczenie tysięcy plików w katalogu było wyjątkowo nieefektywne, ponieważ mapa blokowa katalogu była zbyt duża, aby urządzenie mogło ją skutecznie buforować. W związku z tym często konieczne było wykonanie ponad 10 operacji dyskowych w celu pobrania pojedynczy obraz Po zmniejszeniu rozmiarów katalogów do setek obrazów na katalog wynikowy system nadal generalnie wymagałby 3 operacji dyskowych w celu pobrania obrazu: jeden w celu odczytania metadanych katalogu do pamięci, drugi w celu załadowania i-węzła do pamięci oraz trzeci czytać zawartość pliku. ”
Zakładałem, że metadane i i-węzeł katalogu systemu plików zawsze będą buforowane w pamięci RAM przez system operacyjny, a odczyt pliku zwykle wymaga tylko 1 dysku IO.
Czy ten problem „wielu dysków IO do odczytu jednego pliku” opisany w tym dokumencie jest unikalny dla urządzeń NAS, czy też Linux ma ten sam problem?
Planuję uruchomić serwer Linux do wyświetlania obrazów. W jaki sposób mogę zminimalizować liczbę operacji We / Wy dysku - idealnie upewniając się, że system operacyjny buforuje wszystkie dane katalogu i i-węzłów w pamięci RAM, a każdy odczyt pliku wymagałby nie więcej niż 1 operacji We / Wy dysku?
źródło
mke2fs -b 32768
aby ustawić 32k. Jest to jednak przydatne tylko wtedy, gdy nie masz małych plików w tym systemie plików.Odpowiedzi:
Linux ma ten sam „problem”. Oto artykuł mojego studenta opublikowany dwa lata temu, którego efekt pokazano w systemie Linux. Wiele IO może pochodzić z kilku źródeł:
W normalnym wzorcu We / Wy buforowanie jest naprawdę skuteczne, a i-węzły, katalogi i bloki danych są przydzielane w sposób, który ogranicza wyszukiwanie. Jednak normalna metoda wyszukiwania, która jest współdzielona przez wszystkie systemy plików, jest niekorzystna dla wysoce losowego ruchu.
Oto kilka pomysłów:
1) Pomagają pamięci podręczne związane z systemem plików. Duża pamięć podręczna pochłonie większość odczytów. Jeśli jednak chcesz umieścić kilka dysków w komputerze, stosunek Dysku do pamięci RAM ogranicza ilość pamięci podręcznej.
2) Nie używaj milionów małych plików. Agreguj je do większych plików i przechowuj nazwę pliku i przesunięcie w pliku.
3) Umieść lub buforuj metadane na dysku SSD.
4) I oczywiście użyj systemu plików, który nie ma całkowicie anarchicznego formatu katalogu na dysku. Readdir nie powinien zająć więcej niż czas liniowy, a bezpośredni dostęp do pliku idealnie po prostu czas logarytmiczny.
Utrzymywanie niewielkich katalogów (mniej niż 1000) nie powinno tak bardzo pomóc, ponieważ potrzebujesz więcej katalogów z potrzebą buforowania.
źródło
Zależy to od systemu plików, którego zamierzasz używać. Przed odczytem systemu danych pliku:
Jeśli folder zawiera ogromną liczbę plików, jest to duże zabezpieczenie pamięci podręcznej.
źródło
open()
te wykonywane przezread()
. Strona win.tue.nl/~aeb/linux/vfs/trail.html przedstawia miłą analizę różnych koncepcji jądra. (Może to jest przestarzałe? Nie byłbym w stanie powiedzieć.)Prawdopodobnie nie będziesz w stanie zachować całego katalogu i danych i-węzłów w pamięci RAM, ponieważ prawdopodobnie masz więcej danych katalogu i i-węzłów niż w pamięci RAM. Ty też możesz tego nie chcieć, ponieważ ta pamięć RAM może być lepiej wykorzystana do innych celów; w twoim przykładzie obrazu, czy nie wolałbyś, aby dane często uzyskiwanego obrazu były buforowane w pamięci RAM, niż pozycja katalogu dla rzadko uzyskiwanego obrazu?
To powiedziawszy, myślę, że pokrętło vfs_cache_pressure służy do kontrolowania tego. „Gdy vfs_cache_pressure = 0, jądro nigdy nie odzyska dentrów i i-węzłów z powodu presji pamięci i może to łatwo doprowadzić do stanów braku pamięci.”
źródło