Jak mogę monitorować wykorzystanie pamięci?

265

Użyłem topzobaczyć zużycie pamięci w tej chwili. Chciałbym jednak monitorować zużycie pamięci przez pewien czas. Np. Rozpocznij monitorowanie, a następnie wykonaj kilka poleceń, a następnie zatrzymaj monitorowanie i sprawdź, ile pamięci wykorzystano w tym okresie.

Jak mogę to zrobić na serwerze Ubuntu?

Chyba mógłbym rozpocząć cronjob co około 5 sekund i wywołać polecenie, które rejestruje bieżące użycie pamięci w pliku tekstowym. Ale jakiego polecenia powinienem użyć, aby uzyskać bieżące wykorzystanie pamięci w formacie łatwym do zalogowania do pliku tekstowego?

Jonas
źródło

Odpowiedzi:

322

Polecam połączenie poprzednich odpowiedzi

watch -n 5 free -m

Pamiętaj, że Linux lubi używać dodatkowej pamięci do buforowania bloków dysków twardych . Więc nie chcesz patrzeć tylko na darmowe Mem. Chcesz spojrzeć na freekolumnę -/+ buffers/cache:wiersza. To pokazuje, ile pamięci jest dostępne dla aplikacji. Właśnie pobiegłem free -mi dostałem to:

             total       used       free     shared    buffers     cached
Mem:          3699       2896        802          0        247       1120
-/+ buffers/cache:       1528       2170
Swap:         1905         62       1843

Wiem, że używam 1528 MB i mam 2170 MB wolnego.

Uwaga: Aby zatrzymać ten watchcykl, wystarczy nacisnąć Ctrl+ C.

Justin Force
źródło
1
Dzięki, to pouczające. Ale czy w używanej kolumnie, którą najpierw masz, 2896a następnie w 1528przypadku buforów, nie oznacza to, że używasz 2896 + 1528?
Jonas
8
Mem: usedto całkowita wykorzystana pamięć. -/+ buffers/cache: usedto całkowita wykorzystana pamięć minus bufory i pamięć podręczna. Wiem, że dane wyjściowe wyglądają zabawnie, ale tutaj nie jest wymagana arytmetyka. Po prostu szukasz używanego / wolnego w rzędzie buforów - / + / cache.
Justin Force
6
Opcja -h jest o wiele ładniejsza
frmdstryr
1
@frmdstryr Dobra uwaga! -h / - człowiek nie istniał, kiedy to pisałem. gitlab.com/procps-ng/procps/commit/…
Justin Force
3
@ cbradsh1 Możesz po prostu zrobić free -h, np. watch -n 5 free -haby uzyskać wyjście „czytelne dla człowieka”, np. 2.1Gzamiast 2170w wyjściu.
Justin Force
213

Myślę, że htopto najlepsze rozwiązanie.

  • sudo apt-get install htop

W ten sposób zauważysz, które programy używają najwięcej pamięci RAM. i możesz łatwo rozwiązać jeden, jeśli chcesz. Oto zrzut ekranu!

Alvar
źródło
2
htopjest fajny, ponieważ jest bardziej „graficzny” i prawdopodobnie łatwiejszy do odczytania niż free.
mjswensen
1
nie rozumiem wyniku. Czy RESpamięć używana przez tę aplikację jest w MB? CO TO JEST SHR?
faizal
1
@faizal: pamięć wirtualna, zarezerwowana i współdzielona.
WitchCraft,
1
w jaki sposób htoppokazuje „zużycie pamięci przez pewien okres czasu”?
dangel
htop -s M_SHARE htop -s CZAS
Tomachi
40

Jeśli szukasz dobrego podziału pamięci używanej przez każdy uruchomiony proces, polecam sprawdzenie ps_mem.py (znalezione tutaj na pixelbeat.org).

Wiem, że w powyższych komentarzach wspomniałeś, że chcesz mieć migawkę jednowierszową za darmo , ale pomyślałem, że inni mogą uznać to za przydatne.

Przykładowe dane wyjściowe:

user@system:~$ sudo ps_mem.py
[sudo] password for user:
 Private  +   Shared  =  RAM used       Program

  4.0 KiB +   7.5 KiB =  11.5 KiB       logger
  4.0 KiB +   8.0 KiB =  12.0 KiB       mysqld_safe
  4.0 KiB +  10.0 KiB =  14.0 KiB       getty
  4.0 KiB +  42.0 KiB =  46.0 KiB       saslauthd (5)
 48.0 KiB +  13.0 KiB =  61.0 KiB       init
 56.0 KiB +  27.5 KiB =  83.5 KiB       memcached
 84.0 KiB +  26.5 KiB = 110.5 KiB       cron
120.0 KiB +  50.0 KiB = 170.0 KiB       master
204.0 KiB + 107.5 KiB = 311.5 KiB       qmgr
396.0 KiB +  94.0 KiB = 490.0 KiB       tlsmgr
460.0 KiB +  65.0 KiB = 525.0 KiB       rsyslogd
384.0 KiB + 171.0 KiB = 555.0 KiB       sudo
476.0 KiB +  83.0 KiB = 559.0 KiB       monit
568.0 KiB +  60.0 KiB = 628.0 KiB       freshclam
552.0 KiB + 259.5 KiB = 811.5 KiB       pickup
  1.1 MiB +  80.0 KiB =   1.2 MiB       bash
  1.4 MiB + 308.5 KiB =   1.7 MiB       fail2ban-server
888.0 KiB +   1.0 MiB =   1.9 MiB       sshd (3)
  1.9 MiB +  32.5 KiB =   1.9 MiB       munin-node
 13.1 MiB +  86.0 KiB =  13.2 MiB       mysqld
147.4 MiB +  36.5 MiB = 183.9 MiB       apache2 (7)
---------------------------------
                        208.1 MiB
=================================

 Private  +   Shared  =  RAM used       Program

Jedyne, co mi się nie podoba, to fakt, że skrypt twierdzi, że wymaga uprawnień roota. Nie miałem jeszcze okazji dowiedzieć się, dlaczego tak się dzieje.

Jason Mock
źródło
Zastanawiam się, czy pamięć jest dzielona między wątkami. Dzieli się to między procesami, prawda? Przynajmniej w systemie Windows ...
Thomas Weller,
Tak więc w tym przypadku pamięć współdzielona odnosi się do stron odwzorowanych przez wiele procesów w postaci bibliotek współdzielonych. Dodatkowo, w kontekście aplikacji wielowątkowych, cała przestrzeń pamięci procesu jest dostępna dla wszystkich wątków tego procesu.
Jason Mock
4
Teraz dostępny w PyPI ( pip install ps_mem) i na GitHub .
Leif Arne Storset,
@ThomasWeller: Tak, wątki zawsze współużytkują pamięć, podczas gdy procesy mogą współdzielić część lub całość pod pewnymi warunkami.
Leif Arne Storset
do tego używam gnome-system-monitor
24

Użyj darmowego polecenia. Na przykład jest to wynik free -m:

             total       used       free     shared    buffers     cached
Mem:          2012       1666        345          0        101        616
-/+ buffers/cache:        947       1064
Swap:         7624          0       7624

free -m | grep /+ zwróci tylko drugą linię:

-/+ buffers/cache:        947       1064
Izajasza
źródło
Dzięki, wygląda świetnie. Czy to 947jest użycie pamięci minus pamięć używana dla buforów i pamięci podręcznych?
Jonas
11

Polecenie watch może być przydatne. Spróbuj watch -n 5 freemonitorować wykorzystanie pamięci za pomocą aktualizacji co pięć sekund.

mgunes
źródło
Dzięki, to było świetne! Wolałbym jednak, aby użycie pamięci zajmowało jedną linię, więc łatwo jest zalogować się do pliku tekstowego.
Jonas
8

Możesz to zrobić za pomocą cat /proc/meminfo.

MemTotal:        4039160 kB
MemFree:          309796 kB
MemAvailable:    3001052 kB
Buffers:          345636 kB
Cached:          2341288 kB
SwapCached:            8 kB
Active:          1725160 kB
Inactive:        1551652 kB
Active(anon):     538404 kB
Inactive(anon):    70076 kB
Active(file):    1186756 kB
Inactive(file):  1481576 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:       4194300 kB
SwapFree:        4194044 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        589988 kB
Mapped:           255972 kB
Shmem:             18596 kB
Slab:             374888 kB
SReclaimable:     310496 kB
SUnreclaim:        64392 kB
KernelStack:        6976 kB
PageTables:        26452 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6213880 kB
Committed_AS:    3589736 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      147392 kB
DirectMap2M:     4046848 kB
Amir
źródło
1
dodanie zegarka z przodu tego polecenia sprawia, że ​​jest niesamowity! jak wwatch cat /proc/meminfo
Elder Geek
freeKomenda czerpie informacje z /proc/meminfoi prezentuje je w zwarty sposób. Użyj free -hdo odczytu czytelnego dla człowieka.
LoMaPh
4

W przypadku wizualnego monitorowania całkowitego zużycia pamięci RAM, jeśli używasz Byobu , utrzyma ono użycie pamięci w prawym dolnym rogu terminala i będzie działać, gdy będziesz w dowolnej sesji terminala.

Jak widać na zrzucie ekranu, moja maszyna wirtualna ma czas działania 1h3m, obciążenie 0,00, procesor 2,8 GHz (wirtualny) i 994 MB (21%) pamięci RAM dostępnej w systemie.

Byobu w użyciu

bafromca
źródło
3

Rozwiązanie jednokreskowe i wydajność:

free -m | grep "Mem:"

Oto przykład oczekiwanego wyniku:

Mem:           3944         652         302          18        2990        2930
Tim
źródło
1

Użyłbym Cacti . Spowoduje to wyświetlenie wykresu zużycia pamięci itp. W danym okresie czasu, a będziesz mógł sprawdzić wykorzystanie za pomocą przeglądarki internetowej.

Matt
źródło
1

Monitorowanie użycia pamięci

Jestem bardziej zgodny z jednym z poprzednich postów, w którym wspominałem o kaktusach jako świetnym sposobie monitorowania zużycia pamięci. Ponieważ jednak wydaje się, że kaktusy nie są już popularne w głównym nurcie, istnieje alternatywna aplikacja graficzna o nazwie Grafit.

Grafit jest stosunkowo łatwy do zainstalowania na serwerze Ubuntu. Aby go zainstalować, możesz sprawdzić ten link , aby zapoznać się z łatwymi procedurami instalacji.

Po zainstalowaniu grafitu możesz teraz wysyłać do niego metryki pamięci w dowolnym odstępie czasu; co 5 sekund, co minutę, co godzinę ... itd.

Aby wykresować wskaźniki pamięci, jak już sugerowano w poprzednich postach, możesz napisać własny skrypt za pomocą narzędzi systemowych w celu zebrania niezbędnych informacji o pamięci. Możesz też użyć wstępnie napisanej wtyczki snmp, która wykona całą pracę za Ciebie.

Jeśli chcesz napisać własny skrypt pamięci, mądrze jest upewnić się, że bierzesz pod uwagę buforowaną i buforowaną pamięć podczas obliczania używanej pamięci, w przeciwnym razie będziesz zbierać fałszywe dane.

Jeśli zamiast tego chcesz użyć wtyczki snmp, która już wykonuje wszystkie niezbędne obliczenia, oto link do tego, który działa całkiem dobrze: checkMemoryviaSNMP .

Zalety SNMP:

Mam snmp zainstalowany na wszystkich monitorowanych zdalnych węzłach. To pozwala mi monitorować wszystkie moje systemy z jednego centralnego serwera (serwerów) , bez konieczności kopiowania lub umieszczania wtyczki na zdalnych węzłach.

Wady SNMP:

Musisz upewnić się, że agent snmp jest zainstalowany na każdym ze zdalnych węzłów, na których chcesz monitorować pamięć. Ta instalacja będzie jednak jednorazowa. Jeśli używasz w swoim środowisku narzędzi do automatyzacji, takich jak szef kuchni, lalek lub podobnych narzędzi, nie stanowi to żadnego problemu.

Konfiguracja agenta SNMP na zdalnych węzłach:

Po zainstalowaniu agenta snmp, po prostu vi plik /etc/snmpd/snmpd.conf i dodaj do niego ten wiersz:

rocommunity  (specify-a-community-string-aka-password-here)

Następnie uruchom ponownie agenta snmpd, używając:

/etc/init.d/snmpd restart

Następnie na serwerze centralnym, z którego zamiast tego monitorujesz wszystkie pozostałe serwery, możesz uruchomić następujące polecenie:

$ time ./checkMemoryviaSNMP -v2 public gearman001.phs.blah.com 30 90 graphite,10.10.10.10,2003,typical
WARNING: Used = [ 3.26154 GB ], Installed = [ 5.71509 GB ], PCT.Used = [ 57.069% ], Available.Memory = [ 2.00291 GB ]. Buffer = [ 137.594 MB ], Cached = [ 1.3849 GB ]. Thresholds: [ W=(30%) / C=(90%) ].  System Information = [ Linux gearman001.phs.blah.com 2.6.32-504.30.3.el6.x86_64 #1 SMP Thu Jul 9 15:20:47 EDT 2015 x86_64 ].

real    0m0.23s
user    0m0.03s
sys     0m0.02s
SimplisticSpeed
źródło