很抱歉,如果问题是基本的,那么shell中是否有选项可以显示执行命令所花费的时间和内存量(占用的最大内存量)?
示例:我想调用二进制文件如下:./binary --option1 option1 --option2 option2
执行此命令后,我想知道此命令花了多少时间和内存。
由于
答案 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 );
}