是否有像时间一样的命令,但是用于内存使用?

是否有像时间一样的命令,但是用于内存使用?

有没有类似的命令time,但可以报告更多统计数据?如果我能做类似的事情就太好了:

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

如果可以更进一步,那就太好了。现在,为了调试,我要么专心地盯着top(实际上是glances),要么在我的代码中散布语句。

如果有东西可以向我传递命令,那就太棒了。

编辑

我可能已经找到了解决方案:perf在软件包中linux-toolslinux-tools-commonUbuntu 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

有帮助的页面。

答案1

zshtime具有比has更强大的内置命令bash,并且该zsh版本可以报告内存统计信息。

即使您不经常将zsh其用作日常 shell,您也可以在需要收集这些类型的统计信息时运行它。

设置TIMEFMT环境变量以指示所需的输出。这是我的.zshrc文件中的内容(可能有点太花哨了,但我喜欢它):

if [[ `uname` == Darwin ]]; then
    MAX_MEMORY_UNITS=KB
else
    MAX_MEMORY_UNITS=MB
fi

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 '$MAX_MEMORY_UNITS''$'\n'\
'page faults from disk:     %F'$'\n'\
'other page faults:         %R'

(一个复杂的细节:在 Linux 上,最大内存以兆字节为单位;在 macOS 上以千字节为单位。要获取 的值%M,zsh 调用getrusage(),然后使用ru_maxrss / 1024。但在 Linux 上,ru_maxrss单位是千字节,而在 Mac 上,单位是字节。请参见man getrusage两个平台。)

示例输出:

% 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:                3 MB
page faults from disk:     0
other page faults:         337

答案2

GNU 时间可以报​​告比 Bash 内置版本更多的信息;使用command time而不是仅仅time调用它,并查看手册页或信息了解详细信息。

答案3

根据 Richard 的回答,您可以创建一个别名来使用 GNU 时间并提供平均和最大内存信息:

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

或者调整你的环境:

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

但请注意,这只对/usr/bin/time默认情况下通常不调用的内容有效。

从手册页中:

K 进程的平均总(数据+堆栈+文本)内存使用量,以千字节为单位。

M 进程生命周期内的最大驻留集大小,以千字节为单位。

答案4

您可以使用/usr/bin/time不同于的time

使用它-v,您就可以得到您想要的东西,而无需任何额外的安装。

例子:

$ /usr/bin/time -v cat xxx.txt > /dev/null
    Command being timed: "cat xxx.txt"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 100%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.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): 2024
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 121
    Voluntary context switches: 0
    Involuntary context switches: 0
    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

相关内容