一般在咱们的云环境中,为了保证云平台中虚拟机的正常运行,基本都须要这样一个功能,就是收集虚拟机的监控数据,好比cpu的使用率、内存的使用率、磁盘io、网络io等基本信息。能够利用这些信息及时调整云平台环境中出现的一些问题,从而实现保证VM的正常运行。html
说到KVM管理工具,首先应该想到的就是libvirt,由于目前对KVM使用最为普遍的管理工具(应用程序接口)就是libvirt。Libvirt自己构建于一种抽象的概念上,它为受支持的虚拟机监控程序实现经常使用功能提供通用的API。Libvirt提供了操做KVM的原生层接口,能够实现对虚拟机的基本管理操做。Libvirt库用C实现,且包含对python的直接支持。Libvirt-python就是基于libvirt API的python语言绑定工具包,经过该包能够实现对VM平常管理和监控数据的获取。python
利用python经过调用libvirt API获取VM的监控信息web
1)经过导入libvirt模块,而后链接本地qemu虚拟机监控程序。获取宿主机上每一个instance的domain并获取一些基本信息。windows
1网络 2dom 3工具 4spa 5.net 6命令行 7 8 |
|
1 2 3 4 5 |
|
domain.info()返回列表参数说明:
[State:1, Max memory:2097152L, Used memory:2097152L, CPU(s):2, CPU time:4245630000000L]
具体的参数值表明的意思请参考http://libvirt.org/html/libvirt-libvirt-domain.html对应的API。
经过这个简单的示例能够看出libvirt经过python提供的强大功能。
2)获取cpu的使用率
Libvirt中不能直接获取虚拟机的cpu使用率可是能够经过cputime来计算出实际的使用率,计算公式为:
首先获得一个周期差:cputime_diff = (cpuTimenow — cpuTimet seconds ago)
计算实际使用率:%cpu = 100 × cpu_time_diff / (t × nr_cores × 109)实现:
说明:
能够经过dom.info()[4]得到cputime
经过dom.info()[3]得到cpu数
简单示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 |
|
3)获取网络流量信息
能够利用dom.interfaceStats(interface)获取虚拟网卡的流量信息,可是该方法须要传递一个虚拟网卡名作为参数。可使用libvirt的API获取domain的状况,并获取xml配置文件。经过xml的tree来获取每一个可用的要监测设备的名称,再经过domain去获取设备的属性字段值便是要监控的数值。
简单示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 |
|
domain.interfaceStats(iface)返回结果说明:
(rx_bytes:24194376L, rx_packets:363592L, rx_errs:0L, rx_drop:0L, tx_bytes:852996L, tx_packets:20302L, tx_errs:0L, tx_drop:0L)
能够经过对这些基本数据加工处理获得网络吞吐等信息。
4)获取磁盘信息
得到磁盘的总量和已使用量,能够经过dom.blockInfo(dev)获取。该方法须要传递一个参数,可使用libvirt的API获取domain的状况,并获取xml配置文件。经过xml的tree来获取每一个可用的要监测设备的名称,再经过domain去获取设备的属性字段值便是要监控的数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 |
|
1 |
|
(capacity:42949672960L, allocation:2233990656L,physical:2300968960L)
得到磁盘的i/o,能够经过dom.blockStats(dev)获取。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 |
|
domain.blockStats(device)返回列表参数说明:
(read_bytes=1412453376L,read_requests=67017L, write_bytes=2315730432L, write_requests=245180L,errors=-1L)
经过上边的基础操做能够获得一些磁盘的基础数据,能够对这些数据处理获得想要的磁盘信息,如:磁盘iops等
5)得到内存信息
能够经过domain.memoryStats()来获取memory的相关信息。
简单示例:
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 |
|
domain.memoryStats()返回结果说明:
{'swap_out': 0L, 'available': 1884432L, 'actual': 2097152L, 'major_fault': 457L, 'swap_in': 0L, 'unused': 1367032L, 'minor_fault': 1210349717L, 'rss': 743604L}
其中actual是启动虚机时设置的最大内存,rss是qemu process在宿主机上所占用的内存,unused表明虚机内部未使用的内存量,available表明虚机内部识别出的总内存量,
那么虚机内部的内存使用量则是能够经过(available-unused)获得。
其实可使用libvirt的命令行工具获取并查看虚机的内存信息
具体操做以下:
1 2 3 4 |
|
若是出现如上状况,是由于在VM内没有安装virtio驱动,全部不能获取VM内存的详细信息。
正常在VM内部安装virtio驱动而且支持memballoon,执行上述操做能够看到以下结果:
1 2 3 4 5 6 7 |
|
注意:
要获取VM内存使用详细信息,VM中须要安装virtio驱动而且支持memballoon。
关于virtio驱动:Linux通常都会包含(经过 lsmod | grep virtio 查看),可是windows的virtio驱动须要本身在镜像中安装。
windows注意事项:
首先windows须要安装virtio-win相关驱动,驱动下载地址 在这里 ,除此以外还须要启动BLNSVR服务。
在 Windows 2008r2 and Windows 2012/Win8 :
Copy and rename as Administrator the WIN7AMD64 directory from the virtio.iso to “c:/Program files/Balloon”
Open a CMD as Administrator and cd into “c:/Program Files/Balloon”
Install the BLNSVR with “BLNSVR.exe -i”
在 Windows 2003 / Windows Xp :
Download the “devcon” software on microsoft website kb311272
devcon install BALLOON.inf “PCIVEN_1AF4&DEV_1002&SUBSYS_00051AF4&REV_00”
更多详情请参考: https://pve.proxmox.com/wiki/Dynamic_Memory_Management