Como posso monitorar o uso da memória?

265

Eu costumava topver o uso da memória no momento. Mas eu gostaria de monitorar o uso da memória por um período de tempo. Por exemplo, inicie o monitoramento e execute alguns comandos, e finalize o monitoramento e veja a quantidade de memória usada durante o período.

Como posso fazer isso no Ubuntu Server?

Acho que eu poderia iniciar um cronjob a cada 5 segundos mais ou menos e invocar um comando que registrasse o uso atual da memória em um arquivo de texto. Mas que comando devo usar para obter o uso atual da memória em um formato fácil de registrar em um arquivo de texto?

Jonas
fonte

Respostas:

322

Eu recomendo combinar as respostas anteriores

watch -n 5 free -m

Observe que o Linux gosta de usar qualquer memória extra para armazenar em cache os blocos do disco rígido . Então você não quer ver apenas o de graça Mem. Você deseja olhar para a freecoluna da -/+ buffers/cache:linha. Isso mostra quanta memória está disponível para aplicativos. Então eu apenas corri free -me consegui isso:

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

Eu sei que estou usando 1528 MB e tenho 2170 MB grátis.

Nota: Para interromper esse watchciclo, basta pressionar Ctrl+ C.

Justin Force
fonte
1
Obrigado, isso é informativo. Mas na coluna usada que você possui primeiro 2896e depois 1528nos buffers, isso não significa que você está usando 2896 + 1528?
Jonas
8
Mem: usedé a sua memória total usada. -/+ buffers/cache: usedé a sua memória total usada menos buffers e cache. Eu sei que a saída parece engraçada, mas nenhuma aritmética é necessária aqui. Você está apenas procurando usado / gratuito na linha - / + buffers / cache.
Justin Force
6
A opção -h é muito melhor
frmdstryr 19/10/17
1
@frmdstryr Good point! -h / - humano não existia quando eu escrevi isso, no entanto. gitlab.com/procps-ng/procps/commit/…
Justin Force
3
@ cbradsh1 Você pode simplesmente fazer free -h, por exemplo, watch -n 5 free -hobter saída "legível por humanos", por exemplo, em 2.1Gvez de 2170na saída.
Justin Force
213

Eu acho que htopé a melhor solução.

  • sudo apt-get install htop

Dessa forma, você notará quais programas estão usando mais RAM. e você pode encerrar facilmente um, se quiser. Aqui está uma captura de tela!

Alvar
fonte
2
htopé legal porque é mais "gráfico" e possivelmente mais fácil de ler do que free.
mjswensen
1
Eu não entendo a saída. A RESmemória usada por esse aplicativo está em MB? Então o que é SHR?
faizal
1
@faizal: memória virtual, reservada e compartilhada.
WitchCraft 19/09/2015
1
como htopmostra o 'uso da memória por um período de tempo'?
dangel
htop -s M_SHARE htop -s TIME
Tomachi
40

Se você estiver procurando por uma boa análise da memória usada por cada processo em execução, recomendo verificar o arquivo ps_mem.py (encontrado aqui em pixelbeat.org).

Sei que, nos comentários acima, você mencionou querer um instantâneo de uma linha gratuitamente , mas achei que outros poderiam achar isso útil.

Exemplo de saída:

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

A única parte de que não gosto é o fato de o script afirmar exigir privilégios de root. Ainda não tive a oportunidade de ver exatamente por que esse é o caso.

Jason Mock
fonte
Gostaria de saber se a memória é compartilhada entre threads. É compartilhado entre processos, não é? Pelo menos no Windows ...
Thomas Weller
Portanto, nesse caso, a memória compartilhada refere-se a páginas mapeadas por vários processos na forma de bibliotecas compartilhadas. Além disso, no contexto de aplicativos multithread, todo o espaço da memória do processo é acessível por todos os threads desse processo.
Jason Mock
4
Agora disponível em PyPI ( pip install ps_mem) e no GitHub .
Leif Arne Storset
@ ThomasWeller: Sim, os threads sempre compartilham memória, enquanto os processos podem compartilhar parte ou a totalidade em determinadas condições.
Leif Arne Storset
para isso eu uso o gnome-system-monitor
24

Use o comando free . Por exemplo, esta é a saída de 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 /+ retornará apenas a segunda linha:

-/+ buffers/cache:        947       1064
Isaías
fonte
Obrigado, parece ótimo. Portanto, esse 947é o uso da memória menos a memória usada para buffers e caches?
Jonas
11

O comando watch pode ser útil. Tente watch -n 5 freemonitorar o uso da memória com atualizações a cada cinco segundos.

mgunes
fonte
Obrigado, isso foi ótimo! No entanto, eu preferiria obter o uso da memória em uma única linha, por isso é fácil fazer logon em um arquivo de texto.
Jonas
8

Você pode fazer isso 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
Amir
fonte
1
adicionar relógio à frente deste comando o torna incrível! como emwatch cat /proc/meminfo
Elder Geek
O freecomando pega suas informações /proc/meminfoe as apresenta de maneira compacta. Use free -hpara saída legível por humanos.
LoMaPh
4

Para o monitoramento visual do uso geral da RAM, se você usar o Byobu , ele manterá o uso da memória no canto inferior direito do terminal e será executado enquanto você estiver em qualquer sessão do terminal.

Como você pode ver na captura de tela, minha máquina virtual tem um tempo de atividade de 1h3m, carga 0,00, processador de 2,8 GHz (virtual) e 994 MB (21%) da RAM disponível no sistema.

Byobu em uso

bafromca
fonte
3

Solução e saída de linha única:

free -m | grep "Mem:"

Aqui está um exemplo da saída esperada:

Mem:           3944         652         302          18        2990        2930
Tim
fonte
1

Eu usaria cactos . Isso representará graficamente o uso da memória, etc., durante um período de tempo, e você poderá verificar o uso usando o navegador da web.

Matt
fonte
1

Monitorando o uso da memória

Estou mais de acordo com uma das postagens anteriores que mencionaram o Cacti como uma ótima maneira de monitorar o uso da memória. No entanto, como parece que os cactos não são mais populares no mainstream, existe um aplicativo gráfico alternativo chamado Graphite.

O Graphite é relativamente fácil de instalar em um servidor ubuntu e para instalá-lo, você pode conferir este link para os procedimentos de instalação fáceis de seguir.

Após a instalação do grafite, agora você pode enviar métricas de memória para ele, no intervalo que desejar; a cada 5 segundos, a cada minuto, a cada hora ... etc.

Para representar graficamente as métricas de memória, como já sugerido nas postagens anteriores, você pode escrever seu próprio script usando as ferramentas do sistema para reunir as informações de memória necessárias. Ou você pode usar um plug-in snmp pré-escrito que fará todo o trabalho para você.

Se você deseja escrever seu próprio script de memória, é aconselhável garantir que você leve em consideração a memória em cache e em buffer ao calcular a memória usada; caso contrário, você acabará coletando dados falsos.

Se você deseja utilizar um plug-in snmp que já faz todos os cálculos necessários para você, aqui está um link para um que funciona muito bem: checkMemoryviaSNMP .

Prós do SNMP:

Eu tenho o snmp instalado em todos os nós remotos que monitoro. Isso me permite monitorar todos os meus sistemas de um (s) servidor (es) central (is) , sem precisar copiar ou colocar um plug-in nos nós remotos.

Contras do SNMP:

Você precisaria garantir que o agente snmp esteja instalado em cada um dos nós remotos nos quais deseja monitorar a memória. No entanto, esta instalação será um contrato único. Se você estiver usando ferramentas de automação, como chef ou fantoche ou ferramentas similares em seu ambiente, isso não será um problema.

Configuração do agente SNMP no (s) nó (s) remoto (s):

Após a instalação do agente snmp, simplesmente vi o arquivo /etc/snmpd/snmpd.conf e adicione esta linha a ele:

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

Em seguida, reinicie o agente snmpd, com:

/etc/init.d/snmpd restart

Em seguida, no servidor central, no qual você monitora todos os outros servidores, você pode executar o seguinte comando:

$ 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
fonte