ZabbixサーバーからKVMホスト上のゲストOS(仮想マシン)のCPU使用率を、ゲストにZabbix Agentを入れずに(エージェントレス)監視する方法を紹介します。
Zabbix AgentはKVMホストにのみ導入し、virshコマンドとスクリプトを組み合わせてCPU使用率(%)を算出します。
構成概要
- Zabbix Server(別サーバ)
- KVMホスト:Zabbix Agentを導入
- ゲストOS:変更なし
このスクリプトの仕組み
この監視スクリプトは、KVMホスト上で動作しており、以下のステップでゲストVMのCPU使用率(%)を算出しています。
- virshコマンドでCPU時間を取得
virsh cpu-statsを使って、対象VMが累積で何秒分CPUを使ったか(cpu_time)を取得します。 - 前回取得時のCPU時間との差分を計算
スクリプトは/tmpに前回値を保存し、次回との差分で使用時間を求めます。 - 経過時間で割って「秒/秒」 を算出
例:10秒経過し、CPU時間が5秒増えていれば「0.5秒/秒」となります。 - vCPU数で割り、100倍してCPU使用率(%)に変換
例:2コアのVMが0.5秒/秒使用 → (0.5 / 2) × 100 = 25%
手順
-
監視スクリプトを作成
以下の内容でスクリプトファイルを作成します。
# ファイル名: /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" -
スクリプトの配置と実行権限
chmod +x /etc/zabbix/scripts/monitor_vm_cpu_usage.sh -
Zabbix Agent に UserParameter を追加
/etc/zabbix/zabbix_agentd.d/virt.conf などに以下を記載:
UserParameter=vm.cpu.usage[*],/etc/zabbix/scripts/monitor_vm_cpu_usage.sh $1 -
Zabbix Agent を再起動
systemctl restart zabbix-agent -
Zabbix Web UIでアイテムを作成
- キー:
vm.cpu.usage[ゲスト名] - タイプ:Zabbix agent
- データ型:浮動小数点
- 単位:%
- 更新間隔:60秒など
- キー:
-
テスト方法
ゲストOS側でCPUに負荷をかけます:
yes > /dev/null &その後ホストで以下を実行:
sudo -u zabbix /etc/zabbix/scripts/monitor_vm_cpu_usage.sh ゲスト名
補足
この方法は、KVMホストから見た「vCPUの物理使用量」を測るもので、ゲストOS内のプロセス別負荷(top等)とは異なります。
ゲストOSを変更せずに実現できる、シンプルかつ強力な監視手法です。


コメント