我有一个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
列中的值是假的?我误解了吗?
答案 0 :(得分:2)
来自strace手册页:
-c为每个系统调用计算时间,调用和错误,并在程序退出时报告摘要。 在Linux上,这会尝试显示 系统时间(CPU时间 花在内核中运行)与挂钟时间无关。如果-c与-f或-F(下面)一起使用,则只有聚合 所有跟踪过程的总计 保留。
(强调我加入。)大多数I / O只会让实际的异步调用和上下文切换掉,而不是做某种繁忙的循环。 -T
将显示调用内核和返回的调用之间的挂钟持续时间。
修改:在以后的版本中,-w
会为您提供等待时间,而不是系统时间,因此-c -w
将为您提供与-T
匹配的时间。