测量许多进程的峰值内存使用情况

测量许多进程的峰值内存使用情况

我有一个 bash 脚本,它调用各种其他脚本,其中一个脚本有一堆命令,可以在屏幕会话中启动脚本,如下所示:

screen -S $SESSION_NAME -p $f -X stuff "$CMD\n"

使用 /usr/bin/time -v 运行我的 top 脚本会捕获所有峰值内存使用情况吗?我想让这个脚本作为 cron 作业运行,但我需要知道在给计算机上的其他用户造成问题之前需要多少内存。

谢谢

答案1

是与否,GNU时代试图展示一切的总结/巅峰。

您可以使用一个小的 C 程序来检查,例如mal.c

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    long bytes;
    void *buf;

    bytes = atol(argv[1]) * 1024;
    buf = malloc(bytes);
    memset(buf, 0, bytes);
    printf("");
    return 0;
}

并看到:

$ gcc mal.c -o mal
$ /usr/bin/time -f "%M" sh -c "./mal 5000"
5452
$ /usr/bin/time -f "%M" sh -c "./mal 10000"
10452
$ /usr/bin/time -f "%M" sh -c "./mal 5000; ./mal 10000"
10452

正如 getrusage(2) 手册页 (Linux) 中所述,这是任何单个子进程的最大 RSS,而不是进程树的瞬时累积 RSS,所有进程同时使用内存

换句话说,它没有总结并行或后台进程,如您所见:

$ /usr/bin/time -f "%M" sh -c "./mal 1000000 & ./mal 5000"
5452

这也意味着您需要time在屏幕会话内部运行来测量 $CMD 而不仅仅是屏幕。

供参考与 shell 内置的区别在于,时间二进制文件不能直接总结管道或函数:

$ time /bin/sleep 1 | /bin/sleep 2
 real 2.00
 user 0.00
 sys 0.00

$ /usr/bin/time -p  /bin/sleep 1 | /bin/sleep 2
 real 1.00
 user 0.00
 sys 0.00

相关内容