Quanta RAM esse aplicativo está usando?

10

Se eu executar top -cou htopobter processos com o consumo de memória, mas não é o que eu quero ver.

Existe uma linha de comando que permite ver o consumo de RAM de um determinado aplicativo?

Por exemplo, quero ver o consumo de RAM do servidor da web Apache (não verificando todos os processos que ele executa)


fonte
Obrigado. O melhor que posso encontrar nele é um consumo de memória por processo, que coisa topo -c já me dá

Respostas:

4

Há uma explicação detalhada muito boa aqui: https://blogs.kde.org/2005/09/15/measuring-memory-usage

Mas essencialmente: você precisa realmente entender e entender como o aplicativo está configurado.

Então, por exemplo, olhando para o mysql:

  PID  PPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                    
 6004 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:40.33 mysqld                                                                                                                                            
16115 16085 composit  20   0 37900  27m 2908 S    0  0.2   0:00.37 mysqld                                                                                                                                            
16116 16115 composit  20   0 37900  27m 2908 S    0  0.2   2:07.34 mysqld                                                                                                                                            
16117 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.00 mysqld                                                                                                                                            
16118 16116 composit  20   0 37900  27m 2908 S    0  0.2   3:19.79 mysqld                                                                                                                                            
16119 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.01 mysqld                                                                                                                                            
16120 16116 composit  20   0 37900  27m 2908 S    0  0.2   5:31.09 mysqld                                                                                                                                            
16121 16116 composit  20   0 37900  27m 2908 S    0  0.2  14:19.53 mysqld                                                                                                                                            
16122 16116 composit  20   0 37900  27m 2908 S    0  0.2  36:13.67 mysqld                                                                                                                                            
16123 16116 composit  20   0 37900  27m 2908 S    0  0.2  30:30.64 mysqld                                                                                                                                            
16124 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.15 mysqld                                                                                                                                            
16493 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.00 mysqld    

A memória total usada é de cerca de 25 MB (pegue o RES de 27 MB e subtraia o compartilhado (SHR))

Eu validei isso verificando o uso total de memória (free -m, + / buffers / cache) antes e depois de emitir um "killall mysqld". Após matar todos os processos do mysqld, o uso da memória caiu em 25 MB de acordo com "free -m".

Se você perceber que cada processo possui colunas VIRT, RES e SHR idênticas, provavelmente são apenas threads do mesmo processo. (As bibliotecas Linux mais antigas tratavam do encadeamento gerando vários processos reais que essencialmente ocupavam a mesma memória)

Se eles forem diferentes, você poderá estimar fazendo um SUM de (RES - SHR). Mas isso só funciona se os processos forem de fato processos separados e não apenas threads do mesmo processo. Olhar para o PPID (Parent Process ID) também ajuda. Se todos eles tiverem o mesmo pai, provavelmente serão apenas threads (embora não necessariamente).

Infelizmente, não existe uma maneira fácil e muito boa de responder isso no Linux. A única maneira fácil é verificar "livre" imediatamente antes de encerrar o processo e verificar novamente imediatamente depois. observe a linha "- / + buffers / cache:" e veja quanto uso de memória diminuiu e que lhe dirá quanto estava usando.

irwinr
fonte
2

Com um pouco de ajuda man pse esta ótima resposta ...

ps -up $(pidof PROCESS_NAME)

Por exemplo:

[wilf@comp ~]$ ps -up $(pidof firefox)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
wilf      1619  8.9  5.6 1464216 342396 ?      Sl   17:56   1:36 /usr/lib64/firefox/firefox
[wilf@comp ~]$ 

Outras maneiras:

cat /proc/$(pidof firefox)/status | grep VmSize

Isso pode ser executado sem -xe tail -1:

pmap -x $(pidof firefox) | tail -1

mostra apenas porcentagem:

top -p $(pidof firefox)

Além disso, durante o uso, topvocê pode pressionar ipara ignorar os processos ociosos / zumbis para facilitar a leitura: saída superior muito menor

Wilf
fonte
mas um aplicativo inicia vários processos, como posso saber qual é o principal?
acho? Eu acho que pmapmostra muitas coisas sobre os recursos que o PID está usando. As informações são fornecidas com base no nome do processo e no PID encontrado usando-o pidof, portanto, o processo principal é exibido com qualquer nome que você fornecer (eu acho, não sei se isso se refere aos processos-pai)
Wilf
2
Isso separa a saída por processo. Você não receberá a quantidade total de memória usada por todos os processos do Apache dessa maneira. Você precisa resumir, mas contando regiões compartilhadas apenas uma vez (essa é a parte difícil).
Gilles 'SO- stop be evil'