Como medir no Linux o pico de memória de um aplicativo após o término

11

Como faço para medir o pico de memória de um aplicativo em execução no Linux?

Como executo este aplicativo em lote, não posso mais usar o RSS, pois ele relata a memória atual. Preciso do pico de memória que o aplicativo usou para ser relatado no final.

O VmPeak também não é uma solução, pois relata a memória alocada e também não calcula a partir da RAM real, mas também do Disco Rígido.

des_user
fonte
Em qual SO você está executando o aplicativo?
um CVn
Estou trabalhando no Linux
des_user
Esta discussão deve ser de ajuda para você: serverfault.com/questions/387268/...
Jacob Coleman

Respostas:

13

Aqui estão 2 métodos para rastrear o uso máximo de memória de um processo.

Syrupy

Não usei essa ferramenta, mas parece o que você está procurando. Chama-se Syrupy .

Descrição

Syrupy é um script Python que tira regularmente instantâneos da memória e da carga da CPU de um ou mais processos em execução, para criar dinamicamente um perfil do uso dos recursos do sistema.

Exemplo

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Sim, ironicamente, o comando GNU time pode fornecer o pico de uso de memória de um processo. Ele relata a memória de pico assim: Maximum resident set size (kbytes).

Exemplo

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Referências

slm
fonte
3

Embora o tópico seja bastante antigo, quero compartilhar outro projeto que surgiu do recurso de kernel Linux do cgroups.

https://github.com/gsauthof/cgmemtime :

O cgmemtime mede o uso de memória RSS + CACHE de alto nível de um processo e seus processos descendentes.

Para poder fazer isso, coloca o processo em seu próprio cgroup.

Por exemplo, o processo A aloca 10 MiB e bifurca um filho B que aloca 20 MiB e que bifurca um filho C que aloca 30 MiB. Todos os três processos compartilham uma janela de tempo em que suas alocações resultam no uso correspondente da memória RSS (tamanho do conjunto residente).

A questão agora é: quanta memória é realmente usada como resultado da execução de A?

Resposta: 60 MiB

cgmemtime é a ferramenta para responder a essas perguntas.

Exemplos de uso seriam:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB
Vlad Frolov
fonte
Então, como essa ferramenta poderia ser usada para relatar o pico de uso de RAM de um programa após a sua saída ?
terdon
@terdon Ele usa wait4para capturar a saída do processo em uma combinação com cgroups ( memory.max_usage_in_bytes), o que parece fazer sentido. Mais detalhes estão disponíveis no README no github.
23415 Vlad Frolov
Obrigado, mas meu argumento foi mais sobre sua resposta. Tal como está, não está respondendo à pergunta, apenas apontando para algum recurso externo que possa ser capaz. Além disso, você postou exatamente a mesma resposta em outro lugar, o que gera uma sinalização automática. Edite sua resposta e inclua um exemplo mostrando como este programa pode fazer o que o OP está pedindo.
terdon
2
@terdon Sim, eu fiz! Porque eu procurei a mesma pergunta e as perguntas são praticamente as mesmas, e as respostas são as mesmas: 'parse ps output', o que é uma loucura! Passei uma semana antes de acidentalmente esbarrar no projeto cgmemtime, que é a combinação perfeita para todas essas perguntas que eu comentei!
23415 Vlad Frolov
1
Justo. Seria ótimo se você desse um exemplo de como ele poderia ser usado. Melhoraria sua resposta. De qualquer forma, obrigado por reservar um tempo para postar isso, tenho certeza que outros acharão útil.
terdon