为什么-c和-T的strace的时间不一致?

时间:2017-02-07 18:27:50

标签: linux strace

我有一个rsync运行no-op(所有文件已经存在)目录复制操作到网络安装的文件系统。

因为所有文件都已存在,所以rsync唯一能做的就是lstat()系统调用。

如果我strace -c这个,我明白了:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.076780          30      2524           lstat
------ ----------- ----------- --------- --------- ----------------
100.00    0.076780                  2524           total

real    0m5.451s

但如果我strace -T(显示每个系统调用的时间),我会得到这个:

lstat("file1", {st_mode=S_IFREG|0644, st_size=32820,   ...}) = 0 <0.005523>
lstat("file2", {st_mode=S_IFREG|0644, st_size=20816,   ...}) = 0 <0.001529>
lstat("file3", {st_mode=S_IFREG|0644, st_size=1828312, ...}) = 0 <0.001991>
lstat("file4", {st_mode=S_IFREG|0644, st_size=1823258, ...}) = 0 <0.001326>
lstat("file5", {st_mode=S_IFREG|0644, st_size=32820,   ...}) = 0 <0.006562>
lstat("file6", {st_mode=S_IFREG|0644, st_size=22578,   ...}) = 0 <0.002151>
lstat("file7", {st_mode=S_IFREG|0644, st_size=32835,   ...}) = 0 <0.001705>
lstat("file8", {st_mode=S_IFREG|0644, st_size=25493,   ...}) = 0 <0.001492>
lstat("file9", {st_mode=S_IFREG|0644, st_size=1783930, ...}) = 0 <0.001974>

时间完全关闭了!

-c声称每个lstat大约需要30 usecs/call,而-T则显示大约2毫秒/来电。

2 ms是有意义的,这是网络安装的ping速度顺序,但是30微秒几乎是不可能的。

为什么usecs/call列中的值是假的?我误解了吗?

1 个答案:

答案 0 :(得分:2)

来自strace手册页:

  

-c为每个系统调用计算时间,调用和错误,并在程序退出时报告摘要。 在Linux上,这会尝试显示   系统时间(CPU时间                      花在内核中运行)与挂钟时间无关。如果-c与-f或-F(下面)一起使用,则只有聚合   所有跟踪过程的总计                      保留。

(强调我加入。)大多数I / O只会让实际的异步调用和上下文切换掉,而不是做某种繁忙的循环。 -T将显示调用内核和返回的调用之间的挂钟持续时间。

修改:在以后的版本中,-w会为您提供等待时间,而不是系统时间,因此-c -w将为您提供与-T匹配的时间。