一周前,我启动了如下模拟:
make rebuild; time make run
我使用该命令time
记录了每种情况下使用的 CPU 时间。
一周后,模拟完成,但令我惊讶的是,时间统计数据没有显示。目标make run
基本上只是:
python SCRIPTNAME | tee SCRIPTNAME.log
事实上,我发现与最后 4 或 5 次迭代(10000 次)相对应的输出无处可寻。它既没有显示在屏幕上,也没有附加到日志文件中)
我的问题是:
怎么可能?
是否可以
time
定期显示时间统计信息,以避免在我描述的情况下必须重新运行整个模拟?
答案1
输出time
显示在 stderr 上。因此,如果您想在日志文件中捕获其输出,则需要重定向 stderr。
但请注意, in zsh
like in ksh
,time
是一个关键字,
time cmd 2>&1 | tee log
实际上次 cmd 2>&1 | tee log
(以及两者cmd
和tee
)。如果您只想计时cmd
并将 stdout 和 stderrcmd
以及time
输出到管道的重定向到tee
,您需要:
{ time cmd; } 2>&1 | tee log
至于定期检索,我认为这是不可能的。这是由内核计算的,并在父进程终止后可供父进程使用。等待()ed为其子级(使用getrusage()
)。
time
另请注意,即使在报告使用情况时他们已经死亡,未由父母等待的孙子的使用也不会被计算在内(init
实际上将对其进行计算)。
一个进程可以得到它的自己的time
使用信息(例如,参见alone in的输出zsh
),但对于该children
部分,只有当您的直接子级死亡并报告其使用情况时,它才会递增,因此即使您make
在后台启动并time
定期运行,该children
部分也不会获得每个make
终止子项都会增加。make
(代表 的内核)将计算这些子项的使用情况,并且累积使用情况仅在返回时make
可用。zsh
make
如果您只对 CPU 时间感兴趣,而不是更改后跟踪getrusage()
和报告的其他信息,在 Linux 上,time
$TIMEFMT
您可以从中获取信息/proc/pid/stat
和一些摘要ps
,但又是儿童使用对于给定进程,仅包括已终止的直接子进程的累积使用量。
就像是:
time cmd &
perl -MPOSIX -l -0777 -e '
while (<STDIN>) {
@f = /\(.*\)|\S+/gs;
printf "%s %s cutime: %.2f cstime: %.2f\n",
strftime("%T",localtime), $f[1],
map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[15,16];
sleep 1;
seek STDIN,0,0;
}' < /proc/$!/stat
仅当执行的进程的每个直接子进程死亡并死亡时,您才会看到cutime
(累积用户时间)和(系统)递增cstime
cmd
cmd
等待对于他们来说。
示例输出zsh -c 'repeat 5 {head -c200M /dev/zero | pixz > /dev/null}'
为cmd
:
15:19:32 (zsh) cutime: 0.00 cstime: 0.00
15:19:33 (zsh) cutime: 0.00 cstime: 0.00
15:19:34 (zsh) cutime: 0.05 cstime: 0.25
15:19:35 (zsh) cutime: 0.05 cstime: 0.25
15:19:36 (zsh) cutime: 19.21 cstime: 1.04
15:19:37 (zsh) cutime: 19.21 cstime: 1.04
15:19:38 (zsh) cutime: 19.21 cstime: 1.04
15:19:39 (zsh) cutime: 19.26 cstime: 1.31
15:19:40 (zsh) cutime: 37.94 cstime: 2.05
15:19:41 (zsh) cutime: 37.94 cstime: 2.05
15:19:42 (zsh) cutime: 37.97 cstime: 2.36
15:19:43 (zsh) cutime: 37.97 cstime: 2.36
15:19:44 (zsh) cutime: 57.17 cstime: 3.07
15:19:45 (zsh) cutime: 57.17 cstime: 3.07
15:19:46 (zsh) cutime: 57.22 cstime: 3.36
15:19:47 (zsh) cutime: 76.06 cstime: 4.10
15:19:48 (zsh) cutime: 76.06 cstime: 4.10
15:19:49 (zsh) cutime: 76.06 cstime: 4.10
15:19:50 (zsh) cutime: 76.08 cstime: 4.42
您会看到时间批量增加(当head
和pigz
进程终止时)。