我正在尝试在我的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跟踪工具中找到相同的时间戳格式或类型?
感谢。
答案 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()暴露给用户空间的内核接口,不幸的是两者都被拒绝了。从那时起,我才意识到任何成功的尝试。