2.2. perf kvm

您可以使用带有 kvm 选项的 perf 命令,从主机收集客机运行系统的统计数据。
在 Red Hat Enterprise Linux 中, perf 软件包提供 perf 命令。运行 rpm -q perf 检查 perf 软件包是否已安装。如果没有安装且您想安装该软件包来收集分析客机运行系统统计数据,请以 root 用户运行以下命令:
# yum install perf
为了在主机中使用 perf kvm,您需要从客户端获取 /proc/modules/proc/kallsyms 文件。有两种可实现的方法。参考以下程序,用过程 2.1, “从客户端向主机复制 proc 文件” 将文件转换逐级并在文件中运行报告。或者参照过程 2.2, “备选:使用 sshfs 直接访问文件” 直接安装客户端来获取文件。

过程 2.1. 从客户端向主机复制 proc 文件

重要

如果您直接复制必需文件(例如通过 scp 命令),您只会复制零长度的文件。此处描述了首先将客户端中的文件复制到临时位置(通过cat 命令),然后通过 perf kvm 命令将它们复制到主机使用的过程。
  1. 登录客户端并保存文件

    登录客户端并将 /proc/modules/proc/kallsyms 保存到临时位置,文件名为/tmp
    # cat /proc/modules > /tmp/modules
    # cat /proc/kallsyms > /tmp/kallsyms
  2. 将临时文件复制到主机

    在您退出客户端之后,运行以下 scp 命令,将已保存的文件复制到主机。如果 TCP 端口和主机名称不符,应替换主机名称:
    # scp root@GuestMachine:/tmp/kallsyms guest-kallsyms
    # scp root@GuestMachine:/tmp/modules guest-modules
    现在您在主机上拥有了两个客户端的文件(guest-kallsymsguest-modules),准备就绪通过 perf kvm 命令进行使用。
  3. 通过 perf kvm 对事件进行记录和报告

    使用前一步骤中获取的文件,并纪录和报告客户端或(与)主机中的事件现在是可行的。
    运行以下示例命令:
    # perf kvm --host --guest --guestkallsyms=guest-kallsyms \
    --guestmodules=guest-modules record -a -o perf.data

    注意

    如果 --host--guest 均在命令中使用,输出将被储存在 perf.data.kvm 中。如果只有 --host 被使用,文件将被命名为 perf.data.host。同样地,如果仅有 --guest 被使用,文件将被命名为 perf.data.guest
    请按 Ctrl-C 停止纪录。
  4. 报告事件

    以下示例命令使用纪录过程中获取的文件,并将输出重新定向到一个新文件:analyze
    perf kvm --host --guest --guestmodules=guest-modules report -i perf.data.kvm \
    --force > analyze
    查看并分析 analyze 文件内容,检测纪录的事件:
    # cat analyze
    
    
    # Events: 7K cycles 
    # 
    # Overhead       Command  Shared Object      Symbol 
    # ........  ............  .................  .........................
    # 
        95.06%            vi  vi                 [.] 0x48287         
         0.61%          init  [kernel.kallsyms]  [k] intel_idle 
         0.36%            vi  libc-2.12.so       [.] _wordcopy_fwd_aligned 
         0.32%            vi  libc-2.12.so       [.] __strlen_sse42 
         0.14%       swapper  [kernel.kallsyms]  [k] intel_idle 
         0.13%          init  [kernel.kallsyms]  [k] uhci_irq 
         0.11%          perf  [kernel.kallsyms]  [k] generic_exec_single 
         0.11%          init  [kernel.kallsyms]  [k] tg_shares_up 
         0.10%      qemu-kvm  [kernel.kallsyms]  [k] tg_shares_up 
    
    [输出删节……]

过程 2.2. 备选:使用 sshfs 直接访问文件

  • 重要

    这一步仅被作为一个提供的示例。您需要依据环境替换属性值。
    # Get the PID of the qemu process for the guest:
    PID=`ps -eo pid,cmd | grep "qemu.*-name GuestMachine" \
    | grep -v grep | awk '{print $1}'`
    
    # Create mount point and mount guest
    mkdir -p /tmp/guestmount/$PID
    sshfs -o allow_other,direct_io GuestMachine:/ /tmp/guestmount/$PID
    
    # Begin recording
    perf kvm --host --guest --guestmount=/tmp/guestmount \
    record -a -o perf.data
    
    # Ctrl-C interrupts recording. Run report:
    perf kvm --host --guest --guestmount=/tmp/guestmount report \
    -i perf.data
    
    # Unmount sshfs to the guest once finished:
    fusermount -u /tmp/guestmount