Buforowanie / wstępne ładowanie plików w systemie Linux do pamięci RAM

74

Mam dość stary serwer, który ma 4 GB pamięci RAM i przez cały dzień obsługuje te same pliki, ale robi to z dysku twardego, podczas gdy 3 GB pamięci RAM jest „wolne”.

Każdy, kto kiedykolwiek próbował uruchomić napęd RAM, może zobaczyć, że jest niesamowity pod względem prędkości. Zużycie pamięci przez ten system zwykle nie przekracza 1 GB / 4 GB, więc chcę wiedzieć, czy istnieje sposób na wykorzystanie tej dodatkowej pamięci do czegoś dobrego.

  • Czy można powiedzieć systemowi plików, aby zawsze obsługiwał określone pliki poza pamięcią RAM?
  • Czy są jakieś inne metody, których można użyć do poprawy możliwości odczytu plików przy użyciu pamięci RAM?

Mówiąc dokładniej, nie szukam tutaj „hacka”. Chcę, aby wywołania systemu plików obsługiwały pliki z pamięci RAM bez potrzeby tworzenia napędu RAM i kopiowania tam plików ręcznie. A przynajmniej skrypt, który to dla mnie robi.

Możliwe zastosowania to:

  • Serwery WWW z plikami statycznymi, które są odczytywane dużo
  • Serwery aplikacji z dużymi bibliotekami
  • Komputery stacjonarne ze zbyt dużą pamięcią RAM

Jakieś pomysły?

Edytować:

  • Znalazłem to bardzo pouczające: pamięć podręczna stron Linux i pdflush
  • Jak zauważył Zan, pamięć nie jest tak naprawdę wolna. Mam na myśli to, że nie są używane przez aplikacje i chcę kontrolować, co powinno być buforowane w pamięci.
Andrioid
źródło
1
Ja też szukam czegoś w tym stylu. Nie wydaje mi się, aby ogólne buforowanie bloków dysków systemu plików było odpowiedzią. Załóżmy, że chcę, aby blok dysku X zawsze był buforowany. Coś uzyskuje do niego dostęp, a jądro buforuje je. Jak dotąd tak dobrze, ale następny proces chce bloku Y, więc jądro odrzuca mój blok X i zamiast tego buforuje Y. Następny proces, który chce X będzie musiał poczekać, aż wyjdzie z dysku; tego chcę uniknąć. Chciałbym (i myślę, że po to też jest oryginalny plakat) to nałożenie pamięci podręcznej zapisu na system plików, który zagwarantuje, że pliki będą zawsze
1
Biorąc pod uwagę, że wydaje się, że istnieje konsensus, że Linux powinien już buforować często używane pliki, zastanawiam się, czy rzeczywiście udało się wprowadzić jakieś ulepszenia, korzystając z porad tutaj. Wydaje mi się, że próba ręcznego sterowania buforowaniem może być przydatna do rozgrzania pamięci podręcznej, ale że przy opisanym wzorcu użytkowania („serwowanie tych samych plików przez cały dzień”) nie pomogłoby to już rozgrzanemu serwerowi dużo, jeśli w ogóle.
Nate CK,
Mówisz, że nie szukasz hacka, ale Linux już domyślnie robi to, co chcesz. Następujące równanie: „serwowanie tych samych plików przez cały dzień” + ”mówi systemowi plików, aby zawsze obsługiwał określone pliki poza pamięcią RAM,„ z definicji oznacza „hack”. Czy rzeczywiście zauważyłeś poprawę wydajności? Z mojego doświadczenia wynika, że ​​pamięć podręczna Linuksa jest odczytem z twojego systemu plików.
Mike S
2
Dla wyjaśnienia, linux robi pamięć podręczną plików, ale metadane są sprawdzane dla każdego pliku dla każdego żądania. Podczas wirowania rdzy na zajętym serwerze sieciowym z dużą ilością małych plików, które mogą nadal powodować rywalizację IO i przedwczesne zużycie dysków. Treść statyczna i skrypty mogą być rsync w / dev / shm lub niestandardowym montowaniem tmpfs podczas uruchamiania aplikacji. Robiłem to przez kilka dekad, a moje dyski nie zużywają się przedwcześnie. Również moje strony znacznie lepiej radzą sobie z ładowaniem dużych serii. Pomaga to w każdej dziedzinie, od najdroższego sprzętu dla przedsiębiorstw po sprzęt powszechnego użytku.
Aaron,

Odpowiedzi:

57

vmtouch wydaje się dobrym narzędziem do pracy.

Najważniejsze:

  • zapytać, ile części katalogu jest buforowane
  • zapytaj, ile plików jest buforowanych (także które strony, reprezentacja graficzna)
  • załaduj plik do pamięci podręcznej
  • usuń plik z pamięci podręcznej
  • blokuj pliki w pamięci podręcznej
  • działać jako demon

Instrukcja vmtouch

EDYCJA: Wykorzystanie zadane w pytaniu jest wymienione w przykładzie 5 na vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDYCJA 2: Jak zauważono w komentarzach, dostępne jest teraz repozytorium git .

poszukiwacz
źródło
5
Dla przyszłych przeglądających spróbuj użyć repozytorium git vmtouch zamiast postępować zgodnie z instrukcjami na połączonej stronie. W ten sposób otrzymujesz plik makefile i możesz pobierać aktualizacje.
losowo
Wydaje się, że istnieje ograniczenie rozmiaru pliku (4 GB). Czy jest jakaś inna alternatywa?
Alix Axel
Ok, oto mój rzeczywisty przypadek użycia: RPi1 ze starą kartą SD, gdzieś coś robi. Zanim wyruszę w podróż i wymienię kartę (i ewentualnie zasilacz), chcę, aby system operacyjny oszczędnie dotykał karty, najlepiej nigdy. Pamięć podręczna FS jest dobra, ale poza moją kontrolą; / bin i / sbin są już na tmpfs, podobnie uzyskanie / home / user ma inne wady. vmtouchdobrze pasuje do tej niszy.
Piskvor
w jaki sposób vmtouch działa inaczej niż tmpfs?
Edward Torvalds
26

Jest to również możliwe przy użyciu vmtouch Wirtualna Toucher pamięci narzędzia .

Narzędzie pozwala kontrolować pamięć podręczną systemu plików w systemie Linux. Można wymusić lub zablokować określony plik lub katalog w podsystemie pamięci podręcznej maszyny wirtualnej lub użyć go do sprawdzenia, które części pliku / katalogu znajdują się w maszynie wirtualnej.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Lub...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds
ewwhite
źródło
3
jest to świetne narzędzie i robi dokładnie to, czego zażądał OP. Gdyby tylko zaakceptował to jako odpowiedź.
laebshade
Czy wiesz, czy to działa z ZFS?
CMCDragonkai
1
@CMCDragonkai Nie sądzę, że jest to konieczne w ZFS ... Pomyśl: ARC i L2ARC .
ewwhite
22

Sztuczka biedaka polegająca na wrzuceniu rzeczy do pamięci podręcznej systemu plików polega na tym, że po prostu ją przechwycisz i przekierujesz do / dev / null.

kagenut
źródło
1
Zgodzić się. A jeśli chcesz mieć pewność, że niektóre pliki są buforowane, utwórz zadanie cron, które catokresowo jest plikiem do / dev / null
Josh
18

Linux buforuje tyle pamięci IO dysku w pamięci, ile może. Takie są statystyki pamięci podręcznej i bufora. Prawdopodobnie wykona lepszą pracę niż przechowywanie odpowiednich rzeczy.

Jeśli jednak nalegasz na przechowywanie danych w pamięci, możesz utworzyć napęd RAM za pomocą tmpfs lub ramfs. Różnica polega na tym, że ramfs przydzieli całą pamięć, o którą prosisz, ponieważ tmpfs wykorzysta tylko pamięć używaną przez twoje urządzenie blokowe. Moja pamięć jest trochę zardzewiała, ale powinieneś być w stanie zrobić:

 # mount -t ramfs ram /mnt/ram 

lub

 # mount -t tmpfs tmp /mnt/tmp

a następnie skopiuj swoje dane do katalogu. Oczywiście, kiedy wyłączysz maszynę lub odmontujesz tę partycję, twoje dane zostaną utracone.

David Pashley
źródło
1
Dziękuję za odpowiedź, ale oczywiście tego chcę uniknąć. W przeciwnym razie po prostu skryptuję go, aby komputer utworzył ramdrive, skopiował pliki i dowiązał symbolicznie do napędu ramdrive. Ale moje dane są niespójne. Miałem nadzieję na system plików, w którym mogę „otagować” niektóre pliki, które będą buforowane w pamięci. Ale może jestem trochę zbyt optymistyczny.
Andrioid
3
„Tagujesz” pliki, które mają być buforowane, uzyskując do nich dostęp.
womble
9
Gdyby tylko istniał sposób automatycznego oznaczania najczęściej używanych plików.
David Pashley
4
Cholera, sarkazm nie podróżuje dobrze, robi to :)
David Pashley,
2
Tak dziękuję. Rozumiem pojęcie buforowania we / wy. Wyjaśniłem to nawet w mojej odpowiedzi. Wygląda na to, że nie przeczytałeś subtelnego komentarza, że ​​to był sarkazm.
David Pashley
18

Po obszernym przeczytaniu na temat zamiany jądra 2.6 i funkcji buforowania stron znalazłem „narzędzia fcoretools”. Który składa się z dwóch narzędzi;

  • fincore: pokaże, ile stron aplikacja zapisała w pamięci podstawowej
  • fadvise: Umożliwia manipulowanie pamięcią podstawową (cache strony).

(Jeśli ktoś inny uzna to za interesujące, zamieszczam to tutaj)

Andrioid
źródło
1
Uznałem, że istnieje jakiś program, który mógłby to zrobić. +1
Brad Gilbert
7

Istnieją dwa ustawienia jądra, które mogą znacznie pomóc nawet bez użycia innych narzędzi:

zamiana

informuje jądro Linuksa, jak agresywnie powinien używać swap. Cytując artykuł w Wikipedii:

Swappiness to właściwość jądra systemu Linux, która zmienia równowagę między zamianą pamięci środowiska wykonawczego, a nie usuwanie stron z pamięci podręcznej stron systemowych. Swappiness można ustawić na wartości od 0 do 100 włącznie. Niska wartość oznacza, że ​​jądro będzie starało się unikać zamiany tak bardzo, jak to możliwe, a wyższa wartość spowoduje, że jądro będzie agresywnie próbowało używać przestrzeni wymiany. Domyślną wartością jest 60, a dla większości systemów stacjonarnych ustawienie jej na 100 może wpłynąć na ogólną wydajność, natomiast ustawienie jej na niższą wartość (nawet 0) może poprawić interaktywność (zmniejszając opóźnienie odpowiedzi).

vfs_cache_pressure

Cytowanie z vm.txt :

Kontroluje tendencję jądra do odzyskiwania pamięci używanej do buforowania obiektów katalogów i i-węzłów.

Przy domyślnej wartości vfs_cache_pressure = 100 jądro będzie próbowało odzyskać dentries i i-węzły z „uczciwą” szybkością w odniesieniu do odzyskiwania pagecache i swapcache. Zmniejszenie vfs_cache_pressure powoduje, że jądro woli zachować pamięć podręczną dentysty i i-węzła. ...


Ustawiając swappinesswysoką wartość (np. 100), jądro przenosi wszystko, czego nie trzeba zamieniać, zwalniając pamięć RAM do buforowania plików. A poprzez ustawienie vfs_cache_pressureniższej (powiedzmy na 50, a nie na 0!), Faworyzuje buforowanie plików zamiast przechowywania danych aplikacji w pamięci RAM.

(Pracuję nad dużym projektem Java i za każdym razem, gdy go uruchamiam, wymagało to dużo pamięci RAM i opróżniłem pamięć podręczną dysku, więc przy następnym kompilowaniu projektu wszystko zostało ponownie odczytane z dysku. Dostosowując te dwa ustawienia, zarządzam aby zachować źródła i skompilowane dane w pamięci podręcznej w pamięci RAM, co znacznie przyspiesza proces).

Petr Pudlák
źródło
3

Bardzo wątpię, czy faktycznie obsługuje pliki z dysku z 3 GB wolnej pamięci RAM. Buforowanie plików systemu Linux jest bardzo dobre.

Jeśli widzisz dyskowe operacje we / wy, zajrzałbym do twoich konfiguracji rejestrowania. Wiele dzienników jest ustawianych jako niebuforowanych, aby zagwarantować dostępność najnowszych informacji dziennika w razie awarii. W systemach, które muszą być szybkie niezależnie od tego, używaj buforowanego dziennika operacji we / wy lub zdalnego serwera dziennika.

Zan Lynx
źródło
Właśnie tak, chcę tylko kontrolować, co jest buforowane.
Andrioid
3

Jeśli masz dużo pamięci, możesz po prostu wczytać pliki, które chcesz buforować za pomocą cat lub podobnego. Linux wykona dobrą robotę, utrzymując go przy sobie.

Thorbjørn Ravn Andersen
źródło
3

Możesz mieć program, który po prostu mmaps twoje pliki, a następnie nadal działa.

Brad Gilbert
źródło
3
O ile mi wiadomo, to właściwie to, co robi „fadto” (fcoretools).
Andrioid
0

Istnieją różne systemy ramfs, z których możesz korzystać (np. Ramfs, tmpfs), ale ogólnie, jeśli pliki są tak często odczytywane, to znajdują się w pamięci podręcznej systemu plików. Jeśli twój roboczy zestaw plików jest większy niż twój darmowy RAM, pliki zostaną z niego usunięte - ale jeśli twój roboczy zestaw jest większy niż twój darmowy RAM, nie ma możliwości, abyś zmieścił to wszystko w ramdysku.

Sprawdź dane wyjściowe polecenia „free” w powłoce - wartość w ostatniej kolumnie pod „Cached” określa, ile wolnej pamięci RAM zużywa pamięć podręczna systemu plików.

Daniel Lawson
źródło
0

Jeśli chodzi o twoje ostatnie pytanie, upewnij się, że pamięć RAM znajduje się w różnych kanałach pamięci, aby procesor mógł pobierać dane równolegle.

sybreon
źródło
0

Myślę, że można to lepiej rozwiązać na poziomie aplikacji. Na przykład są do tego prawdopodobnie wyspecjalizowane serwery sieciowe lub możesz rozważyć mod_cache z Apache. Jeśli masz konkretny cel, np. Szybsze udostępnianie treści internetowych, możesz uzyskać ulepszenia z tego rodzaju rzeczy.

Ale twoje pytanie ma charakter ogólny, podsystem pamięci Linux został zaprojektowany w celu zapewnienia najlepszego ogólnego wykorzystania pamięci RAM. Jeśli chcesz kierować reklamy na określone typy wydajności, zastanów się nad sprawdzeniem wszystkiego w / proc / sys / vm.

Pakiet fcoretools jest interesujący, zainteresowałbym się wszelkimi artykułami na temat jego aplikacji ... Ten link mówi o rzeczywistych wywołaniach systemowych używanych w aplikacji.

Kyle Brandt
źródło
1
find / var / lib / mysql | xargs fadvise -willneed (brudne, ale powinna zapewnić szybszy dostęp do plików bazy danych; jako przykład)
Andrioid
Bardzo dobry hack, ale taki hack nie wyłącza wielu oczekujących fsyncs z mysql :( fsyncs są potrzebne do zapewnienia ACID (Atomowość, Spójność, Izolacja, Trwałość).
osgx
0

Komputery stacjonarne (np. Ubuntu) już korzystają z plików wstępnego ładowania (przynajmniej popularnych bibliotek współdzielonych) do pamięci podczas uruchamiania. Służy do przyspieszenia uruchamiania i uruchamiania różnych programów typu bloarware, takich jak FF, OO, KDE i GNOME (z ewolucją programu typu bloat-mailer).

Narzędzie nazywa się readahead http://packages.ubuntu.com/dapper/admin/readahead

Istnieje również odpowiednie wywołanie systemowe: readahead (2) http://linux.die.net/man/2/readahead

Istnieje również projekt demona wstępnego ładowania: http://linux.die.net/man/8/preload

osgx
źródło
0

http://www.coker.com.au/memlockd/ robi to

chociaż tak naprawdę nie jest to potrzebne, Linux wykona całkiem niezłą robotę buforując pliki, których używasz samodzielnie.

Justin
źródło
0

właśnie próbowałem dd if = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

nie daje mi kontroli, której pragniesz, ale przynajmniej próbuje wykorzystać zmarnowaną pamięć


źródło
0

Używam find / -name stringofrandomcharacter to pomaga dużo

użytkownik50472
źródło
0

Nie do końca o to pytano, ale używam

znajdź BASE_DIRECTORY -typ f -exec cat {}> / dev / null \;

aby uruchomić inicjalizację plików w woluminie AWS utworzonym z migawki. Jest bardziej skoncentrowany niż oficjalne zalecenie używania dd, jeśli chcesz po prostu przeczytać niektóre pliki.

Federico
źródło
-1

Czasami mogę chcieć buforować pliki w określonym folderze i jego podfolderach. Po prostu przechodzę do tego folderu i wykonuję następujące czynności:

odnaleźć . -exec cp {} / dev / null \;

Te pliki są buforowane

Highstaker
źródło