【问题标题】:Does GNU time memory output account for child processes too?GNU 时间内存输出是否也考虑了子进程?
【发布时间】:2019-05-02 15:05:46
【问题描述】:

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

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

【问题讨论】:

  • 你能发布时间实用程序的示例输出吗?你能准确指出你问的是哪个测量值吗?关于%K?我可以看到 gnu time interanlly 使用 wait3 并且只解析返回的 rusage(它也调用了一些 timesgettimeofday 但与内存测量无关)。 wait3 说“返回关于孩子的资源使用信息” - 我认为这意味着只有一个孩子的资源信息。
  • 1) export TIME="\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem" 2) 运行以下/usr/bin/time my_program.sh。来自/usr/bin/time 的输出:0:00.74 real, 1.16 user, 0.14 sys, 0 amem, 68636 mmem
  • @KamilCuk 你错了。您应该始终对 linux 文档持保留态度;-)

标签: linux time gnu


【解决方案1】:

是的。

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

$ /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 时间在 Linux 上使用 wait4 系统调用(通过 wait3 glibc 包装器),虽然没有记录,但它在 struct rusage 中返回的资源使用情况还包括等待的进程的后代。您可以在kernel/exit.c 中查看wait4 的内核实现以了解所有详细信息:

$ 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 返回的诡计也包括孙子。

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多