5

我在 ubuntu 13.04 服务器中使用 perf。内核 3.8.0-19-通用。我使用相同的操作系统在 kvm 中运行虚拟机。

我想从主机端分析来宾操作系统。所以我按照指导并执行以下步骤:

  1. 从 vm 复制 /proc/modules 和 /proc/kallsyms
  2. perf kvm --guest --guestmodules=guest-modules --guestkallsyms=guest-kallsyms 记录 -a
  3. perf kvm --guest --guestmodules=guest-modules --guestkallsyms=guest-kallsyms 报告

但报告的输出未知

   97.33%  [guest/17599]  [unknown]         [g] 0xffffffff816d4470                
    2.67%  [guest/17599]  [unknown]         [u] 0x00007fe66f2f88fb   

为什么输出未知?使用 perf kvm top 会有类似的输出。

4

1 回答 1

0

这已经很老了,但我最近遇到了类似的问题。在做了一些研究之后,我确定了在从主机分析来宾 VM 时得到 [未知] 符号的一些原因。

当你做一个

perf kvm --guest <guestkallsyms> <guestmodules> record -a

从主机,来宾内核将生成PERF_RECORD_MMAPsPERF_RECORD_FORK等记录,这些记录表明来宾二进制文件被映射到来宾内存以及任何进程被分叉并随后被执行(使用PERF_RECORD_COMM)。

这些是内核在客户机上生成的边带事件。从主机录制时,主机显然无权访问来宾内核环形缓冲区来记录此类 PERF 事件。请注意,这些边带事件稍后会在尝试识别上下文切换时变得有用。

来宾内核生成的任何此类事件都将丢失给主机,因此主机将无法跟踪被分叉和映射的来宾二进制文件。这些[unknown symbols]代表显然被主机遗漏的来宾二进制文件。

可以尝试解决此问题的一种方法是在来宾和主机之间建立共享环形缓冲区。这可能真的很复杂。另一种方法可能是以某种方式同步来宾和主机时钟,然后perf record -a同时在来宾和主机上运行。稍后perf.data可以合并这两个文件以获得最终结果。

请注意,perf来宾上的硬件(不是内核)生成的任何事件也将在主机上可用..(如PERF_RECORD_SAMPLE)。因此,这些事件的记录和后处理很可能会起作用。

于 2017-12-01T10:45:57.933 回答