Semelhante à perguntaComo registrar a carga da CPU?, gostaria de registrar a memória de um processo.
O processo que desejo registrar foi encerrado em um servidor remoto e quero descobrir a carga da CPU e o uso de memória antes de ser encerrado.
[atualizar]
Tanto o pequeno script python de Stefano Palazzo quanto
Os valores de saída de uma linha de Michał são menores do que em top
CPU e Mem. Você tem uma ideia do porquê?
saída superior:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
produza o script python de Stefano Palazzo:
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
Responder1
Você pode criar uma linha no shell:
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
para registrar o processo com pid=123 apenas:
logpid 123
ou para ver e gravar o log no arquivo:
logpid $$ | tee /tmp/pid.log
Se desejar que outros dados sejam registrados, modifique -o {this}
as opções. Consulte man ps
a seção "ESPECIFICADORES DE FORMATO PADRÃO" para obter os parâmetros disponíveis para uso. Se você quiser uma resolução de tempo diferente, altere sleep {this}
a função logpid()
.
Responder2
Se você está precisamente atrás das top
estatísticas, você pode executar top
em modo lote especificando o pid do processo que você está procurando. Tomando o exemplo desta página (http://www.dedoimedo.com/computers/linux-cool-hacks.html) se você digitou
top -b -d 10 -n 3 >> top-file
Você "teria a execução superior no modo em lote (-b). Ele será atualizado a cada 10 segundos, conforme especificado pelo sinalizador de atraso (-d), para uma contagem total de 3 iterações (-n). A saída será enviada para um arquivo." Inclusive -p
você pode especificar o pid
processo que deseja. É claro que isso retornará mais do que apenas CPU e RAM, mas conterá esses campos. No meu caso, por exemplo, eu obteria o seguinte ao monitorar o pid 9189 usando top -b -d 10 -n 3 -p 9189 >> ~/top-file
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
Responder3
Este script python simples deve fazer o que você deseja:
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __name__ == '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
Primeiro você precisa descobrir o ID do processo do programa que deseja monitorar e, em seguida, executar o script com o PID como argumento:
python log.py 3912
Ele imprimirá o uso da CPU e o uso da memória RAM em porcentagem duas vezes por segundo:
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
Você pode então redirecionar sua saída para um arquivo para importá-lo posteriormente para uma planilha ( python log.py 9391 > firefox_log.txt
) e importar os dados para uma planilha selecionando Tab
como separador.
O programa é encerrado quando você pressiona Ctrl+C ou quando o processo é encerrado.
Responder4
Procpathpode ser usado para registrar métricas Procfs de um aplicativo (árvores de processos), incluindo uso de CPU e tamanho do conjunto residente (RSS). Divulgação completa: eu escrevi.
Tomemos o Firefox como exemplo. Na minha máquina, sua árvore de processos é assim:
/usr/lib/firefox/firefox
├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
└─ /usr/lib/firefox/firefox -contentproc -childID 8 ...
Com o Procpath você pode coletar métricas de processo desta árvore como a seguir (e vera documentaçãose quiser perguntar ao supervisor de processo da sua aplicação, digamos systemd ou Docker, o PID raiz):
procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'
Com este comando, o Procpath irá coletar e registrar as métricas Procfs desta árvore uma vez a cada 10 segundos. Você pode deixá-lo rodando em um multiplexador de terminal (como o Byobu) para executá-lo em segundo plano no seu servidor.
Quando seu aplicativo travar novamente, você poderá usar este comando para visualizar o uso da CPU e o tamanho do conjunto residente do aplicativo.
procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer