Linux: ile dyskowych operacji we / wy zajmuje odczyt pliku? Jak to zminimalizować? [duplikować]

10

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?

użytkownik9517
źródło
1
Nie jest to odpowiedź na pytanie, ale zawsze możesz użyć Lakieru (używa go Facebook), które utrzymują pliki w pamięci. W ten sposób, jeśli jeden obraz się nagrzeje (dużo żądań do tego samego pliku), IO dysku nie będzie w ogóle używany do obsługi go
Darhazer - Varnish nie pomógłby tutaj, ponieważ pamięć podręczna plików systemu Linux (na której opiera się Varnish) już buforuje gorące pliki w pamięci. Umieszczenie lakieru przed Nginxem do statycznego udostępniania plików tak naprawdę niczego nie dodaje. Moje pytanie dotyczy tego, kiedy pliki są zbyt duże / zbyt wiele, aby można je było buforować w pamięci. Nadal chcę się upewnić, że przynajmniej dane katalogu i i-węzły są buforowane, aby zredukować IO dysku do zaledwie 1 na odczyt.
Wiele systemów plików przechowuje i-węzeł w katalogu, zmniejszając liczbę żądań o jeden i znacznie zwiększając ryzyko trafienia w pamięć podręczną. Ale to nie jest pytanie programistyczne.
Ben Voigt,
Możesz zmienić rozmiar bloku systemu plików podczas jego tworzenia, na przykład mke2fs -b 32768aby ustawić 32k. Jest to jednak przydatne tylko wtedy, gdy nie masz małych plików w tym systemie plików.

Odpowiedzi:

5

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ł:

  • Wyszukiwanie katalogów na każdym poziomie katalogu ścieżki do pliku. Konieczne może być odczytanie i-węzła katalogu i jednego lub więcej bloków wpisów katalogu
  • I-węzeł pliku

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.

dmeister
źródło
I oczywiście używaj systemu plików, który nie ma całkowicie archaicznego 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.
jørgensen
Dodałem to do odpowiedzi jako czwarty punkt
dmeister
@dmeister Dobre rzeczy. +1
Magellan,
@dmeister Twój link nie działa.
Don Scott
1

Zależy to od systemu plików, którego zamierzasz używać. Przed odczytem systemu danych pliku:

  • Przeczytaj plik katalogu.
  • Przeczytaj i-węzeł pliku
  • Czytaj sektory pliku

Jeśli folder zawiera ogromną liczbę plików, jest to duże zabezpieczenie pamięci podręcznej.


źródło
Jeśli wymieniasz dostępy we / wy, może być bardziej interesujące oddzielić open()te wykonywane przez read(). 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ć.)
ADL
0

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.”

Samuel Edwin Ward
źródło