Jestem trochę zdezorientowany niektórymi wynikami, które widzę z ps i za darmo .
Na moim serwerze jest to wynik free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Rozumiem, w jaki sposób Linux zarządza pamięcią, dlatego, że zapisze użycie dysku w pamięci RAM, aby każdy kolejny dostęp był szybszy. Uważam, że wskazują na to „buforowane” kolumny. Ponadto różne bufory są przechowywane w pamięci RAM, wskazane w kolumnie „bufory”.
Więc jeśli dobrze rozumiem, „faktyczne” użycie powinno być „użytą” wartością „- / + buffers / cache” lub 561 w tym przypadku.
Więc zakładając, że wszystko jest poprawne, tym, co mnie rzuca, są wyniki ps aux
.
Moje rozumienie ps
wyników polega na tym, że szósta kolumna (RSS) reprezentuje rozmiar w kilobajtach wykorzystywany przez proces do pamięci.
Kiedy uruchamiam to polecenie:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
Czy nie powinna wynikać kolumna „używana” z „- / + bufory / pamięć podręczna” free -m
?
Jak więc właściwie określić zużycie pamięci przez proces w systemie Linux? Najwyraźniej moja logika jest wadliwa.
htop
autora na jedno podobne pytanie, które miałem poprzedniego dnia ... Jak obliczyć zużycie pamięci z / proc / meminfo (jak htop)Odpowiedzi:
Ta dokładna samo pytanie zadano na ServerFault właśnie drugi dzień :-)
System wirtualnej pamięci linux nie jest taki prosty. Nie możesz po prostu zsumować wszystkich pól RSS i otrzymać wartości zgłoszonej
used
przezfree
. Jest wiele powodów, ale uderzę w kilka największych.Gdy proces rozwiąże się, zarówno rodzic, jak i dziecko będą wyświetlać ten sam kanał RSS. Jednak Linux używa
copy-on-write
tak, że oba procesy naprawdę wykorzystują tę samą pamięć. Tylko wtedy, gdy jeden z procesów zmodyfikuje pamięć, zostanie ona faktycznie skopiowana. To spowoduje, żefree
liczba będzie mniejsza niżtop
suma RSS.Wartość RSS nie obejmuje pamięci współdzielonej. Ponieważ pamięć współdzielona nie jest własnością żadnego procesu,
top
nie jest uwzględniana w RSS. To spowoduje, żefree
liczba będzie większa niżtop
suma RSS.źródło
shmget
lubmmap
. Sformułowanie wokół pamięci jest bardzo trudne. Użycie niewłaściwego słowa w niewłaściwym miejscu może całkowicie zepsuć znaczenie zdania.Jeśli szukasz numerów pamięci, które się sumują, spójrz na smem :
Na przykład tutaj:
Podobnie
PSS
interesująca kolumna, ponieważ uwzględnia pamięć współdzieloną.W przeciwieństwie do
RSS
tego sensowne jest sumowanie. Otrzymujemy tutaj 654 Mb ogółem dla procesów dotyczących obszarów użytkownika.Dane wyjściowe z całego systemu mówią o reszcie:
Tak więc 1 GB pamięci RAM ogółem = 654 Mb procesów użytkownika + 346 MB pamięci jądra + 16 MB wolnych
(daj lub weź kilka Mb)
Ogólnie pamięć podręczna zajmuje około połowy pamięci (494 Mb).
Dodatkowe pytanie : czym jest tutaj pamięć podręczna użytkownika a pamięć podręczna jądra?
btw dla czegoś wizualnego spróbuj:
źródło
Naprawdę dobrym narzędziem jest
pmap
lista bieżącego wykorzystania pamięci dla określonego procesu:Aby uzyskać więcej informacji na ten temat, zobacz stronę podręcznika man,
man pmap
a także zapoznaj się z 20 narzędziami do monitorowania systemu Linux , które powinien znać każdy SysAdmin , które listy świetnych narzędzi zawsze używam do uzyskania informacji o moim Linux-ie.źródło
free
mówi.pmap -x PID
zawiera również kolumnę RSS, która często jest dość przydatna, aby dowiedzieć się, skąd pochodzi suma RSS procesu (jak zaobserwowano np. viatop
).Uruchom na górze, kliknij,
h
aby uzyskać pomoc, a następnief
dodaj pola. możesz dodać następujące pola:RSS
ilość pamięci fizycznej, z której korzysta aplikacjaCODE
całkowita ilość pamięci używanej przez kod wykonywalny procesuDATA
- całkowita ilość pamięci (kb) przeznaczona na dane procesu i stosPomiędzy tymi 3 powinieneś mieć całkiem dokładne wyniki. Możesz także użyć bardziej szczegółowych zamienników dla top polecam
htop
lubatop
.Edycja: Prawie zapomniałem, jeśli chcesz naprawdę szczegółowych informacji. Znajdź PID i cat następujący plik.
PID=123
cat /proc/123/status
Edycja 2: Jeśli możesz go znaleźć lub mieć książkę:
- zawiera sekcję Rozdział 5: Narzędzia wydajności: Pamięć specyficzna dla procesu - zawiera znacznie więcej informacji, niż byś chciał.
źródło
ps
daje ilość pamięci używanej przez każdy proces. Część tej pamięci to pliki zmapowane, które są uwzględniane w pamięci podręcznej. Część tej pamięci (zwłaszcza kodu) jest współdzielona z innymi procesami, więc jeśli dodasz wartości RSS, jest liczona wiele razy.Nie ma właściwej odpowiedzi na pytanie „ile pamięci zajmuje ten proces?”, Ponieważ nie zależy to od samego procesu, zależy również od środowiska. Istnieje wiele różnych wartości, które możesz nazwać „zużyciem pamięci” w procesie, i nie pasują one do siebie ani się nie sumują, ponieważ liczą różne rzeczy.
źródło
Jak inni słusznie zauważyli, trudno jest uzyskać kontrolę nad rzeczywistą pamięcią używaną przez proces, co ze współdzielonymi regionami i plikami mmap i tym podobne.
Jeśli jesteś eksperymentatorem, możesz uruchomić valgrind i masyw . Może to być nieco ciężkie dla zwykłego użytkownika, ale z czasem zorientujesz się, jak zachowuje się pamięć aplikacji. Jeśli malloc () aplikacji jest dokładnie tym, czego potrzebuje, to da ci dobrą reprezentację rzeczywistego dynamicznego wykorzystania pamięci przez proces. Ale ten eksperyment można „zatruć”.
Aby komplikować sprawy, Linux pozwala przesadzić z pamięcią. Kiedy robisz pamięć malloc (), deklarujesz zamiar wykorzystania pamięci. Ale tak naprawdę alokacja nie następuje, dopóki nie zapiszesz bajtu na nowej stronie przydzielonej „pamięci RAM”. Możesz to sobie udowodnić, pisząc i uruchamiając mały program w taki sposób:
Uruchom to na maszynie z mniej niż 16 GB pamięci RAM i, voila !, właśnie zdobyłeś 16 GB pamięci! (nie, nie bardzo).
Zauważ,
top
że widzisz „VIRT” jako 16,004G, ale% MEM to 0,0Uruchom to ponownie z valgrind:
A masyw mówi „suma wszystkich allocs () = 16 GB”. To nie jest bardzo interesujące.
ALE, jeśli uruchomisz go przy zdrowym procesie:
I tutaj widzimy (bardzo empirycznie iz dużą pewnością), że kompilator przydzielił 77 KB sterty.
Po co tak bardzo starać się o wykorzystanie sterty? Ponieważ wszystkie współdzielone obiekty i sekcje tekstowe używane przez proces (w tym przykładzie kompilator) nie są strasznie interesujące. Są stałym kosztem procesu. W rzeczywistości kolejne wywołania tego procesu niemal przychodzą „za darmo”.
Porównaj i porównaj następujące elementy:
MMAP () plik 1 GB. Twój VMSize będzie wynosił 1 + GB. Ale Twój Resident Set Size będzie tylko częściami pliku, w którym spowodowałeś utworzenie stronicowania (poprzez usunięcie odniesienia wskaźnika do tego regionu). A jeśli „przeczytasz” cały plik, to zanim dojdziesz do końca, jądro mogło już wygenerować strony początkowe (jest to łatwe, ponieważ jądro dokładnie wie, jak / gdzie zamienić te strony, jeśli ponownie się wyrejestrujesz) ). W obu przypadkach ani VMSize, ani RSS nie są dobrym wskaźnikiem „zużycia” pamięci. Tak naprawdę nic nie edytowałeś w malloc ().
Natomiast Malloc () i dotknij DUŻO pamięci - aż pamięć zostanie zamieniona na dysk. Zatem przydzielona pamięć przekracza teraz wartość RSS. Tutaj twój VMSize może zacząć ci coś mówić (twój proces ma więcej pamięci niż to, co faktycznie znajduje się w twojej pamięci RAM). Ale nadal trudno jest odróżnić maszynę wirtualną, która jest stronami udostępnionymi, i maszynę wirtualną, która zamienia dane.
To właśnie tutaj interesuje się valgrind / masyw. Pokazuje, co celowo przydzieliłeś (niezależnie od stanu twoich stron).
źródło
Spróbuj tego: da ci całkowitą pamięć RAM faktycznie używaną przez cały proces działający w MB
źródło
size
Donosips
ma niewiele wspólnego z rzeczywistym wykorzystaniu pamięci. Jest to wirtualny rozmiar każdego procesu, który niekoniecznie musi mieć przydzieloną pamięć. Nie obejmuje również niektórych przydzielonych segmentów.Pokaże, ile użytkowników pamięci przez użytkowników ..
źródło
Użyj tego polecenia, aby znaleźć wykorzystanie pamięci w%.
Wykorzystana pamięć:
wolna pamięć
źródło
grep
po prostu usiądę i czekam na dane wejściowe.free -m | grep Mem | awk '{print $3/$2 * 100.0}'