在shell中执行命令并打印出摘要(时间+内存)?

时间:2014-03-20 16:28:57

标签: linux bash shell command-line

很抱歉,如果问题是基本的,那么shell中是否有选项可以显示执行命令所花费的时间和内存量(占用的最大内存量)?

示例:我想调用二进制文件如下:./binary --option1 option1 --option2 option2

执行此命令后,我想知道此命令花了多少时间和内存。

由于

2 个答案:

答案 0 :(得分:3)

time(1)命令,可以作为单独的可执行文件,也可以作为内置的shell,用于测量程序使用的时间,包括挂钟时间和CPU时间。

但衡量一个程序的内存使用情况,甚至同意如何定义它,有点不同。你想要它的分配总和吗?单个时刻分配的最大内存量?您是否对代码所做的事情感兴趣,或者对整个程序行为感兴趣,内存分配器会有什么影响?你如何考虑共享对象使用的内存?或内存映射区域?

Valgrind可能有助于解决与内存相关的一些问题,但它更像是一种开发工具,而不是日常的系统管理员工具。更具体地说,Massif heap profiler可用于分析应用程序的内存使用情况,但它确实会产生可测量的性能影响,尤其是在启用堆栈分析的情况下。

答案 1 :(得分:0)

/proc中有几个文件可能比使用分析器更简单,假设您知道您感兴趣的过程的PID。

最主要的兴趣是/proc/$PID/status,其中列出了(其中包括)虚拟内存峰值和大小(分别为VmPeak,VmSize)和居民"高水位标记"和当前集(分别为VmHWM,VnRSS)

我设置了一个简单的C程序来获取内存,然后将其释放,然后在proc中查看与该程序的PID对应的文件,它似乎验证了联机帮助页。

请参阅man proc以获取您可能感兴趣的文件的完整列表。

这是我用于测试的命令行和程序:

使用

进行监控
PID="<program's pid>"
watch "cat /proc/$PID/status | grep ^Vm"

(使用gcc -o grabmem grabmem.c -std=c99编译)

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

#define INTNUM ( 1024 * 1024 )
#define PASSES 16
int main(){
    int* mems[16];
    int cur = 0;
    while( mems[cur] = (int*)calloc( sizeof( int ), INTNUM ) ){
        for( int i = 0; i < INTNUM; i++)
            mems[cur][i] = rand();
        printf("PID %i Pass %i: Grabbed another %lu of mem.\n",
            (int)getpid(),
            cur,
            sizeof(int) * INTNUM
        );
        sleep( 1 );
        cur++;
        if( cur >= 16 ){
            printf("Freeing memory...");
            for( cur = (PASSES - 1); cur >= 0; cur-- ){
                free(mems[cur] );
                mems[cur] = NULL;
            }
            cur = 0;
            printf("OK\n");
        }
    }
    fprintf(stderr, "Couldn't calloc() memory.\n");
    exit( -1 );
}