【问题标题】:Why do strace's timings for -c and -T disagree?为什么 strace 的 -c 和 -T 时间不一致?
【发布时间】:2017-02-07 18:27:50
【问题描述】:

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

因为所有文件都已经存在,rsync 唯一要做的就是lstat() syscalls。

如果我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 毫秒是有道理的,这是网络挂载的 ping 速度的顺序,但 30 微秒根本不可能。

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

【问题讨论】:

    标签: linux strace


    【解决方案1】:

    来自 strace 手册页:

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

    (我添加的重点。)大多数 I/O 只会使实际的异步调用和上下文切换离开,而不是进行某种繁忙的循环。 -T 将改为显示调用内核和调用返回之间的挂钟持续时间。

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

    【讨论】:

    • 啊,太简单了!谢谢你。为了完整和方便路人,您是否介意编辑您的答案以提及与-T 等效的-cstrace -c -w,而是显示墙上时间摘要?
    • 完成。请注意,例如 -w 缺少Ubuntu 14.04 中包含的版本。因为当我想在远程环境中进行故障排除时,我主要使用strace,所以我倾向于使用旧版本(在某些地方是 CentOS 6...)。
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2020-05-23
    相关资源
    最近更新 更多