Come posso monitorare l'utilizzo della memoria?


265

Al momento ho usato topl'utilizzo della memoria. Ma vorrei monitorare l'utilizzo della memoria per un periodo di tempo. Ad esempio, avviare il monitoraggio, quindi eseguire alcuni comandi e infine interrompere il monitoraggio e vedere quanta memoria è stata utilizzata durante il periodo.

Come posso farlo su Ubuntu Server?

Immagino di poter avviare un cronjob ogni 5 secondi circa e di invocare un comando che registra l'utilizzo corrente della memoria in un file di testo. Ma quale comando dovrei usare per ottenere l'attuale utilizzo della memoria in un formato facile da accedere a un file di testo?

Risposte:


322

Consiglio di combinare le risposte precedenti

watch -n 5 free -m

Nota che a Linux piace usare qualsiasi memoria aggiuntiva per memorizzare nella cache i blocchi del disco rigido . Quindi non vuoi guardare solo il libero Mem. Vuoi guardare la freecolonna della -/+ buffers/cache:riga. Questo mostra quanta memoria è disponibile per le applicazioni. Quindi ho appena corso free -me ottenuto questo:

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

So che sto usando 1528 MB e ho 2170 MB gratuiti.

Nota: per interrompere questo watchciclo è sufficiente premere Ctrl+ C.


1
Grazie, è informativo. Ma sulla colonna usata che hai prima 2896e poi 1528per i buffer, questo non significa che stai usando 2896 + 1528?
Jonas,

8
Mem: usedè la tua memoria utilizzata totale. -/+ buffers/cache: usedè la memoria totale utilizzata meno buffer e cache. So che l'output sembra divertente, ma qui non è richiesta alcuna aritmetica. Stai solo cercando usato / libero nella riga - / + buffer / cache.
Forza Justin,

6
L'opzione -h è molto più bella
frmdstryr,

1
@frmdstryr Ottimo punto! -h / - umano non esisteva quando ho scritto questo, però. gitlab.com/procps-ng/procps/commit/…
Justin Force

3
@ cbradsh1 Si può semplicemente fare free -h, ad esempio watch -n 5 free -hper ottenere un output "leggibile dall'uomo", ad esempio 2.1Ginvece che 2170nell'output.
Justin Force,

213

Penso che htopsia la soluzione migliore.

  • sudo apt-get install htop

In questo modo noterai quali programmi utilizza la maggior parte della RAM. e puoi facilmente terminarne uno se lo desideri. Ecco uno screenshot!


2
htopè bello perché è più "grafico" e forse più facile da leggere di free.
mjswensen,

1
non capisco l'output. La RESmemoria è utilizzata da quell'applicazione in MB? Allora cos'è SHR?
faizal

1
@faizal: memoria virtuale, riservata e condivisa.
WitchCraft,

1
come htopti mostra "l'utilizzo della memoria per un periodo di tempo"?
dangel

htop -s M_SHARE htop -s TIME
Tomachi,

40

Se stai cercando una bella suddivisione della memoria utilizzata da ogni processo in esecuzione, allora potrei raccomandare di dare un'occhiata a ps_mem.py (disponibile qui su pixelbeat.org).

Lo so nei commenti sopra, hai menzionato che vuoi uno snapshot di una riga da libero , ma ho pensato che altri potrebbero trovarlo utile.

Esempio di output:

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

L'unica parte che non mi piace è il fatto che lo script afferma di richiedere i privilegi di root. Non ho ancora avuto l'opportunità di vedere esattamente perché questo è il caso.


Mi chiedo se la memoria sia condivisa tra i thread. È condiviso tra processi, no? Almeno su Windows ...
Thomas Weller,

Quindi, in questo caso, la memoria condivisa fa riferimento a pagine mappate da più processi sotto forma di librerie condivise. Inoltre, nel contesto di applicazioni multi-thread, l'intero spazio di memoria del processo è accessibile da tutti i thread in quel processo.
Jason Mock,

4
Ora disponibile in PyPI ( pip install ps_mem) e su GitHub .
Leif Arne Storset,

@ThomasWeller: Sì, i thread condividono sempre la memoria, mentre i processi possono condividerne alcuni o tutti in determinate condizioni.
Leif Arne Storset,

per questo uso gnome-system-monitor

24

Usa il comando gratuito . Ad esempio, questo è il risultato di 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 /+ restituirà solo la seconda riga:

-/+ buffers/cache:        947       1064

Grazie, sembra fantastico. Quindi questo 947è l'utilizzo della memoria meno la memoria utilizzata per buffer e cache?
Jonas,

11

Il comando watch può essere utile. Prova watch -n 5 freea monitorare l'utilizzo della memoria con aggiornamenti ogni cinque secondi.


Grazie, è stato fantastico! Tuttavia, preferirei ottenere l'utilizzo della memoria su una sola riga, quindi è facile accedere a un file di testo.
Jonas,

8

Puoi farlo usando 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

1
l'aggiunta di watch nella parte anteriore di questo comando lo rende fantastico! come inwatch cat /proc/meminfo
Elder Geek,

Il freecomando prende le sue informazioni /proc/meminfoe le presenta in modo compatto. Utilizzare free -hper output leggibile dall'uomo.
LoMaPh

4

Per il monitoraggio visivo dell'utilizzo complessivo della RAM, se si utilizza Byobu , manterrà l'utilizzo della memoria nell'angolo in basso a destra del terminale e verrà eseguito durante qualsiasi sessione del terminale.

Come puoi vedere dallo screenshot, la mia macchina virtuale ha un tempo di attività di 1h3m, carico di 0,00, processore da 2,8 GHz (virtuale) e 994 MB (21%) di RAM disponibile sul sistema.

Byobu in uso


3

Soluzione a linea singola e output:

free -m | grep "Mem:"

Ecco un esempio dell'output previsto:

Mem:           3944         652         302          18        2990        2930

1

Vorrei usare i cactus . Questo rappresenterà graficamente l'utilizzo della memoria, ecc. Per un certo periodo di tempo, e sarai in grado di verificarne l'utilizzo utilizzando il tuo browser web.


1

Monitoraggio dell'utilizzo della memoria

Sono più in linea con uno dei post precedenti che menziona Cactus come un ottimo modo per monitorare l'utilizzo della memoria. Tuttavia, poiché sembra che i cactus non siano più popolari nel mainstream, esiste un'applicazione grafica alternativa chiamata Graphite.

La grafite è relativamente facile da installare su un server Ubuntu e per installarlo, puoi consultare questo link per le procedure di installazione facili da seguire.

Dopo aver installato la grafite, ora è possibile inviare ad esso metriche di memoria, a qualunque intervallo desiderato; ogni 5 secondi, ogni minuto, ogni ora ... ecc.

Per rappresentare graficamente le metriche di memoria, come già suggerito nei post precedenti, è possibile scrivere il proprio script utilizzando gli strumenti di sistema per raccogliere le informazioni di memoria necessarie. In alternativa, puoi utilizzare un plug-in snmp pre-scritto che farà tutto il lavoro per te.

Se desideri scrivere il tuo script di memoria, sarà saggio assicurarti di tenere conto della memoria bufferizzata e memorizzata nella cache durante il calcolo della memoria utilizzata, altrimenti finirai per raccogliere dati falsi.

Se desideri invece utilizzare un plug-in snmp che esegue già tutti i calcoli necessari per te, ecco un link a uno che funziona abbastanza bene: checkMemoryviaSNMP .

Pro di SNMP:

Ho snmp installato su tutti i nodi remoti che controllo. Ciò mi consente di monitorare tutti i miei sistemi da uno o più server centrali , senza dover copiare o inserire un plug-in sui nodi remoti.

Contro di SNMP:

Dovresti assicurarti che l' agente snmp sia installato su ciascuno dei nodi remoti su cui desideri monitorare la memoria. Tuttavia, questa installazione sarà un affare una tantum. Se stai utilizzando strumenti di automazione come chef o burattino o strumenti simili nel tuo ambiente, questo non è affatto un problema.

Configurazione dell'agente SNMP sui nodi remoti:

Dopo aver installato l'agente snmp, vi è semplicemente il file /etc/snmpd/snmpd.conf e aggiungere questa riga ad esso:

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

Quindi riavviare l'agente snmpd, con:

/etc/init.d/snmpd restart

Quindi, sul tuo server centrale, da cui invece per monitorare tutti gli altri server, puoi eseguire il comando seguente:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.