我在RHEL 7和RHEL 6上获得了strace -c
的结果
对于此命令:
strace -c /bin/sleep 20
并且我不明白为什么seconds
的{{1}}列等于0.我原以为它是20。
nanosleep
这是一份完整的strace报告:
0.00 0.000000 0 1 nanosleep
在详细的报告中有一个关于nanosleep的呼吁:
$ 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
所以秒必须是20,而不是0.您怎么看?
答案 0 :(得分:1)
从strace(1)的手册页:
-c
在Linux上,这会尝试显示系统时间(在内核中运行的CPU时间)
我认为:
当进程调用nanosleep()时,它会要求内核暂停一段时间。内核设置了一些东西(比如一些标志,一个计时器,一个时间戳......),暂停调用进程,然后继续做其他事情。 strace(1)报告内核执行此操作所花费的时间,而不是进程暂停的时间。
可能是这个-c
strace选项可以被视为" -cost":这个系统调用需要花费多少时间?
答案 1 :(得分:0)
为了理解这个问题,我为strace
运行了strace -c /bin/sleep
:
它的外观如下:
$ 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
以下是与sycalls.txt
系统调用相关的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秒,因为它显示在该行的末尾:&lt; 20.000423&gt;。但是wait4
会返回:
{ru_utime={0, 0}, ru_stime={0, 3706}
根据该报告,nanosleep
需要3微秒。因此,seconds
列可能意味着操作系统花费(user_time + sys_time + some-unclear-overhead)
来处理系统调用。它并不意味着系统调用的挂起时间。