Jak skonfigurować Linuksa do buforowania metadanych plików zamiast zawartości?

14

Chciałbym skonfigurować system tak, aby używał większości pamięci RAM do buforowania metadanych systemu plików, ale tylko stosunkowo niewielką ilość do buforowania odczytu / zapisu i pobierania plików. Idealnie chciałbym móc przeglądać system plików (tyle ile mieści się w pamięci RAM) bez rozpinania dysków, dopóki nie otworzę pliku.

Oto szczegóły:

Mam domowy serwer plików. Ma pięć dysków w woluminie LVM około 9 TB, ale tylko 4 GB pamięci RAM. Ponieważ serwer nie robi nic więcej niż serwowanie plików, większość pamięci RAM jest używana do buforowania. („Bezpłatne” raporty 3,4G z 3,9G używane do pamięci podręcznej).

Serwer mieszka w mojej sypialni, a jeśli wszystkie dyski się obracają, robi wystarczająco dużo hałasu, aby być denerwującym, gdy jest cicho. (Nie mam na myśli szukania hałasu, po prostu wirującego hałasu. Dyski różnych marek i modeli, i myślę, że niewielkie różnice w prędkościach obrotowych powodują zakłócenia. Sam dysk nie jest głośny, ale jeśli niektóre z nich wirują razem, niewielki hałas z okresem poniżej Hertza.) Skonfigurowałem więc serwer, aby przez większość czasu wyłączał dyski.

Oczywiście, jeśli dyski zostaną odwrócone podczas otwierania folderu w menedżerze plików, nastąpi opóźnienie, w zależności od tego, który z dysków ma ten folder. To nie jest wielka sprawa. Ale w zależności od tego, gdzie patrzę, może się to zdarzyć kilka razy z rzędu, jeśli LVM rozłoży metadane dla każdego podfolderu na różnych dyskach.

Podejrzewam, że Linux najczęściej zapełnia swoją pamięć podręczną zawartością plików i prawdopodobnie wstępnie pobranymi danymi. Buforowanie nie jest zbyt przydatne poza kilkoma MB, aby zapewnić płynne odtwarzanie; gdybym tylko obejrzał film, prawdopodobnie nie zobaczę go w najbliższym czasie. Pobieranie wstępne, jeśli tak się stanie, jest również całkowicie bezużyteczne w moim przypadku , po kilku MB.

Ale można by pomyśleć, że 4 GB powinno być wystarczające, aby móc buforować większość metadanych systemu plików, przynajmniej tych części, które już były odwiedzane, abym mógł przeglądać pliki bez konieczności obracania dysków, jeśli okaże się, że są one spanie.

Podczas otwierania pliku nadal występowałoby opóźnienie, ale to w porządku. Porównaj „kliknij; czekaj ; Kliknij; czekaj ; Kliknij; czekaj ; grać; oglądać ”za pomocą„ kliknięcia; Kliknij; Kliknij; grać; czekaj ; zegarek". Ten pierwszy jest niezwykle frustrujący; ten ostatni jest prawie oczekiwany.

Uwagi:

  1. Jeśli to ma znaczenie, jądro to 3.2, system operacyjny to Debian, wolumin to lvm2, a FS to ext4.

  2. Jedynym powodem spowolnienia jest hałas w nocy; w przeciwnym razie serwer działa nieprzerwanie. (Uczyniłem to tak niskim poborem mocy, jak rozsądnym.) Opóźnienie rozłączania jest różne w zależności od pory dnia.

  3. Dyski twarde przeznaczone są wyłącznie do multimediów. System operacyjny znajduje się na osobnym (małym) dysku flash. (Co oznacza, że ​​wszelkie opóźnienia związane z rozpakowywaniem pochodzą z danych, nie tylko dlatego, że potrzebowały czegoś /usrlub czegoś innego. Mógłbym zaoszczędzić na tym kilka GB, jeśli to by pomogło w moim problemie.

  4. Rozsądny wpływ na wydajność nie jest wielkim problemem. Dyski i tak są szybsze niż moja sieć.

bogdanb
źródło

Odpowiedzi:

10

Aby kontrolować sposób, w jaki Linux buforuje różne rzeczy, zapoznaj się z tym https://www.kernel.org/doc/Documentation/sysctl/vm.txt

W szczególności spójrz na vfs_cache_pressure, prawdopodobnie chcesz naprawdę niskiej wartości, a może nawet zero (choć dla mnie brzmi to trochę bezpieczniej):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Możesz także chcieć zmodyfikować swappiness, aby nigdy nie zamieniać danych lub sprawić, że dzieje się tak tylko w skrajnych przypadkach.

Ta drop_cachesopcja może być przydatna do jawnego usuwania danych, których nie chcesz już buforować.

Jestem pewien, że są prawdopodobnie inne opcje, które mogą pomóc, więc przejrzyj dokumentację jądra.

Aby je zastosować, umieściłbym ustawienia, które chcesz zmienić /etc/sysctl.conflub cokolwiek twój system operacyjny musi je przywrócić podczas uruchamiania.

Kyle
źródło
3
Dobry post, ale chciałbyś tyle zamiany, ile to możliwe, biorąc pod uwagę cel PO. Zamiana tylko uderza w pamięć użytkownika, zwiększając tym samym tendencję do zamiany na dysk, a następnie pozostawiając więcej pamięci fizycznej dla pamięci podręcznych. Zwiększenie swapiness uwalnia pamięć, ale może spowolnić aplikacje, jeśli zostanie ona zbytnio zwiększona (określenie
ulubionego
Cześć Kyle, dzięki za pomysł. vfs_cache_pressure działa, ale to nie wystarczy. Oto co zrobiłem:
bogdanb
Kiedy ustawię vcp na 0, jeśli to zrobię find / -ls > /dev/null, to rozkręcę dyski, a następnie findwszystkie pliki ponownie, dyski się nie rozkręcają. freepokazuje przy tym zwiększenie buforów do około 202 MB. Ale, gdybym zrobić find, następnie cat /file/bigger/than/ram > /dev/null, potem freepokazuje cachedrosnące wypełnić pustą przestrzeń, iz jakiegoś powodu buffersspada do około 195MB. Potem, jeśli find
odwiruję
About swappiness: Domyślnie jest ustawiony 60, ale maszyna nie ma partycji wymiany, więc nie jestem pewien, czy robi dużo. Chyba mógłbym umieścić plik wymiany na dysku flash, ale nie mam pojęcia, jak to pomogłoby ani jak go zmienić.
bogdanb
1
Linux stara się być mądry w kwestii buforowania. Nie jestem pewien, czy ustawienie vfs = 0 będzie działało zgodnie z oczekiwaniami. Myślę, że próbowałby odzyskać te inne wpisy, gdy presja aplikacji (tj. Malloc ()) zażąda więcej pamięci. Jeśli chodzi o sposób na poinformowanie Linuksa, aby nie używał więcej niż 2 GB pamięci podręcznej, nie jestem tego świadomy. W większości przypadków marnowałoby pamięć RAM. Inną rzeczą, na którą możesz chcieć spojrzeć, jest „tryb laptopa”, który próbuje robić różne rzeczy, aby dyski były obracane w dół dla laptopów. Jednak go nie użyłem, więc niewiele o nim wiem.
Kyle