2017-03-01 59 views
0

我已經得到了strace -c結果在RHEL 7和RHEL 6 這個命令:strace的-c不顯示正確秒

strace -c /bin/sleep 20 

,我不明白爲什麼nanosleepseconds列等於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。你覺得呢?

回答

1

從strace的(1)的手冊頁:

-c在Linux上,這試圖表明系統時間(CPU時間花費在內核中運行)

我認爲:

當進程調用nanosleep()時,它會要求內核暫停一段時間。內核設置了一些東西(比如一些標誌,一個定時器,一個時間戳......),暫停調用過程,然後去做別的事情。 012cestrace(1)報告內核花費在上的時間來執行此操作,而不是進程保持暫停的時間。

可能是這個-c strace選項可以認爲是「-cost」:這個系統調用需要多少時間?

+0

是的,你是對的。實際上,整個報價是:'在Linux上,它試圖顯示系統時間(花費在內核中的CPU時間)**獨立於掛鐘時間**'。所以這不是一個時鐘。 –

+0

@SergeiKurenkov是的,我已經看到「獨立於...」,但在我看來,這是多餘的,甚至是誤導性的。 _spent time_,又名_duration_,如何依賴掛鐘?但是,編寫手冊頁的人覺得需要指定。 – linuxfan

0

爲了瞭解這個問題,我爲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 

下面是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秒,因爲它顯示在行末:< 20.000423>。然而wait4回報吧:

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

,所以要花3微秒根據報告做nanosleep。所以seconds列很可能意味着OS用來處理系統調用的(user_time + sys_time + some-unclear-overhead)。這並不意味着系統調用的掛牆時間。