我已经得到了这个命令的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)
处理系统调用。 这并不意味着系统调用的时间。