Medindo o uso de RAM de um programa

44

time é um comando brilhante se você quiser descobrir quanto tempo de CPU um determinado comando leva.

Estou à procura de algo semelhante que possa medir o uso máximo de RAM do programa e de qualquer criança. De preferência, deve distinguir entre a memória alocada que foi usada e não utilizada. Talvez ele possa até mesmo dar o uso mediano de memória (assim, o uso de memória que você deve esperar ao executar por um longo tempo).

Então, eu gostaria de fazer:

rammeassure my_program my_args

e obter uma saída semelhante a:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

Eu olhei para memusg link mas considero isso um tanto quanto um hack.

    
por Ole Tange 16.08.2011 / 16:18

5 respostas

23

Você pode usar tstime para medir o alto uso de memória de água (RSS e virtual) de um processo.

Por exemplo:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

Também suporta um modo de saída mais fácil de analisar ( -t ).

    
por 16.08.2011 / 21:38
28

time é um built-in do seu shell. Se você gosta de time , mas precisa de mais informações, experimente o GNU time no modo detalhado ( -v ):

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

Pesquise o pacote "time" ou "gnutime" no seu gerenciador de pacotes.

    
por 16.08.2011 / 19:41
17

Talvez seja um exagero, mas acabei de descobrir que valgrind tem uma boa ferramenta chamada massif . Eu testei em xterm :

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

E você obtém um bom gráfico de uso de memória:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

junto com informações de uso de memória excessivamente detalhadas. Detalhes no manual de valgrind .

Os programas serão executados cerca de 20 vezes mais lentamente. Além disso, executei alguns comandos dentro do xterm . A pegada de memória deles foi levada em conta porque a --trace-children=yes da opção está lá!

    
por 16.08.2011 / 18:30
6

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

link :

cgmemtime measures the high-water RSS+CACHE memory usage of a process and its descendant processes.

To be able to do so it puts the process into its own cgroup.

For example process A allocates 10 MiB and forks a child B that allocates 20 MiB and that forks a child C that allocates 30 MiB. All three processes share a time window where their allocations result in corresponding RSS (resident set size) memory usage.

The question now is: How much memory is actually used as a result of running A?

Answer: 60 MiB

cgmemtime is the tool to answer such questions.

    
por 23.03.2015 / 20:12
3

Parece que o tstime não funciona mais em não-raiz no Linux > = 3.0. Aqui está um utilitário de pesquisa que escrevi para resolver o problema: link

    
por 30.08.2012 / 19:26