strace -c没有显示正确的秒数

时间:2017-03-01 15:14:40

标签: linux strace

我在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.您怎么看?

2 个答案:

答案 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)来处理系统调用。它并不意味着系统调用的挂起时间。