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 top
nie 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
df
nie zgłasza dużego zużycia pamięci z tmpfs
systemów plików.
ps -eo pid,user,args,pmem --sort pmem
?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.Odpowiedzi:
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ściutop
). 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
top
ifree
etc 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.
źródło
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.
źródło
Czy w ogóle używasz NFS?
Być może warto biegać w
slabtop -o
obie strony,nfs_inode_cache
może wymknąć się spod kontroli.źródło
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
źródło
free
, myślę, że miałeś na myślitop
- ale nawet wtedy suma może być tylko większa niż suma (ponieważ pamięć dzielona jest liczona wiele razy), a nie mniej.