30% pamięci RAM to „bufory”. Co to jest?

13
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           501M        146M         19M        9.7M        335M        331M
Swap:          1.0G         85M        938M

$ free -w -h
              total        used        free      shared     buffers       cache   available
Mem:           501M        146M         19M        9.7M        155M        180M        331M
Swap:          1.0G         85M        938M

Jak mogę opisać lub wyjaśnić „bufory” na wyjściu free?

Nie mam (znanych) problemów z tym systemem. Jestem tylko zaskoczony i ciekawy, że „bufory” są prawie tak wysokie, jak „pamięć podręczna” (155 mln vs. 180 mln). Myślałem, że „pamięć podręczna” reprezentuje pamięć podręczną strony zawartości pliku i zwykle jest najważniejszą częścią „pamięci podręcznej / buforów”. Nie jestem do końca pewien, do czego służą „bufory”.

Na przykład porównałem to do mojego laptopa, który ma więcej pamięci RAM. Na moim laptopie liczba „buforów” jest o rząd wielkości mniejsza niż „pamięć podręczna” (200 MB vs. 4G). Gdybym dobrze zrozumiał, czym są „bufory”, mógłbym zacząć pytać, dlaczego bufory mogą powiększać się do tak większej części w mniejszym systemie.

man proc (Ignoruję zabawnie przestarzałą definicję „dużego”):

Bufory% lu

Względnie tymczasowe miejsce do przechowywania surowych bloków dysku, które nie powinny być bardzo duże (około 20 MB).

Pamięć podręczna% lu

Pamięć podręczna dla plików odczytanych z dysku (pamięć podręczna strony). Nie obejmuje SwapCached.


$ free -V
free from procps-ng 3.3.12
$ uname -r
4.9.0-6-marvell
$ systemd-detect-virt
none

$ cat /proc/meminfo
MemTotal:         513976 kB
MemFree:           20100 kB
MemAvailable:     339304 kB
Buffers:          159220 kB
Cached:           155536 kB
SwapCached:         2420 kB
Active:           215044 kB
Inactive:         216760 kB
Active(anon):      56556 kB
Inactive(anon):    73280 kB
Active(file):     158488 kB
Inactive(file):   143480 kB
Unevictable:       10760 kB
Mlocked:           10760 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         513976 kB
LowFree:           20100 kB
SwapTotal:       1048572 kB
SwapFree:         960532 kB
Dirty:               240 kB
Writeback:             0 kB
AnonPages:        126912 kB
Mapped:            40312 kB
Shmem:              9916 kB
Slab:              37580 kB
SReclaimable:      29036 kB
SUnreclaim:         8544 kB
KernelStack:        1472 kB
PageTables:         3108 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1305560 kB
Committed_AS:    1155244 kB
VmallocTotal:     507904 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB

$ sudo slabtop --once
 Active / Total Objects (% used)    : 186139 / 212611 (87.5%)
 Active / Total Slabs (% used)      : 9115 / 9115 (100.0%)
 Active / Total Caches (% used)     : 66 / 92 (71.7%)
 Active / Total Size (% used)       : 31838.34K / 35031.49K (90.9%)
 Minimum / Average / Maximum Object : 0.02K / 0.16K / 4096.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 59968  57222   0%    0.06K    937       64      3748K buffer_head            
 29010  21923   0%    0.13K    967       30      3868K dentry                 
 24306  23842   0%    0.58K   4051        6     16204K ext4_inode_cache       
 22072  20576   0%    0.03K    178      124       712K kmalloc-32             
 10290   9756   0%    0.09K    245       42       980K kmalloc-96             
  9152   4582   0%    0.06K    143       64       572K kmalloc-node           
  9027   8914   0%    0.08K    177       51       708K kernfs_node_cache      
  7007   3830   0%    0.30K    539       13      2156K radix_tree_node        
  5952   4466   0%    0.03K     48      124       192K jbd2_revoke_record_s   
  5889   5870   0%    0.30K    453       13      1812K inode_cache            
  5705   4479   0%    0.02K     35      163       140K file_lock_ctx          
  3844   3464   0%    0.03K     31      124       124K anon_vma               
  3280   3032   0%    0.25K    205       16       820K kmalloc-256            
  2730   2720   0%    0.10K     70       39       280K btrfs_trans_handle     
  2025   1749   0%    0.16K     81       25       324K filp                   
  1952   1844   0%    0.12K     61       32       244K kmalloc-128            
  1826    532   0%    0.05K     22       83        88K trace_event_file       
  1392   1384   0%    0.33K    116       12       464K proc_inode_cache       
  1067   1050   0%    0.34K     97       11       388K shmem_inode_cache      
   987    768   0%    0.19K     47       21       188K kmalloc-192            
   848    757   0%    0.50K    106        8       424K kmalloc-512            
   450    448   0%    0.38K     45       10       180K ubifs_inode_slab       
   297    200   0%    0.04K      3       99        12K eventpoll_pwq          
   288    288 100%    1.00K     72        4       288K kmalloc-1024           
   288    288 100%    0.22K     16       18        64K mnt_cache              
   287    283   0%    1.05K     41        7       328K idr_layer_cache        
   240      8   0%    0.02K      1      240         4K fscrypt_info           
sourcejedi
źródło
3
linuxatemyram.com jest przydatny do czytania
Basile Starynkevitch 28.04.18

Odpowiedzi:

14
  1. Jaka jest różnica między „buforem” a drugą pamięcią podręczną?
  2. Dlaczego widzimy to rozróżnienie w tak widoczny sposób? (Możliwy powód historyczny)
  3. Do czego Bufferssłużą?
  4. Dlaczego Buffersw szczególności możemy oczekiwać, że będzie większy lub mniejszy?

1. Jaka jest różnica między „buforem” a innym rodzajem pamięci podręcznej?

Bufferszgłasza wielkość pamięci podręcznej stron używanej dla urządzeń blokowych. Jądro zgłasza to jądro celowo odejmując tę ​​ilość od reszty pamięci podręcznej strony Cached.

Zobacz meminfo_proc_show () :

cached = global_node_page_state(NR_FILE_PAGES) -
         total_swapcache_pages() - i.bufferram;
...

show_val_kb(m, "MemTotal:       ", i.totalram);
show_val_kb(m, "MemFree:        ", i.freeram);
show_val_kb(m, "MemAvailable:   ", available);
show_val_kb(m, "Buffers:        ", i.bufferram);
show_val_kb(m, "Cached:         ", cached);

2. Dlaczego widzimy to rozróżnienie w tak widoczny sposób? (Możliwy powód historyczny)

Pamięć podręczna stron działa w jednostkach o rozmiarze strony MMU, zwykle minimum 4096 bajtów. Ma to zasadnicze znaczenie dla mmap(), tj. Dostępu do pliku zmapowanego w pamięci. [1] [2] Służy do udostępniania stron załadowanego kodu programu / biblioteki między niezależnymi procesami i umożliwia ładowanie poszczególnych stron na żądanie. (Również do rozładowywania stron, gdy coś innego potrzebuje miejsca i nie były ostatnio używane).

[1] I / O mapowane na pamięć - Podręcznik biblioteki GNU C.
[2] mmap- Wikipedia.

Wczesny system UNIX miał „bufor bufora” bloków dysku i nie miał mmap (). Najwyraźniej, kiedy po raz pierwszy dodano mmap (), po prostu przykręciły pamięć podręczną strony do pamięci podręcznej bufora. To jest tak niechlujne, jak się wydaje. W końcu system operacyjny UNIX pozbył się bufora pamięci podręcznej. Więc teraz cała pamięć podręczna plików jest w jednostkach stron. Strony są wyszukiwane według (pliku, przesunięcia), a nie według lokalizacji na dysku. Nazywało się to „ujednoliconą pamięcią podręczną bufora”, być może dlatego, że ludzie lepiej znali „pamięć podręczną bufora”.

[3] UBC: Wydajny zunifikowany podsystem we / wy i buforowanie pamięci dla NetBSD

„Jednym z ciekawych zwrotów, które dodaje Linux, jest to, że numery bloków urządzeń, na których strona jest przechowywana na dysku, są buforowane wraz ze stroną w formie listy buffer_headstruktur. Kiedy zmodyfikowana strona ma zostać zapisana z powrotem na dysk, operacje we / wy żądania mogą być wysyłane do sterownika urządzenia od razu, bez potrzeby odczytywania jakichkolwiek bloków pośrednich w celu ustalenia, gdzie należy zapisać dane strony. ”[3]

W Linuksie 2.2 istniała osobna „pamięć podręczna bufora” używana do zapisu, ale nie do odczytu. „Pamięć podręczna strony używała bufora pamięci do zapisywania swoich danych, potrzebując dodatkowej kopii danych i podwajając wymagania dotyczące pamięci dla niektórych ładowań zapisu” (?). [4] Nie przejmujmy się zbytnio szczegółami, ale ta historia byłaby jednym z powodów, dla których Linux raportuje Buffersużycie osobno.

[4] Wymiana stron w zarządzaniu pamięcią w Linuksie 2.4 , Rik van Riel.

Natomiast w Linuksie 2.4 i nowszych dodatkowa kopia nie istnieje. „System wykonuje operacje we / wy dysku bezpośrednio do i ze strony pamięci podręcznej strony.” [4] Linux 2.4 został wydany w 2001 roku.

3. Do czego Bufferssłużą?

Zablokowane urządzenia są traktowane jak pliki, dlatego mają pamięć podręczną stron. Jest to używane „w przypadku metadanych systemu plików i buforowania surowych urządzeń blokowych”. [4] Jednak w obecnych wersjach systemu Linux systemy plików nie kopiują przez nie zawartości plików, więc nie ma „podwójnego buforowania”.

Myślę, że Buffersczęść pamięci podręcznej strony to pamięć podręczna bufora systemu Linux. Chociaż niektóre źródła mogą nie zgadzać się z tą terminologią.

To, ile bufor pamięci buforowej wykorzystuje system plików, jeśli taki istnieje, zależy od szczegółów konkretnego systemu plików. System w pytaniu używa ext4. ext3 / ext4 używa pamięci podręcznej bufora systemu Linux dla dziennika, zawartości katalogu i niektórych innych metadanych.

Niektóre systemy plików, w tym ext3, ext4 i ocfs2, używają warstwy jbd lub jbd2 do obsługi dzienników bloków fizycznych, a ta warstwa zasadniczo wykorzystuje pamięć podręczną bufora.

- Wyślij artykuł przez Teda Tso , 2013

Przed wersją jądra Linuksa 2.4, Linux miał osobne bufory stron i buforów. Od wersji 2.4 pamięć podręczna strony i bufora są zunifikowane i Buffersstanowią surowe bloki dysku, które nie są reprezentowane w pamięci podręcznej strony, tj. Nie są danymi plików.

...

Pamięć podręczna bufora pozostaje jednak, ponieważ jądro nadal musi wykonywać operacje We / Wy bloku pod względem bloków, a nie stron. Ponieważ większość bloków reprezentuje dane pliku, większość bufora pamięci podręcznej jest reprezentowana przez bufor strony. Ale niewielka ilość danych blokowych nie jest zabezpieczona plikami - na przykład metadane i surowe blokowe operacje we / wy - i dlatego jest reprezentowana wyłącznie przez pamięć podręczną bufora.

- Para odpowiedzi Quory autorstwa Roberta Love'a , ostatnia aktualizacja 2013.

Obaj pisarze są programistami systemu Linux, którzy pracowali z zarządzaniem pamięcią jądra systemu Linux. Pierwsze źródło jest bardziej szczegółowe na temat szczegółów technicznych. Drugie źródło to bardziej ogólne podsumowanie, które może być sprzeczne i nieaktualne w niektórych szczegółach.

Prawdą jest, że systemy plików mogą wykonywać częściowe zapisy metadanych, nawet jeśli pamięć podręczna jest indeksowana na stronach. Nawet procesy użytkownika mogą wykonywać częściowe zapisy stron, gdy używają write()(w przeciwieństwie do mmap()), przynajmniej bezpośrednio do urządzenia blokowego. Dotyczy to tylko zapisów, a nie odczytów. Podczas czytania pamięci podręcznej strony pamięć podręczna zawsze odczytuje pełne strony.

Linus lubił twierdzić, że pamięć podręczna bufora nie jest wymagana do zapisu w blokach i że systemy plików mogą zapisywać metadane na części strony, nawet z pamięcią podręczną stron dołączoną do własnych plików zamiast urządzenia blokowego. Jestem pewien, że ma rację mówiąc, że ext2 to robi. ext3 / ext4 z systemem dzienników nie. Nie jest jasne, jakie problemy doprowadziły do ​​tego projektu. Ludzie, których narzekał, zmęczyli się wyjaśnianiem.

ext4_readdir () nie został zmieniony, aby spełnić rant Linusa. Nie widzę też jego pożądanego podejścia stosowanego w readdir () innych systemów plików. Myślę, że XFS również używa bufora bufora dla katalogów. bcachefs w ogóle nie używa pamięci podręcznej strony dla readdir (); korzysta z własnej pamięci podręcznej dla plików btrees. Być może brakuje mi czegoś w btrfs.

4. Dlaczego Buffersw szczególności możemy oczekiwać, że będzie większy lub mniejszy?

W tym przypadku okazuje się, że rozmiar dziennika ext4 dla mojego systemu plików to 128M. To wyjaśnia, dlaczego 1) moja pamięć podręczna bufora może się ustabilizować na nieco ponad 128 MB; 2) pamięć podręczna bufora nie skaluje się proporcjonalnie do większej ilości pamięci RAM na moim laptopie.

Aby poznać inne możliwe przyczyny, zobacz temat Co to jest kolumna buforów w danych wyjściowych programu free? Zauważ, że zgłoszone przez „bufory” freesą w rzeczywistości kombinacją Bufferspamięci płyty, którą można odzyskać.


Aby sprawdzić, czy zapisy dziennika używają pamięci podręcznej bufora, przeprowadziłem symulację systemu plików w ładnej szybkiej pamięci RAM (tmpfs) i porównałem maksymalne użycie bufora dla różnych rozmiarów dziennika.

# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=256
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             256M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2521        4321         285          66         947        5105
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2523        3872         551         237        1223        4835
Swap:          7995           0        7995

# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=16
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             16M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2507        4337         285          66         943        5118
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2509        4290         315          77         977        5086
Swap:          7995           0        7995

Historia tej odpowiedzi: Jak przyszedłem spojrzeć na dziennik

Najpierw znalazłem e-mail Teda Tso i byłem zaintrygowany, że podkreślał buforowanie zapisu . Byłbym zaskoczony, gdyby „brudne”, niepisane dane były w stanie osiągnąć 30% pamięci RAM w moim systemie. sudo atoppokazuje, że w ciągu 10 sekund dany system konsekwentnie zapisuje tylko 1 MB. System plików byłby w stanie nadążyć za ponad 100-krotnym wzrostem tej prędkości. (Jest na dysku twardym USB2, maksymalna przepustowość ~ 20 MB / s).

Użycie blktrace ( btrace -w 10 /dev/sda) potwierdza, że operacje IO, które są buforowane, muszą być zapisywane, ponieważ prawie nie ma danych do odczytu. Również, że mysqldjest to jedyny Strefa proces robi IO.

Zatrzymałem usługę odpowiedzialną za zapisy (pisanie icinga2 do mysql) i ponownie sprawdziłem. Widziałem, jak „bufory” spadły poniżej 20 mln - nie mam na to wytłumaczenia - i pozostaję tam. Ponowne uruchomienie programu piszącego pokazuje, że „bufory” rosną o ~ 0,1 M dla każdego 10-sekundowego przedziału. Zauważyłem, że utrzymuje ten współczynnik konsekwentnie, wracając do 70M i więcej.

Uruchomienie echo 3 | sudo tee /proc/sys/vm/drop_cacheswystarczyło, aby ponownie obniżyć „bufory” do 4,5 mln. Dowodzi to, że moje nagromadzenie buforów stanowi „czystą” pamięć podręczną, którą Linux może natychmiast upuścić w razie potrzeby. Ten system nie gromadzi niepisanych danych. ( drop_cachesnie wykonuje żadnego zapisu zwrotnego, a zatem nie może upuścić brudnych stron. Jeśli chcesz uruchomić test, który najpierw wyczyści pamięć podręczną, użyj syncpolecenia).

Cały katalog mysql ma tylko 150 MB. Gromadzące się bufory muszą reprezentować bloki metadanych z zapisów mysql, ale zdziwiło mnie myśl, że będzie tyle bloków metadanych dla tych danych.

sourcejedi
źródło
3

Twoja wersja freema właściwy pomysł. Domyślnie w swoim raporcie łączy bufory i pamięć podręczną. Jest tak, ponieważ są one w zasadzie tym samym. Oboje zapamiętują komputer w pamięci RAM (Szybsze niż pamięć dodatkowa: dyski i dysk SSD), co widział już podczas czytania dysku i dysku SSD.

Jeśli system operacyjny uzna, że ​​pamięć jest lepiej wykorzystywana przez coś innego, może ją zwolnić. Dlatego nie martw się o bufor i pamięć podręczną.

Jednak oglądanie DVD może spowodować wzrost bufora i eksmisję innej zawartości bufora / pamięci podręcznej. Dlatego możesz użyć nocache do uruchomienia odtwarzacza DVD ( jeśli powoduje to problem ).

ctrl-alt-delor
źródło