
1. 项目背景与核心价值在虚拟化技术广泛应用的今天KVM作为Linux生态下的主流虚拟化解决方案承载着大量企业级工作负载。但传统的监控手段往往存在两个痛点要么只能获取宿主机层面的粗粒度指标要么需要侵入式地在每个虚拟机内部署代理。这正是prometheus-libvirt-exporter的用武之地——它通过libvirt接口直接采集KVM虚拟机的详细性能数据既避免了Guest OS内部的资源消耗又能提供比传统方案更丰富的监控维度。我在实际运维OpenStack和纯KVM环境时发现这套方案特别适合以下场景需要监控大量临时性虚拟机如CI/CD环境时省去了每台安装agent的麻烦对安全性要求严格的场景减少Guest OS内的服务暴露需要对比同一宿主机上不同虚拟机的资源争用情况时2. 系统架构与工作原理2.1 组件交互关系libvirtd (UNIX socket) ↑ prometheus-libvirt-exporter (监听采集端口) ↑ Prometheus Server (定期scrape) ↑ Grafana (数据可视化)2.2 核心监控指标exporter会通过libvirt API采集以下几类关键数据以metrics格式示例# 虚拟机状态 libvirt_domain_state{domainvm01} 1 # 1running, 5shutoff # CPU使用率百分比 libvirt_domain_info_cpu_time_total{domainvm01} 3857290000000 # 内存统计字节 libvirt_domain_memory_stat_actual_balloon{domainvm01} 2147483648 # 磁盘I/O字节/操作数 libvirt_domain_block_stats_read_bytes{domainvm01,target_devicevda} 1024000 # 网络流量字节/包数 libvirt_domain_interface_stats_receive_bytes{domainvm01,target_devicevnet0} 20480003. 详细部署指南3.1 环境准备必要前提条件已安装libvirtd且正常运行的KVM宿主机确保当前用户属于libvirt组否则会报权限错误开放的TCP端口默认9177权限配置要点# 检查libvirt socket权限 ls -l /var/run/libvirt/libvirt-sock # 典型输出srwxrwx--- 1 root libvirt 0 Jul 1 10:00 /var/run/libvirt/libvirt-sock # 将用户加入libvirt组 sudo usermod -aG libvirt $(whoami) newgrp libvirt # 立即生效3.2 安装exporter推荐使用容器化部署避免依赖问题docker run -d \ --name libvirt-exporter \ -p 9177:9177 \ -v /var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock \ -v /etc/libvirt:/etc/libvirt \ quay.io/kubevirt/libvirt-exporter:v0.0.3验证安装curl http://localhost:9177/metrics | grep libvirt_up # 正常应返回libvirt_up 14. Prometheus集成配置4.1 基础抓取配置在prometheus.yml中添加scrape_configs: - job_name: libvirt static_configs: - targets: [kvm-host1:9177, kvm-host2:9177] metrics_path: /metrics4.2 推荐告警规则示例groups: - name: libvirt-alerts rules: - alert: HighVMCPUUsage expr: rate(libvirt_domain_info_cpu_time_total[1m]) 90 * 10^9 # 90% usage for: 5m labels: severity: warning annotations: summary: High CPU usage on {{ $labels.domain }} - alert: VMDiskLatencyHigh expr: rate(libvirt_domain_block_stats_read_total[5m]) / rate(libvirt_domain_block_stats_read_bytes[5m]) 0.1 # 100ms latency labels: severity: critical5. 高级使用技巧5.1 指标过滤优化对于虚拟机数量较多的环境可以通过启动参数过滤非必要指标--collector.domain.metricsblock,interface # 只采集磁盘和网络指标 --collector.domain.disabledvm-test1,vm-dev* # 排除特定虚拟机5.2 自定义指标扩展通过libvirt的metadata功能添加业务标签!-- 在虚拟机XML定义中添加 -- metadata prometheus:labels xmlns:prometheushttp://libvirt.org/schemas/domain/1.0 prometheus:label nameapp valuenginx/ prometheus:label nameenv valueproduction/ /prometheus:labels /metadata采集到的指标会自动带上这些标签便于在Grafana中按业务维度聚合。6. 性能调优实战6.1 采集间隔优化在/etc/prometheus/prometheus.yml中调整scrape_configs: - job_name: libvirt scrape_interval: 30s # 默认15s对高密度环境可能压力过大 scrape_timeout: 25s6.2 exporter资源限制对于运行50虚拟机的宿主机建议配置docker run \ --cpus 1 \ # 限制CPU使用 --memory 512M \ # 内存上限 --ulimit nofile2048:2048 \ # 文件描述符限制 ...7. 常见问题排查7.1 权限类错误现象levelerror msgFailed to connect to libvirt: authentication failed解决方案检查/etc/libvirt/libvirtd.confunix_sock_group libvirt unix_sock_rw_perms 0770重启服务后验证sudo systemctl restart libvirtd virsh -c qemu:///system list # 应能正常列出虚拟机7.2 指标缺失问题现象缺少磁盘或网络指标排查步骤确认虚拟机XML配置了对应设备devices disk typefile devicedisk source file/var/lib/libvirt/images/vm01.qcow2/ target devvda busvirtio/ /disk interface typenetwork source networkdefault/ model typevirtio/ /interface /devices检查exporter日志是否有类似警告levelwarning msgFailed to collect block stats for vm01: internal error: missing ...8. 监控面板设计建议8.1 宿主机级视图核心指标虚拟机密度统计饼图展示running/paused/stopped状态分布宿主机资源分配率已分配vCPU/内存 vs 物理总量跨虚拟机的磁盘IOPS热力图8.2 单虚拟机视图关键图表CPU使用率 rate(libvirt_domain_info_cpu_time_total[1m]) / 1e9 / vCPU数量内存使用量 libvirt_domain_memory_stat_actual_balloon / 内存上限值网络吞吐 rate(libvirt_domain_interface_stats_receive_bytes[1m]) * 8 / 1024 / 1024 # Mbps实际部署中发现对Windows虚拟机需要特别注意virtio驱动版本会影响指标准确性建议使用最新稳定版virtio-win驱动版本≥0.1.217