Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.2. perf kvm

ホストからゲストのオペレーティングシステムの統計値を収集するには、 perf コマンドに kvm オプションを付けて使用します。
Red Hat Enterprise Linux では、 perf パッケージで perf コマンドを提供しています。 rpm -q perf を実行して perf パッケージがインストールされているか確認します。 インストールされていない場合は、ゲストのオペレーティングシステムの統計値を収集して分析するため、 root ユーザーになり次のコマンドを使用してこのパッケージをインストールします。
yum install perf
ホストで perf kvm を使用するには、 ゲストの /proc/modules ファイルと /proc/kallsyms ファイルにアクセスできなければなりません。 これを行なうための方法が 2 種類あります。 ホストにファイルを転送してからそのファイルで報告を実行する場合は、 手順8.1「ゲストの /proc ファイルをホストにコピーする」 を参照してください。 ゲストを直接マウントしてそのファイルにアクセスする場合は、 手順8.2「代替方法: sshfs を使ってファイルに直接アクセスする」 を参照してください。

手順8.1 ゲストの /proc ファイルをホストにコピーする

重要

必要なファイルを /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
    
    これでゲストからの 2 つのファイル (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 
    
    [output truncated...]
    

手順8.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