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

通常在我们的云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘软件开发的达摩克利斯之剑

↑ ???? 万字长文不想看,那就听一听叭 ↑为什么你的程序总是出现 bug?凭什么让改 bug 占据了你大部分的时间?看完本文,保证你能设计出更稳定的程序,摆脱 bug 的缠绕,做项目更安心!记得我在学…

python 百度ai批量识别_Python基于百度AI的文字识别的示例

Python基于百度AI的文字识别的示例使用百度AI的文字识别库,做出的调用示例,其中filePath是图片的路径,可以自行传入一张带有文字的图片,进行识别。下载baidu-aip这个库,可以直接使用pip下载:pip install ba…

java使用教程——组件及事件处理——菜单(添加图标)

菜单条JMenuBar 菜单JMenu 菜单项JMenuItem menuFruit.addSeparator(); //在菜单添加分隔线 public class Example9_2 {public static void main(String args[]) {WindowMenu winnew WindowMenu("带菜单的窗口",20,30,600,290);} }C:/Users/86156/OneDrive/图片/水…

java使用教程——组件及事件处理——常用组件与布局

常用组件: 1.JTextField(文本框) 允许用户在文本框中输入单行文本 2.JTextArea(文本区) 允许用户文本区中输入多行文本 3.JLabel(标签) 标签为用户提供信息 4.JButton(按钮) 允许用户单击按钮 5.JCheckBox(复选框) 为用户提供多种选择 6.JComboBox(下拉列表&#xf…

数据库大战,AWS又将目标瞄准了微软SQL Server

喜欢就关注我们吧!文|白开水AWS 宣布了一种新的数据库产品 — 用于 Aurora PostgreSQL 的 Babelfish。该产品旨在效仿 Microsoft 的 SQL Server,并吸引 SQL Server 用户迁移到 AWS 云平台。图片来源:techcrunchAWS 首席执行官 Andy Jassy 在 …

python3九九乘法表儿歌下载_python3的基础学习之九九乘法表和format函数,值得收藏...

1. 九九乘法表1.1 代码一for i in range(1, 10): #range取值1,2,3,4,5,6,7,8,9;做i的值,到10停止,不取10for j in range(1, i 1): #range取值,1,2,3,4,5,6,7,8,9,当i9时,到i910停止,不取10prin…

java实用教程——组件及事件处理——处理事件

事件处理模式: 1.事件源; 能够产生事件的对象都可以称为事件源 2监视器; 需要一个对象对事件进行监视,以便对发生的事件做出处理 3处理事件的接口 监视器负责处理事件源发生的事件,为了让监视器这个对象能够对事件源发…

python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声

同时生成椒盐代码如下:通过pertotal 设置噪声总数 persalt盐噪声比例#同时加椒盐 总占比 pertotal ,persalt盐占比image cv.imread(c:\\meiping1.png)height image.shape[0]width image.shape[1]channels image.shape[2]pertotal 0.03 #总噪声占比…

惊!Kubernetes 将弃用 Docker,开发者们怎么办?

喜欢就关注我们吧!文|大东BE近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。但 Docker 作为容器镜像构建工具的作用将不受影响&#x…

sql计算留存_SQL基础第七讲:关于用户留存率的计算

最近,好几个小伙伴都拿着关于用户留存的面试题来问我,所以今天单独开一篇文章讲一下留存问题。首先看一下留存是什么,简单来说,我和你今天在一家超市购物了,明天我来购物了,你没来,那么我就是这…

java实用教程——组件及事件处理——ActionEvent事件

事件源: 文本框,按钮,菜单项,密码框,单选按钮 注册监视器: 能够触发ActionEvent事件的组件使用方法 addActionListener(ActionListener listener) 处理事件接口: ActionListener接口中只有一个方…

【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...

我是MVP 继与广州图书馆合作推出【搭上AI快车】在线公益课堂和大家分享了基于移动应用的人工智能开发经验后,本期继续与广州图书馆合作,邀请更多的微软技术专家,推出我们Azure Show节目的特别版,为大家带来各IT技术领域的经验分享…

java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)

ItemEvent事件源: 选择框,下拉列表都可以触发ItemEvent事件 注册监视器: 能够触发ItemEvent事件的组件使用addItemListener(ItemListener listen) 将实现ItemListener的接口的类的实例注册为事件源的监视器 ItemListener接口: 接口…

python开发一个自己的技术网站_手把手教你写网站:Python WEB开发技术实战

摘要:本文详细介绍了Python WEB开发的基础入门。以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程。通过本文的学习可以快速掌握基于Django的Python WEB的开发方法,进行WEB站点的实践开发。数十款阿里云产品限时折扣中,赶紧…

理解 redis 中的 哈希对象类型

redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景优先考虑下redis哦,起码可以装装嘛&#xff0c…

java实用教程——组件及事件处理——DocumentEvent事件

DocumentEvent事件源: 文本区Document的维护 注册监视器: 使用addDocumentListener(DocumentListener listen)为事件源添加监视器 DocumentListener接口: 接口中有三个方法: public void changUpdate(DocumentEvent e); public vo…

python递归函数查询表_python---------------递归函数

一、递归的定义1.什么是递归:在一个函数里在调用这个函数本身2.最大递归层数做了一个限制:997,但是也可以自己限制1 deffoo():2 print(n)3 n14 foo(n)5 foo(1)3.最大层数限制是python默认的,可以做修改,但是不建议你修…

prometheus-net.DotNetRuntime 获取 CLR 指标原理解析

prometheus-net.DotNetRuntime 介绍Intro前面集成 Prometheus 的文章中简单提到过,prometheus-net.DotNetRuntime 可以获取到一些 CLR 的数据,比如说 GC, ThreadPool, Contention, JIT 等指标,而这些指标可以很大程度上帮助我们解决很多问题&…

错误代码1500什么意思_啊早安打工人是什么梗???

早安打工人是什么梗?最近打工人这个词成为了大家口中最为常见的一个词语,打工人的爆火也引起了很多人的关注,这样一个词语在很多人看来很有可能还有点嘲讽的含义,却突然火遍全网,究竟打工人是什么梗?看起来…

java实用教程——组件及事件处理——MouseEvent事件

MouseEvent事件 任何组件上都可以发生鼠标事件,如鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个 事件对象,事件源注册监视器的方法是addMouseListener(MouseListener listener); …