首页 > 解决方案 > GNU 时间内存输出是否也考虑了子进程?

问题描述

在运行 GNU time ( /usr/bin/time) 并检查内存消耗时,它的输出是否考虑了我的目标程序的子进程的内存使用情况?

在 GNU 的时间手册页中找不到任何内容。

标签: linuxtimegnu

解决方案


是的。

您可以通过以下方式轻松检查:

$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(2*1024*1024)" & wait'
8132
$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(8*1024*1024)" & wait'
20648

GNU timewait4在 Linux 上使用系统调用(通过wait3glibc 包装器),虽然没有记录,但它返回的资源使用情况struct rusage还包括等待的进程的后代。您可以查看 in 的内核实现wait4kernel/exit.c了解所有详细信息:

$ grep -C2 RUSAGE_BOTH include/uapi/linux/resource.h
#define RUSAGE_SELF     0
#define RUSAGE_CHILDREN (-1)
#define RUSAGE_BOTH     (-2)            /* sys_wait4() uses this */
#define RUSAGE_THREAD   1               /* only the calling thread */

FreeBSD 和 NetBSD 也有一个wait6系统调用,它为等待的进程及其后代返回单独的信息。他们还清楚地记录了由孙子归还的诡计wait3wait4还包括孙子孙女。


推荐阅读