epoch time / timestamps wireshark vs perf trace

时间:2017-02-26 16:10:28

标签: linux debugging networking wireshark perf

我正在尝试在我的Linux服务器上调试一些问题:

我每隔2分钟就有一些igmp查询,我想找到它的来源。

从Wireshark捕获我看到查询的执行时间:

**1488124556.773784** IP 0.0.0.0 > all-systems.mcast.net: igmp query v2

这次我可以毫无问题地转换为实时:

**[root@server ~]# date -d @1488124556.773784: -> 
Sun Feb 26 10:55:56 EST 2017**

但是当我尝试使用perf命令跟踪linux进程时:

perf trace -a -T -o trace.out 

trace.out

**15471296674.961** ( 0.023 ms): qemu-kvm/6621 ioctl(fd: 12<anon_inode:kvm-vcpu>, cmd: 0xae80                        ) = 0

**15471296674.979** ( 0.011 ms): qemu-kvm/6621 ioctl(fd: 12<anon_inode:kvm-vcpu>, cmd: 0xae80   
                     ) = 0

**15471296674.986** ( 0.004 ms): qemu-kvm/6621 ioctl(fd: 6<anon_inode:kvm-vm>, cmd: 0xc008ae67, arg: 0x7fbba66bf9d0  


15471296674.990 ( 0.002 ms): qemu-kvm/6621 ioctl(fd: 6<anon_inode:kvm-vm>, cmd: 0xc008ae67, arg: 0x7fbba66bf9f0  ) = 0

**15471296675.002** ( 0.010 ms): qemu-kvm/6621 ioctl(fd: 12<anon_inode:kvm-vcpu>, cmd: 0xae80  

**15471296675.009** ( 0.003 ms): qemu-kvm/6621 ioctl(fd: 6<anon_inode:kvm-vm>, cmd: 0xc008ae67, arg: 0x7fbba66bf9f0 


**15471296675.021** ( 0.010 ms): qemu-kvm/6621 ioctl(fd: 12<anon_inode:kvm-vcpu>, cmd: 0xae80                        ) = 0

我发现时间不是时代格式:

从perf页面的手册中我找到了

  

-T --time打印完整时间戳而不是相对于第一个样本的时间。

我的问题:

是否可以在Wireshark和perf跟踪工具中找到相同的时间戳格式或类型?

感谢。

1 个答案:

答案 0 :(得分:1)

简短回答

不幸的是,从内核4.4开始,不可能将perf-trace时间戳精确地转换为unix时间。您可以将它们与/ proc / uptime中的时间大致匹配,但它们会因为启动而分开,差异以秒或甚至几分钟来衡量。

答案很长

perf依赖于sched_clock(),它与启动后的纳秒数相关联。由于某种原因,perf将小数点放在错误的位置,因此您会看到秒数乘以1000。

问题是,sched_clock()报告的数字实际上无法从用户空间访问。它们与CLOCK_MONOTONIC(可以在/ proc / uptime中看到)和CLOCK_MONOTONIC_RAW(可以通过clock_gettime系统调用获得它)不同。

至少提出了两个补丁来添加将sched_clock()暴露给用户空间的内核接口,不幸的是两者都被拒绝了。从那时起,我才意识到任何成功的尝试。

拒绝内核补丁: