Co korzystało z pamięci Linux? Niska pamięć podręczna, niski bufor, a nie VM


11

Przede wszystkim tak, przeczytałem LinuxAteMyRAM , co nie wyjaśnia mojej sytuacji.

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Jak pokazano powyżej, -/+ buffers/cache:linia pokazuje, że używana pamięć jest bardzo wysoka. Jednak z danych wyjściowych topnie widzę żadnego procesu używającego więcej niż 100 MB pamięci.

Więc co wykorzystało pamięć?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

To jest maszyna x86_64 (nie jest to zwykły serwer) z Linuksem x84_64, a nie kontener na maszynie wirtualnej. Jądro ( uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Treść /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dfnie zgłasza dużego zużycia pamięci z tmpfssystemów plików.


2
Jaka jest wydajność ps -eo pid,user,args,pmem --sort pmem?
Braiam

Wkleiłem tutaj link , próbowałem kilka razy, otrzymałem ten sam wynik.
Jason

3
Nie używaj head! Chcę pełnego wyniku pełnego polecenia. Gdybym chciał, żebyś użył head, oddałbym to mojemu rozkazowi. Proszę zawsze podawać pełne dane wyjściowe polecenia, o które pytają ludzie.
Braiam

3
Na telefonie nie pamiętam składni z czubka głowy, ale sprawdź, czy jest pamięć współdzielona sysv. Wydaje mi się, że polecenie to szt.
derobert

5
Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? - Mam podobny problem tutaj: superuser.com/questions/793192/...
Hackeron

Odpowiedzi:


4

Pamięć w systemie Linux może być dziwną bestią do zdiagnozowania i zrozumienia.

Podczas normalnej pracy większość, jeśli nie cała, pamięć zostanie przydzielona do jednego lub drugiego zadania. Niektóre zostaną przydzielone do aktualnie działających procesów pierwszego planu. Niektóre będą przechowywać dane buforowane z dysku. Niektórzy będą przechowywać dane związane z procesami, które nie wykonują się aktywnie w tym konkretnym momencie.

Proces w systemie Linux ma własną wirtualną przestrzeń adresową (VIRT na wyjściu top). Zawiera wszystkie dane związane z procesem i można uznać, jak „duży” jest proces. Jednak rzadko zdarza się, aby cała ta pamięć była aktywnie częścią „prawdziwej” mapy pamięci (RES na wyjściu top). RES lub pamięć rezydentna to dane, które w danym momencie są bezpośrednio dostępne w pamięci RAM. Oprócz tego istnieje również pamięć współdzielona (SHR). Może to być współużytkowane przez wiele instancji tego samego procesu. Tak więc pamięć używana przez proces jest w dowolnym momencie RES i SHR, ale jeśli istnieje więcej niż jedna instancja procesu korzystająca z pamięci współużytkowanej, użycie to RES plus RES plus RES ... plus SHR.

Skąd więc różnica między RES a VIRT? Z pewnością, jeśli proces ma blok przydzielonej pamięci, to jest to przydzielona pamięć, prawda? Nie. Pamięć jest przydzielana na stronach, a strony mogą być aktywne lub nieaktywne. Aktywne są w OZE. Nieaktywne są „reszta”. Można je odepchnąć na bok, ponieważ w tej chwili nie są dostępne. Oznacza to, że można je wymienić na dysk, jeśli pamięć się zapełni. Ale nie idą prosto na dysk. Najpierw siedzą w skrytce. Nie chcesz ciągle wymieniać, więc między aplikacją a przestrzenią wymiany jest bufor. Bufory te ciągle się zmieniają, gdy swapper wybiera inny proces do wykonania, a różne strony stają się aktywne i nieaktywne. A wszystko to dzieje się na drodze do postu dla zwykłego człowieka, aby dotrzymać mu kroku.

A na dodatek wszystkie bufory dyskowe. Nieaktywna pamięć nie tylko trafia do pamięci podręcznej, ale kiedy pamięć podręczna zostaje zamieniona na dysk, najpierw trafia do bufora dyskowego, który ma zostać umieszczony w kolejce do zapisu. To druga warstwa pamięci podręcznej w miksie. Te bufory dyskowe są również używane przez inne części systemu do ogólnego buforowania IO. Więc oni też ciągle się zmieniają.

Więc co widzisz w rzeczach jak topi freeetc są albo chwilowe migawki z obecnego stanu maszyny lub zagregowanych statystyk ponad pewien okres czasu. Do czasu odczytania danych są one nieaktualne.

Każdy proces może uzyskać dostęp do dużej ilości pamięci, ale rzadko jest to rozsądne. W każdym razie nie może mieć dostępu do całej pamięci, więc pamięć, której aktualnie nie szuka, zostaje przeniesiona do pamięci podręcznej, chyba że jest specjalnie oznaczona jako „zablokowana w rdzeniu”.

Zatem ilość pamięci „wykorzystywanej” przez aplikację i ilość pamięci, którą „ma”, to dwie zupełnie różne rzeczy. Duża część danych aplikacji znajduje się w pamięci podręcznej, a nie w pamięci „rdzenia”, ale ponieważ pamięć podręczna znajduje się w pamięci RAM przez większość czasu, jest ona natychmiast dostępna i potrzebuje tylko „aktywacji”, aby stać się pamięcią „rdzenia”. To znaczy, chyba że został zamieniony na dysk, gdy następnie wymaga rozpakowania (co może być szybkie, jeśli znajduje się w buforze).

Ze względu na szybki charakter bestii i fakt, że liczby ciągle się zmieniają, liczby mogą nawet częściowo zmieniać się poprzez obliczanie tego, czym są, więc nigdy nie można dokładnie powiedzieć „tyle pamięci jest w użyciu” z perspektywa użytkownika. Meminfo to migawka w czasie dostarczana przez jądro, ale ponieważ jest to jądro, które wykonuje, niekoniecznie pokazuje rzeczywisty stan wykorzystania pamięci przez jeden proces, ponieważ w tym czasie żaden proces nie jest aktywnie wykonywany - jest między procesami.

Tak jak powiedziałem, wszystko jest bardzo mylące.

Ale pod koniec dnia to naprawdę nie ma znaczenia. Liczy się nie to, ile pamięci masz „wolnej”, ale ile wykorzystałeś przestrzeni wymiany i jak często jest dostępna przestrzeń wymiany. Zamiana spowalnia system, a nie brak pamięci (chociaż brak pamięci powoduje nadmierną zamianę). Jeśli masz dużo używanej pamięci, ale nie używasz żadnej (lub bardzo małej) przestrzeni wymiany, to wszystko jest normalne. Ogólnie rzecz biorąc, wolna pamięć nie jest pożądana i często jest czysto przejściowa, ponieważ była używana do jednego celu, ale nie została jeszcze przydzielona do innego - na przykład była to pamięć podręczna i została zamieniona na dysk, ale nie był jeszcze używany do niczego innego, lub był to bufor dyskowy, bufory zostały opróżnione na dysk, ale żadna aplikacja nie zażądała jeszcze pamięci podręcznej.


6
Jest to naprawdę interesujące, ale nie odpowiada na pytanie, dlaczego PO obserwuje tę konkretną rozbieżność.
terdon

Myślę, że jedyna prawdziwa rozbieżność leży między oczekiwaniami PO a tym, co zapewnia Linux. Tzn. Wartości, które podaje Linux, po prostu się nie sumują, a to dlatego, że już się zmieniły.
Majenko

Ponieważ OP wydaje się nie rozumieć pytania, które zadaje, nie rozumiem, jak można wybrać „właściwą” odpowiedź. Możemy wyjaśnić, jak działa system, dopóki nie jesteśmy niebiescy na twarzy, ale jeśli nie zrozumie tych podstaw i nie zda sobie sprawy, że jego pytanie jest bez znaczenia, nigdy nie będziemy mieli „właściwej” odpowiedzi.
Majenko

Doceniam za napisanie tego, ale szczerze mówiąc, nie podoba mi się ton agnostycyzmu. Zgadzam się z teorią „migawki”, ale jeśli migawka wciąż podaje ten sam numer, co oznacza, że ​​użycie pamięci RAM jest wysokie, a ty nie możesz dowiedzieć się, jak to się stało, czy nie będziesz ciekawy?
Jason

5
Powinieneś opublikować to na swoim blogu. To dobrze, ale tutaj nie ma znaczenia. Dzieje się coś dziwnego (i mam na myśli dziwnego, że pochodzi od kogoś, kto rozumie to, co napisałeś), ponieważ VIRT procesów nie bierze pod uwagę całego użycia pamięci RAM, a system nie zamienia się pomimo nacisków, aby to zrobić.
Gilles „SO- przestań być zły”

0

To jest jedna część odpowiedzi:

Istnieje różnica między tym, co jest określane jako pamięć „Używana” (w poleceniu „wolne”) i „Pamięć przydzielona do aktywnych procesów (użytkowników)” (w / proc / meminfo). Ok, więc twój system ma łącznie 48149 MB (około 47 GB)

Jeśli spojrzysz na swoje / proc / meminfo, zobaczysz: Nieaktywne: 17296272 kB = (około 16,5 Gb) - Nieaktywna pamięć może pochodzić z procesów, które zostały zakończone. Może to być także pamięć, która nie była używana przez długi czas przez aktywny proces. Pamięć nie jest „zwalniana” tylko dlatego, że proces został zakończony. Dlaczego? ponieważ to więcej pracy. Ta sama strona pamięci może zostać użyta ponownie, więc jądro Linuksa po prostu pozostawia dane na liście „nieaktywnej”, dopóki proces tego nie potrzebuje.

Ta strona wyjaśnia niektóre z nich. http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Przeczytaj sekcję dotyczącą PFRA (algorytm odzyskiwania ramki strony) używanej przez jądro Linuksa: „Strony zawarte w pamięci podręcznej dysków i pamięci, do których nie odwołuje się żaden proces, należy odzyskać przed stronami należącymi do przestrzeni adresowej trybu użytkownika procesów” „Odzyskiwanie” oznacza przeniesienie ich z „zużytych” (nieaktywnych + aktywnych) do „wolnych”.

Wyjaśnia to bardziej szczegółowo zarządzanie pamięcią: jak działają aktywne i nieaktywne listy oraz jak poruszają się między nimi strony https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

Uważam, że jądro wykorzystuje również pamięć do struktur danych, i wydaje mi się, że to „slab 1049464 kb” (~ 1 GB), ale nie jestem pewien, czy jest to liczone osobno.


Chciałem tylko dodać, że w przeszłości miałem doświadczenie z brakiem pamięci w systemie z powodu źle napisanej aplikacji, która alokowała segmenty pamięci dzielonej, ale ich nie zwalniała. Segmenty pamięci dzielonej utrzymywały się nawet po śmierci wszystkich procesów, które ich używają. To nie był Linux, ale może tak być również w Linuksie. jak wspomniano powyżej, zobacz ipcs, aby uzyskać informacje na ten temat. patrz makelinux.net/alp/035 Mówi, że musisz jawnie zwolnić pamięć współdzieloną.
ssl

1
Nie rozumiem wszystkiego, na czym polega twoja odpowiedź, ale „nieaktywna pamięć może pochodzić z procesów, które zostały zakończone” jest zdecydowanie błędna. Pamięć użytkownika jest dostępna w dwóch wariantach: mapowanym lub anonimowym. Mapowaną pamięć zawsze można odzyskać, ponieważ dane można ponownie załadować z pliku. Anonimową pamięć można odzyskać, jeśli zostanie zamieniona. Pamięć nieaktywna to pamięć, która jest dobrym kandydatem do odzyskania; jednak zawartość musi znajdować się w pliku lub w innym miejscu, ponieważ ta pamięć jest nadal używana. Kiedy proces umiera, jego pamięć staje się wolna i nie jest już uwzględniana jako aktywna + nieaktywna.
Gilles „SO- przestań być zły”,

1
Niektóre referencje: Co może spowodować wzrost nieaktywnej pamięci i jak ją odzyskać? na błąd serwera; stare, ale nadal najczęściej stosowane wskazówki od Red Hat . I artykuł Bhavina Turakhii, który również cytujesz; nie jest to jednoznaczne w tej sprawie, ale wyjaśnia o anonimowych i zmapowanych stronach w sekcji „Zrozumienie PFRA”.
Gilles „SO- przestań być zły”,

Myślałem o nieaktywnych stronach, do których nie odwołuje się żaden proces z tego artykułu: kernel.org/doc/gorman/html/understand/understand013.html Chociaż przypuszczam, że mogą to być strony zwolnione przez wciąż działający proces. sekcja „Odzyskiwanie stron z list LRU”
ssl

Ale może dotyczy to tylko stron w pamięci podręcznej wymiany?
ssl

-2

Czy w ogóle używasz NFS?
Być może warto biegać w slabtop -oobie strony, nfs_inode_cachemoże wymknąć się spod kontroli.


-4

Liczba, na którą powinieneś patrzeć, jest używana do zamiany , na wyjściu jest to „0”, co oznacza, że ​​NIE zabrakło ci pamięci RAM. Dopóki twój system nie wymienia pamięci, nie powinieneś martwić się innymi liczbami, które i tak są bardzo trudne do interpretacji.

Edycja: OK, wygląda na to, że moja odpowiedź jest raczej tajemnicza niż zwięzła. Więc pozwól mi rozwinąć.

Chyba głównym problemem tutaj jest interpretacja wyniku top / ps, co nie jest zbyt dokładne. Np. Ponieważ wiele zastosowań tych samych bibliotek współdzielonych nie jest obliczanych zgodnie z oczekiwaniami, patrz np. Http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

Jednak bardzo dokładne jest to, że jeśli rozmiar wymiany wynosi dokładnie zero, to w twoim systemie nie zabrakło pamięci (jeszcze). Oczywiście jest to bardzo jasne stwierdzenie, ale do profilowania faktycznego wykorzystania pamięci w systemie, top nie będzie właściwą rzeczą. (A jeśli spojrzysz na górę, przynajmniej posortuj dane wyjściowe dla virt lub% mem.)

Zobacz także http://elinux.org/Runtime_Memory_Measurement


1
Nie powinieneś się martwić, jeśli twój system również się zmienia, to normalne. Powinieneś się martwić, jeśli Twój system zamienia się zbyt często (co nie jest tym samym, co posiadanie dużej używanej przestrzeni wymiany). Fakt, że użyta zamiana wynosi 0, jest sam w sobie dziwny, z tak małą ilością wolnej pamięci fizycznej.
Gilles „SO- przestań być zły”

cóż, jego wyniki wskazują, że jego system w ogóle nie zamieniał. To z pewnością optymalna częstotliwość wymiany. Nie powiedziałem, że mały rozmiar wymiany jest dobrą rzeczą, ale z pewnością jest to rozmiar zero. I dopóki system nie zabraknie wolnej pamięci, dlaczego miałby zacząć zamianę?
Echsecutor

Nie, brak zamiany jest daleki od optymalnego. Pamięć programów, które obecnie nie są używane, powinna zostać zamieniona, aby zrobić miejsce na pamięć podręczną dysku dla często używanych plików. Jeśli chodzi o bit, który właśnie dodałeś do wyjścia free, myślę, że miałeś na myśli top- ale nawet wtedy suma może być tylko większa niż suma (ponieważ pamięć dzielona jest liczona wiele razy), a nie mniej.
Gilles „SO- przestań być zły”

co rozumiesz przez sumę może być tylko nie mniej? top pokazuje tylko tyle procesów, ile zmieści się na ekranie, jestem całkiem pewien, że powyższe nie są wszystkimi uruchomionymi procesami, dlatego nie są sortowane według zużycia pamięci, ten fragment danych wyjściowych jest dość bezużyteczny w przypadku pytania „co wykorzystało pamięć” .
Echsecutor

och, i nie chcę wchodzić w debatę, kiedy jest optymalny czas na rozpoczęcie wymiany, ale domyślnym serwerem linux jest nie zamienianie pamięci tylko dlatego, że „nie przyzwyczaja się”.
Echsecutor
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.