日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/4 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。