KVMゲストOSのCPU使用率(%)をZabbixでエージェントレス監視する手順

インフラ

ZabbixサーバーからKVMホスト上のゲストOS(仮想マシン)のCPU使用率を、ゲストにZabbix Agentを入れずに(エージェントレス)監視する方法を紹介します。
Zabbix AgentはKVMホストにのみ導入し、virshコマンドとスクリプトを組み合わせてCPU使用率(%)を算出します。

構成概要

  • Zabbix Server(別サーバ)
  • KVMホスト:Zabbix Agentを導入
  • ゲストOS:変更なし

このスクリプトの仕組み

この監視スクリプトは、KVMホスト上で動作しており、以下のステップでゲストVMのCPU使用率(%)を算出しています。

  1. virshコマンドでCPU時間を取得
    virsh cpu-stats を使って、対象VMが累積で何秒分CPUを使ったか(cpu_time)を取得します。
  2. 前回取得時のCPU時間との差分を計算
    スクリプトは /tmp に前回値を保存し、次回との差分で使用時間を求めます。
  3. 経過時間で割って「秒/秒」 を算出
    例:10秒経過し、CPU時間が5秒増えていれば「0.5秒/秒」となります。
  4. vCPU数で割り、100倍してCPU使用率(%)に変換
    例:2コアのVMが0.5秒/秒使用 → (0.5 / 2) × 100 = 25%

手順

  1. 監視スクリプトを作成

    以下の内容でスクリプトファイルを作成します。

    # ファイル名: /etc/zabbix/scripts/monitor_vm_cpu_usage.sh
    #!/bin/bash
    
    VM_NAME="$1"
    TMP_FILE="/tmp/${VM_NAME}.cpu"
    NOW=$(date +%s)
    
    # CPU時間を取得
    CPU_TIME=$(virsh -c qemu:///system cpu-stats "$VM_NAME" --total 2>/dev/null | awk '/cpu_time/ {print $2}')
    
    # vCPU数を取得(XMLを1行に変換して対応)
    VCPU=$(virsh -c qemu:///system dumpxml "$VM_NAME" 2>/dev/null | tr -d '\n' | sed -n 's:.*<vcpu[^>]*>\([0-9]\+\).*:\1:p')
    
    # 値が取得できない場合は0を返す
    if [[ -z "$CPU_TIME" || -z "$VCPU" || "$VCPU" -eq 0 ]]; then
        echo 0
        exit 0
    fi
    
    # 差分計算
    if [[ -f "$TMP_FILE" ]]; then
        read LAST_TIME LAST_CPU < "$TMP_FILE"
        DIFF_TIME=$((NOW - LAST_TIME))
        DIFF_CPU=$(echo "$CPU_TIME - $LAST_CPU" | bc)
    
        if (( DIFF_TIME > 0 )) && (( $(echo "$DIFF_CPU >= 0" | bc) )); then
            CPU_USAGE=$(echo "scale=2; ($DIFF_CPU / $DIFF_TIME) / $VCPU * 100" | bc)
            [[ "$CPU_USAGE" =~ ^[0-9]+(\.[0-9]+)?$ ]] && echo "$CPU_USAGE" || echo 0
        else
            echo 0
        fi
    else
        echo 0
    fi
    
    # 前回値を保存
    echo "$NOW $CPU_TIME" > "$TMP_FILE"
  2. スクリプトの配置と実行権限

    chmod +x /etc/zabbix/scripts/monitor_vm_cpu_usage.sh
  3. Zabbix Agent に UserParameter を追加

    /etc/zabbix/zabbix_agentd.d/virt.conf などに以下を記載:

    UserParameter=vm.cpu.usage[*],/etc/zabbix/scripts/monitor_vm_cpu_usage.sh $1
  4. Zabbix Agent を再起動

    systemctl restart zabbix-agent
  5. Zabbix Web UIでアイテムを作成

    • キー:vm.cpu.usage[ゲスト名]
    • タイプ:Zabbix agent
    • データ型:浮動小数点
    • 単位:%
    • 更新間隔:60秒など
  6. テスト方法

    ゲストOS側でCPUに負荷をかけます:

    yes > /dev/null &

    その後ホストで以下を実行:

    sudo -u zabbix /etc/zabbix/scripts/monitor_vm_cpu_usage.sh ゲスト名

補足

この方法は、KVMホストから見た「vCPUの物理使用量」を測るもので、ゲストOS内のプロセス別負荷(top等)とは異なります。
ゲストOSを変更せずに実現できる、シンプルかつ強力な監視手法です。

コメント

タイトルとURLをコピーしました