strace -c不显示正确的秒数

我已经得到了这个命令的RHEL 7和RHEL 6上strace -c结果:

 strace -c /bin/sleep 20 

我不明白为什么nanosleep seconds列等于0.我原本以为是20。

  0.00 0.000000 0 1 nanosleep 

这里是一个完整的strace报告:

 $ strace -c /bin/sleep 20 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000019 1 15 12 open 0.00 0.000000 0 1 read 0.00 0.000000 0 5 close 0.00 0.000000 0 8 6 stat 0.00 0.000000 0 3 fstat 0.00 0.000000 0 9 mmap 0.00 0.000000 0 3 mprotect 0.00 0.000000 0 1 munmap 0.00 0.000000 0 3 brk 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 nanosleep 0.00 0.000000 0 1 execve 0.00 0.000000 0 1 arch_prctl ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000019 52 19 total 

有一个呼吁nanosleep在一个详细的报告:

 nanosleep({20, 0}, NULL) = 0 

所以秒必须是20,而不是0.你觉得呢?

从strace(1)的手册页:

-c在Linux上,它试图显示系统时间(在内核中运行的CPU时间)

我觉得:

当进程调用nanosleep()时,它会要求内核暂停一段时间。 内核设置了一些东西(比如一些标志,一个定时器,一个时间戳),暂停调用进程,然后去做别的事情。 strace(1)报告内核花费的时间,而不是进程暂停的时间。

可能是这个-c strace选项可以被认为是“ – 成本”: 这个系统调用多少时间?

为了理解这个问题,我为strace -c /bin/sleep运行strace

这是它的样子:

 $ strace -T -o syscalls.txt -v strace -c /bin/sleep 20 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 31.54 0.000429 29 15 12 open 13.68 0.000186 23 8 mmap 13.60 0.000185 46 4 mprotect 11.62 0.000158 20 8 6 stat 6.91 0.000094 19 5 close 5.96 0.000081 81 1 munmap 4.63 0.000063 16 4 brk 3.38 0.000046 46 1 arch_prctl 3.16 0.000043 43 1 nanosleep 2.21 0.000030 30 1 read 1.47 0.000020 20 1 1 access 1.32 0.000018 6 3 fstat 0.51 0.000007 7 1 execve ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001360 53 19 total 

下面是一些与nanosleep系统调用相关的nanosleep

 ptrace(PTRACE_SYSCALL, 6498, 0, SIG_0) = 0 <0.000028> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000017> wait4(-1, [{WIFSTOPPED(s) && WSTOPSIG(s) == 133}], __WALL, {ru_utime={0, 0}, ru_stime={0, 3706}, ru_maxrss=616, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=205, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=108, ru_nivcsw=1}) = 6498 <20.000423> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=6498, si_status=SIGTRAP, si_utime=0, si_stime=0} --- 

因此, nanosleep本身会持续20秒,如下所示:<20.000423>。 然而wait4返回它:

 {ru_utime={0, 0}, ru_stime={0, 3706} 

据报道, nanosleep需要3微秒的时间。 所以seconds列可能意味着(user_time + sys_time + some-unclear-overhead)操作系统用户时间(user_time + sys_time + some-unclear-overhead)处理系统调用。 这并不意味着系统调用的时间。