通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率、内存的使用率、磁盘io、网络io等基本信息。可以利用这些信息及时调整云平台环境中出现的一些问题,从而实现保证VM的正常运行。

说到KVM管理工具,首先应该想到的就是libvirt,因为目前对KVM使用最为广泛的管理工具(应用程序接口)就是libvirt。Libvirt本身构建于一种抽象的概念上,它为受支持的虚拟机监控程序实现常用功能提供通用的API。Libvirt提供了操作KVM的原生层接口,可以实现对虚拟机的基本管理操作。Libvirt库用C实现,且包含对python的直接支持。Libvirt-python就是基于libvirt API的python语言绑定工具包,通过该包可以实现对VM日常管理和监控数据的获取。

利用python通过调用libvirt API获取VM的监控信息

1)通过导入libvirt模块,然后连接本地qemu虚拟机监控程序。获取宿主机上每个instance的domain并获取一些基本信息。import libvirt

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

print domain.name()

print domain.UUIDString()

print domain.info()

conn.close()[root@kvm opt]# python libvirt_test.py

KaMg8c0hOSn1

instance1

7dd3ec0e-9b56-4e35-b14d-a58811e5c6ce

[1, 2097152L, 2097152L, 2, 8823450000000L]

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数

简单示例:import libvirt

import time

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

t1 = time.time()

c1 = int (domain.info()[4])

time.sleep(1);

t2 = time.time();

c2 = int (domain.info()[4])

c_nums = int (domain.info()[3])

usage = (c2-c1)*100/((t2-t1)*c_nums*1e9)

print "%s Cpu usage %f" % (domain.name(),usage)

conn.close()[root@kvm opt]# python libvirt_test.py

instance1 Cpu usage 0.998784

3)获取网络流量信息

可以利用dom.interfaceStats(interface)获取虚拟网卡的流量信息,但是该方法需要传递一个虚拟网卡名做为参数。可以使用libvirt的API获取domain的情况,并获取xml配置文件。通过xml的tree来获取每个可用的要监测设备的名称,再通过domain去获取设备的属性字段值即是要监控的数值。

简单示例:import libvirt

from xml.etree import ElementTree

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

tree = ElementTree.fromstring(domain.XMLDesc())

ifaces = tree.findall('devices/interface/target')

for i in ifaces:

iface = i.get('dev')

ifaceinfo = domain.interfaceStats(iface)

print domain.name(),iface,ifaceinfo

conn.close()[root@kvm opt]# python libvirt_test.py

instance1 vnet12 (90L, 1L, 0L, 0L, 1632L, 24L, 0L, 0L)

instance1 vnet13 (63120L, 256L, 0L, 371L, 0L, 0L, 0L, 0L)

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去获取设备的属性字段值即是要监控的数值。import libvirt

from xml.etree import ElementTree

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

tree = ElementTree.fromstring(domain.XMLDesc())

devices = tree.findall('devices/disk/target')

for d in devices:

device = d.get('dev')

try:

devinfo = domain.blockInfo(device)

except libvirt.libvirtError:

pass

print domain.name(),device,devinfo

conn.close()[root@kvm opt]# python libvirt_test.py

instance1 vda [42949672960L, 2233990656L, 2300968960L]domain.blockInfo(device)返回结果说明:

(capacity:42949672960L, allocation:2233990656L,physical:2300968960L)

获得磁盘的i/o,可以通过dom.blockStats(dev)获取。import libvirt

from xml.etree import ElementTree

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

tree = ElementTree.fromstring(domain.XMLDesc())

devices = tree.findall('devices/disk/target')

for d in devices:

device = d.get('dev')

try:

devstats = domain.blockStats(device)

print domain.name(),device,devstats

except libvirt.libvirtError:

pass

conn.close()[root@kvm opt]# python libvirt_test.py

instance1 vda (15100L, 240801280L, 48509L, 395756032L, -1L)

instance1 hda (6L, 164L, 0L, 0L, -1L)

domain.blockStats(device)返回列表参数说明:

(read_bytes=1412453376L,read_requests=67017L, write_bytes=2315730432L, write_requests=245180L,errors=-1L)

通过上边的基础操作可以得到一些磁盘的基础数据,可以对这些数据处理得到想要的磁盘信息,如:磁盘iops等

5)获得内存信息

可以通过domain.memoryStats()来获取memory的相关信息。

简单示例:import libvirt

conn = libvirt.open("qemu:///system")

for id in conn.listDomainsID():

domain = conn.lookupByID(id)

domain.setMemoryStatsPeriod(10)

meminfo = domain.memoryStats()

free_mem = float(meminfo['unused'])

total_mem = float(meminfo['available'])

util_mem = ((total_mem-free_mem) / total_mem)*100

print (str(domain.name())+' Memory usage :' + str(util_mem))

conn.close()[root@kvm opt]# python libvirt_test.py

instance1 Memory usage :27.4561247103

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的命令行工具获取并查看虚机的内存信息

具体操作如下:$ virsh dommemstat instance1

actual 2097152

swap_in 0

rss 743604

如果出现如上情况,是因为在VM内没有安装virtio驱动,所有不能获取VM内存的详细信息。

正常在VM内部安装virtio驱动并且支持memballoon,执行上述操作可以看到如下结果:$ virsh dommemstat instance1

actual 2097152

swap_in 0

swap_out 0

unused 1367032

available 2050112

rss 743604

注意:

要获取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

python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)相关推荐

  1. Python学习之爬虫(一)--获取论坛中学生获得offer信息

    Python学习之爬虫(一)–获取论坛中学生获得offer信息 目的:爬取帖子中每个学生的offer信息,并保存在Excel文档中. 爬取结果 过程 1. 爬取每个帖子中学生offer信息 1.1 查 ...

  2. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  3. python调用shell命令-Python调用shell命令常用方法(4种)

    方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未找到,该方法适用于shell命令 ...

  4. python 调用linux命令-Python调用shell命令常用方法

    Python调用shell指令 方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未 ...

  5. python调用shell命令-python调用shell命令小结

    在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen.默认情况下subprocess.call的方法结果是返回值 ...

  6. 如何实现Python调用C代码--python与C之间如何通信(swig)

    转载: https://www.zhihu.com/question/23003213 1. C代码如何调用Python 1.1 test #include <Python.h> int ...

  7. python调用百度翻译-Python 调用百度翻译API

    由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...

  8. python脚本中执行另一个脚本_如何用python调用另一个python脚本?

    如果想要将已经设置好的内容,在转移到另一个位置要怎么做呢?小编能写到的方法有,照抄,复制,以及转移使用.在我们日常办公上是非常好理解的,就是ctr v,但是如果想在编程上,将某一位置拿去到别的项目上使 ...

  9. python 无法调用turtle_新人求助,关于python 调用turtle《python简单turtle教程》

    新人求助,关于python 调用turtle 什么呀 turtle是python的简单的绘块,以下是一个例子from turtle import * def yin(radius, color1, c ...

最新文章

  1. AWS实例上AMI和用户名的映射表
  2. windows设置mysql使用率_Windows下配置Mysql
  3. VCSA 6.X(VMware vCenter Server Appliance)空间不足问题处理
  4. [论文阅读] Deep Transformers For Fast Small Intestine Grounding In Capsule Endoscope Video
  5. VB中DoEvents的注意事项
  6. DeeCamp,(可能是)全球最好的 AI 夏令营
  7. A blog from Sensory
  8. 太实用了!Schedule模块, Python 周期任务神器!
  9. python生成随机字符串包含数字字母_使用python生成一个指定长度的字符串(随机密码),要求包括数字、字母、特殊符号(string库解析)...
  10. java:从淘宝获取优惠券的、带推广链接的、带淘口令的商品信息
  11. Swift函数式编程十三(函子、适用函子、单子)
  12. 使用CSS完成用户注册页面;
  13. c语言做相册影集,制作DIY相册影集教程-如何制作影集
  14. 面试中可以提问面试官的问题
  15. 不懂分布式,枉称大数据
  16. Python升级pip失败解决办法
  17. 蓝牙路由器蓝牙点对多点组网蓝牙远程控制
  18. 自定义UILabel,添加verticalAlignment属性
  19. 使用setViewControllers实现一些不同寻常的跳转
  20. 线阵相机的优势是什么?如何选择线阵相机?

热门文章

  1. OSS.Common获取枚举字典列表标准库支持
  2. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理
  3. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...
  4. 封装一个Array 数据 绑定 html select 方法
  5. [转]敏捷开发之Scrum扫盲,及敏捷开发中XP与SCRUM的区别
  6. Android之解决Base64 encode中文乱码问题
  7. Andorid之BINDSERVICE的使用方法总结
  8. vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!
  9. c++ long 转 short_C精品编程之——C语言的数据类型、运算符、表达式,精品课程...
  10. 你还记得当初是怎么对我的吗? | 今日最佳