W Linuksie jaka jest różnica między „buforami” a „pamięcią podręczną” zgłaszaną przez polecenie bezpłatne?


73

To stare pytanie, które widziałem od czasu do czasu. Moje rozumienie tego jest raczej ograniczone (czytając o różnicach dawno temu, ale fakt (-y), których to dotyczy, nigdy tak naprawdę nie utknął).

Tak jak rozumiem,

  • Bufory

    Są używane przez programy z aktywnymi operacjami We / Wy, tj. Danymi oczekującymi na zapis na dysk

  • Pamięć podręczna

    Jest wynikiem zakończonych operacji we / wy, tj. Buforów, które zostały opróżnione lub dane zostały odczytane z dysku w celu spełnienia żądania.

Czy mogę uzyskać jasne wyjaśnienie dotyczące potomności?



To bardziej jak metadane, które można znaleźć w buforach, nie jest ono powiązane z buforami io. Niektóre bufory jądra są uwzględniane w alokatorze płyt, ale nie liczą się do buforów ani pamięci podręcznej.
eckes

Odpowiedzi:


42

Suma „buforowana” obejmie również inne przydziały pamięci, takie jak dowolne elementy plików tmpfs. Aby zobaczyć, jak to działa, spróbuj:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

a zobaczysz spadek wartości „pamięci podręcznej” o 100 Mb, który skopiowałeś do systemu plików opartego na pamięci RAM (zakładając, że jest wystarczająca ilość wolnej pamięci RAM, możesz znaleźć jej część w zamianie, jeśli maszyna jest już nadmiernie zaangażowana pod względem wykorzystania pamięci). „Sync; echo 3> / proc / sys / vm / drop_caches” przed każdym wywołaniem free powinno zapisać wszystko oczekujące we wszystkich buforach zapisu (synchronizacja) i wyczyścić wszystkie buforowane / buforowane bloki dysku z pamięci, więc wolny będzie czytał tylko inne alokacje w wartości „buforowanej”.

Pamięć RAM używana przez maszyny wirtualne (takie jak te działające pod VMWare) może być również liczona jako „buforowana” wartość wolna, podobnie jak pamięć RAM używana przez aktualnie otwarte pliki mapowane w pamięci (będzie to różnić się w zależności od używanego hiperwizora / wersji i ewentualnie między wersjami jądra).

Nie jest to więc tak proste, jak: „bufory zliczają oczekujące zapisy plików / sieci oraz zliczane w pamięci podręcznej ostatnio odczytane / zapisane bloki przechowywane w pamięci RAM w celu zapisania przyszłych odczytów fizycznych”, chociaż w większości przypadków wystarczy ten prostszy opis.


1
+1 za interesujące niuanse. Tego rodzaju informacji szukam. Podejrzewam, że liczby są tak skomplikowane, tak zaangażowane w tak wiele różnych działań, że są co najwyżej ogólnymi wskaźnikami.
Avery Payne,

Nie sądzę, aby pamięć RAM używana przez maszyny wirtualne była liczona jako „buforowana”, przynajmniej dla qemu-kvm. Zauważam, że na moim hoście KVM wartość pamięci podręcznej jest nie tylko zbyt mała, aby była poprawna (1,9 Gig), ale nie zmienia się, jeśli zniszczę / uruchomię jedną z moich maszyn wirtualnych. Nie zmienia się również, jeśli wykonam trik montowania tmpfs na jednej z maszyn wirtualnych. Utworzyłem tam partycję tmpfs 800Meg i „buforowane” pokazało prawidłowe wartości na maszynie wirtualnej, ale nie zmieniło się na hoście maszyny wirtualnej. Ale wartość „używana” zmniejszyła się / wzrosła, gdy zniszczyłem / uruchomiłem maszynę wirtualną.
Mike S

... Przeprowadziłem testy na hoście maszyny Wirtualnej Centos 7.2.1511 z jądrem 3.10.0-327.
Mike S

@MikeS: To, jak różne rozwiązania wirtualizacji obsługują pamięć, może się różnić, w rzeczywistości sposób, w jaki jądro mierzy różne sposoby wykorzystania pamięci, może się zmieniać między głównymi wersjami.
David Spillett,

@MikeS: W odniesieniu do „wykonaj trick montowania tmpfs na jednej z maszyn wirtualnych” - I, co nie wpłynie na odczyty hosta, jeśli nie będą pokazywać innych memów używanych przez maszynę wirtualną. Widzę efekt w samej maszynie wirtualnej KVM: przed dd free = 2020, po dd free = 1899, po upuszczeniu fs free = 2001 (różnica 19 Mb będzie spowodowana innymi procesami na VM, nie był bezczynny, kiedy uruchomiłem test). Host może nie zauważyć zmiany: pamięć jest prawdopodobnie nadal przydzielana do maszyny wirtualnej, mimo że jest wolna do wykorzystania przez procesy na maszynie wirtualnej.
David Spillett,


5

Szukałem bardziej przejrzystego opisu bufora i znalazłem w "Professional Linux® Kernel Architecture 2008"

Rozdział 16: Pamięć podręczna stron i buforów

Interakcja

Utworzenie łącza między stronami a buforami nie ma większego sensu, jeśli nie ma korzyści dla innych części jądra. Jak już wspomniano, niektóre operacje przesyłania do i z urządzeń blokowych mogą wymagać wykonania w jednostkach, których rozmiar zależy od wielkości bloku urządzeń bazowych, podczas gdy wiele części jądra woli wykonywać operacje we / wy z ziarnistością strony, ponieważ znacznie ułatwia sprawy - szczególnie w zakresie zarządzania pamięcią. W tym scenariuszu bufory działają jako pośrednicy między dwoma światami.


3

Wyjaśnione przez RedHat :

Strony pamięci podręcznej:

Pamięć podręczna to część pamięci, która w przejrzysty sposób przechowuje dane, dzięki czemu przyszłe żądania dotyczące tych danych mogą być szybciej obsługiwane. Jądro wykorzystuje tę pamięć do buforowania danych na dysku i poprawy wydajności we / wy.

Jądro Linux jest zbudowane w taki sposób, że zużywa tyle pamięci RAM, ile jest w stanie buforować informacje z lokalnych i zdalnych systemów plików i dysków. W miarę upływu czasu w systemie wykonywane są różne odczyty i zapisy, jądro próbuje zachować dane przechowywane w pamięci dla różnych procesów działających w systemie lub dane odpowiednich procesów, które zostaną wykorzystane w najbliższej przyszłości. Pamięć podręczna nie jest odzyskiwana w momencie zatrzymania / wyjścia procesu, jednak gdy inne procesy wymagają więcej pamięci niż wolnej dostępnej pamięci, jądro uruchomi heurystykę w celu odzyskania pamięci poprzez zapisanie danych pamięci podręcznej i przydzielenie tej pamięci do nowego procesu.

Kiedy żądany jest jakikolwiek plik / dane, jądro szuka kopii części pliku, na której działa użytkownik, a jeśli taka kopia nie istnieje, przydzieli jedną nową stronę pamięci podręcznej i wypełni ją odpowiednia zawartość odczytana z dysku.

Dane przechowywane w pamięci podręcznej mogą być wartościami obliczonymi wcześniej lub duplikatami oryginalnych wartości przechowywanych w innym miejscu na dysku. Gdy wymagane są niektóre dane, pamięć podręczna jest najpierw sprawdzana, aby sprawdzić, czy zawiera te dane. Dane można odzyskać szybciej z pamięci podręcznej niż z ich źródła źródłowego.

Segmenty pamięci wspólnej SysV są również rozliczane jako pamięć podręczna, chociaż nie reprezentują żadnych danych na dyskach. Rozmiar segmentów pamięci współużytkowanej można sprawdzić za pomocą polecenia ipcs -m i kolumny bajtów.

Bufory:

Bufory są reprezentacją bloków dyskowych danych przechowywanych w pamięci podręcznej stron. Bufory zawierają metadane plików / danych znajdujących się pod pamięcią podręczną strony. Przykład: Gdy pojawi się żądanie danych znajdujących się w pamięci podręcznej strony, najpierw jądro sprawdza dane w buforach zawierających metadane wskazujące na rzeczywiste pliki / dane zawarte w pamięci podręcznej stron. Gdy z metadanych znany jest rzeczywisty adres bloku pliku, jest on pobierany przez jądro do przetwarzania.


2

Zwalnianie bufora / pamięci podręcznej

Ostrzeżenie Wyjaśnia silną metodę niezalecaną na serwerze produkcyjnym! Więc jesteś ostrzeżony, nie obwiniaj mnie, jeśli coś pójdzie nie tak.

Aby to zrozumieć, możesz zmusić swój system do przekazania jak największej ilości pamięci, cacheniż upuścić buforowany plik:

Preambuła

Przed wykonaniem testu możesz otworzyć kolejne okno:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

do śledzenia ewolucji wymiany w czasie rzeczywistym.

Nota: Musisz zutylizować tyle wolnego miejsca na dysku w bieżącym katalogu, ile masz + swap

Demo
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

Nota, host, na którym to zrobiłem, jest mocno używany. Będzie to miało większe znaczenie na naprawdę cichej maszynie.


1
-1 gdybym mógł. Jest to zarówno (A) nieistotne dla zadanego pytania, jak i (B) okropnie tępy sposób wyzwalania czyszczenia pamięci podręcznej. Istnieją bezpośrednie sposoby na zrobienie tego drugiego, więc nie da się zmusić systemu do podporządkowania się, wysyłając spam do danych, dopóki nie zacznie się ściemniać jako efekt uboczny
underscore_d

O mój Boże! Nigdy nie rób tego nigdy na prawdziwych serwerach!
tamerlaha,

@Tamerlaha Zgadzam się, ale proszę ponownie przeczytać pierwszy akapit: jesteś ostrzeżony, nie obwiniaj mnie ! Celem tego jest pokazanie implikacji bufora / pamięci podręcznej.
F. Hauri
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.