Czy jest jakieś polecenie podobne do czasu, ale do wykorzystania pamięci?

34

Czy jest jakieś polecenie time, ale to raportuje więcej statystyk? Byłoby wspaniale, gdybym mógł zrobić coś takiego:

$ statistics some_command
time:
    real    0m3.002s
    user    0m0.000s
    sys     0m0.000s
memory:
    min     41K
    peak    2.5M
    mean    1.1M
. . .

Gdyby mogło pójść jeszcze dalej, byłoby świetnie. W tej chwili albo do debugowania, albo patrzę uważnie na top(właściwie glances), albo rozsypuję instrukcje w całym kodzie.

Gdybym mógł przekazać polecenie, byłoby to fantastyczne.

EDYTOWAĆ

Mogłem znaleźć rozwiązanie: perfw pakiecie linux-toolsi linux-tools-commonna Ubuntu 12.04.

$ perf stat ./someprocess
Performance counter stats for './someprocess':

      12007.384578 task-clock                #    0.996 CPUs utilized          
             1,092 context-switches          #    0.000 M/sec                  
                16 CPU-migrations            #    0.000 M/sec                  
           295,102 page-faults               #    0.025 M/sec                  
    40,553,682,299 cycles                    #    3.377 GHz                     [83.33%]
    18,400,458,723 stalled-cycles-frontend   #   45.37% frontend cycles idle    [83.35%]
     8,356,832,355 stalled-cycles-backend    #   20.61% backend  cycles idle    [66.64%]
    56,930,684,595 instructions              #    1.40  insns per cycle        
                                             #    0.32  stalled cycles per insn [83.34%]
     9,083,443,825 branches                  #  756.488 M/sec                   [83.35%]
         3,431,737 branch-misses             #    0.04% of all branches         [83.33%]

      12.051963969 seconds time elapsed

( Strona, która pomogła. )

Piotr
źródło
3
W perfwynikach nie ma statystyk pamięci .
BatchyX
„jak czas, ale dla pamięci” naprawdę nie ma sensu. Co dokładnie chcesz wiedzieć? Pamięć nie jest miarą.
Der Hochstapler
1
Czy chcesz przeprowadzić kontrolę aplikacji, którą tworzysz? Jeśli tak, w jakim języku?
dset0x

Odpowiedzi:

28

zshma mocniejsze wbudowane timepolecenie niż bashma, a zshwersja może raportować statystyki pamięci.

Nawet jeśli nie używasz regularnie zshjako codziennej powłoki, możesz po prostu uruchomić ją, gdy potrzebujesz zebrać tego rodzaju statystyki.

Ustaw TIMEFMTzmienną środowiskową, aby wskazać pożądany wynik. Oto, co mam w swoim .zshrcpliku (może trochę zbyt fantazyjne, ale mi się podoba):

TIMEFMT='%J   %U  user %S system %P cpu %*E total'$'\n'\
'avg shared (code):         %X KB'$'\n'\
'avg unshared (data/stack): %D KB'$'\n'\
'total (sum):               %K KB'$'\n'\
'max memory:                %M MB'$'\n'\
'page faults from disk:     %F'$'\n'\
'other page faults:         %R'

Przykładowe dane wyjściowe:

% time ls
[... the output of ls, followed by:]
ls -G   0.00s  user 0.00s system 91% cpu 0.004 total
avg shared (code):         0 KB
avg unshared (data/stack): 0 KB
total (sum):               0 KB
max memory:                668 MB
page faults from disk:     0
other page faults:         337
Mike Morearty
źródło
Twoja odpowiedź bardzo mi pomogła, ale mam pytanie: czy „maksymalna pamięć” w MB? Myślę, że to KB, a nawet B.
Andres
Cieszę się, że pomogło @Andres. W moich testach „maksymalna pamięć” jest w MB, ale możesz to przetestować samodzielnie, kompilując gist.github.com/mmorearty/fa34c0f29abe454fd14b i uruchamiając go w Zsh np time malloc-bytes 10000000. Spowoduje to malloc 10 megabajtów, więc spróbuj, a następnie sprawdź, co zgłasza Zsh.
Mike Morearty,
Według dokumentacji Zsh %M maksymalna pamięć jest w megabajtach.
gerrard00,
%Mraporty w kilobajtach
Antti Haapala
16

Czas GNU może zgłosić nieco więcej informacji niż wersja wbudowana w Bash; użyj command timeraczej niż tylko timedo jego wywołania i zobacz stronę podręcznika lub informacje, aby uzyskać szczegółowe informacje.

Richard Kettlewell
źródło
2
Lub zadzwoń/usr/bin/time -v ./my_command.sh
ostrokach
3

Na podstawie odpowiedzi Richarda możesz utworzyć alias, aby wykorzystać czas GNU i podać informacje o średniej i maksymalnej pamięci:

alias time="$(which time) -f '\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'"

lub dostosuj swoje środowisko:

export TIME='\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'

Należy jednak pamiętać, że działa to tylko w przypadku, /usr/bin/timegdy często nie jest wywoływane domyślnie.

Ze strony podręcznika:

K Średnie całkowite wykorzystanie procesu (dane + stos + tekst) w procesach, w kilobajtach.

M Maksymalny rozmiar zestawu rezydenta procesu podczas jego trwania, w kilobajtach.

Dej
źródło