python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)
通常在我們的云環(huán)境中,為了保證云平臺中虛擬機(jī)的正常運(yùn)行,基本都需要這樣一個功能,就是收集虛擬機(jī)的監(jiān)控數(shù)據(jù),比如cpu的使用率、內(nèi)存的使用率、磁盤io、網(wǎng)絡(luò)io等基本信息??梢岳眠@些信息及時調(diào)整云平臺環(huán)境中出現(xiàn)的一些問題,從而實現(xiàn)保證VM的正常運(yùn)行。
說到KVM管理工具,首先應(yīng)該想到的就是libvirt,因為目前對KVM使用最為廣泛的管理工具(應(yīng)用程序接口)就是libvirt。Libvirt本身構(gòu)建于一種抽象的概念上,它為受支持的虛擬機(jī)監(jiān)控程序?qū)崿F(xiàn)常用功能提供通用的API。Libvirt提供了操作KVM的原生層接口,可以實現(xiàn)對虛擬機(jī)的基本管理操作。Libvirt庫用C實現(xiàn),且包含對python的直接支持。Libvirt-python就是基于libvirt API的python語言綁定工具包,通過該包可以實現(xiàn)對VM日常管理和監(jiān)控數(shù)據(jù)的獲取。
利用python通過調(diào)用libvirt API獲取VM的監(jiān)控信息
1)通過導(dǎo)入libvirt模塊,然后連接本地qemu虛擬機(jī)監(jiān)控程序。獲取宿主機(jī)上每個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()返回列表參數(shù)說明:
[State:1, Max memory:2097152L, Used memory:2097152L, CPU(s):2, CPU time:4245630000000L]
具體的參數(shù)值代表的意思請參考http://libvirt.org/html/libvirt-libvirt-domain.html對應(yīng)的API。
通過這個簡單的示例可以看出libvirt通過python提供的強(qiáng)大功能。
2)獲取cpu的使用率
Libvirt中不能直接獲取虛擬機(jī)的cpu使用率但是可以通過cputime來計算出實際的使用率,計算公式為:
首先得到一個周期差:cputime_diff = (cpuTimenow — cpuTimet seconds ago)
計算實際使用率:%cpu = 100 × cpu_time_diff / (t × nr_cores × 109)實現(xiàn):
說明:
可以通過dom.info()[4]獲得cputime
通過dom.info()[3]獲得cpu數(shù)
簡單示例: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)獲取網(wǎng)絡(luò)流量信息
可以利用dom.interfaceStats(interface)獲取虛擬網(wǎng)卡的流量信息,但是該方法需要傳遞一個虛擬網(wǎng)卡名做為參數(shù)??梢允褂胠ibvirt的API獲取domain的情況,并獲取xml配置文件。通過xml的tree來獲取每個可用的要監(jiān)測設(shè)備的名稱,再通過domain去獲取設(shè)備的屬性字段值即是要監(jiān)控的數(shù)值。
簡單示例: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)返回結(jié)果說明:
(rx_bytes:24194376L, rx_packets:363592L, rx_errs:0L, rx_drop:0L, tx_bytes:852996L, tx_packets:20302L, tx_errs:0L, tx_drop:0L)
可以通過對這些基本數(shù)據(jù)加工處理得到網(wǎng)絡(luò)吞吐等信息。
4)獲取磁盤信息
獲得磁盤的總量和已使用量,可以通過dom.blockInfo(dev)獲取。該方法需要傳遞一個參數(shù),可以使用libvirt的API獲取domain的情況,并獲取xml配置文件。通過xml的tree來獲取每個可用的要監(jiān)測設(shè)備的名稱,再通過domain去獲取設(shè)備的屬性字段值即是要監(jiān)控的數(shù)值。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)返回結(jié)果說明:
(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)返回列表參數(shù)說明:
(read_bytes=1412453376L,read_requests=67017L, write_bytes=2315730432L, write_requests=245180L,errors=-1L)
通過上邊的基礎(chǔ)操作可以得到一些磁盤的基礎(chǔ)數(shù)據(jù),可以對這些數(shù)據(jù)處理得到想要的磁盤信息,如:磁盤iops等
5)獲得內(nèi)存信息
可以通過domain.memoryStats()來獲取memory的相關(guān)信息。
簡單示例: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()返回結(jié)果說明:
{'swap_out': 0L, 'available': 1884432L, 'actual': 2097152L, 'major_fault': 457L, 'swap_in': 0L, 'unused': 1367032L, 'minor_fault': 1210349717L, 'rss': 743604L}
其中actual是啟動虛機(jī)時設(shè)置的最大內(nèi)存,rss是qemu process在宿主機(jī)上所占用的內(nèi)存,unused代表虛機(jī)內(nèi)部未使用的內(nèi)存量,available代表虛機(jī)內(nèi)部識別出的總內(nèi)存量,
那么虛機(jī)內(nèi)部的內(nèi)存使用量則是可以通過(available-unused)得到。
其實可以使用libvirt的命令行工具獲取并查看虛機(jī)的內(nèi)存信息
具體操作如下:$?virsh?dommemstat?instance1
actual?2097152
swap_in?0
rss?743604
如果出現(xiàn)如上情況,是因為在VM內(nèi)沒有安裝virtio驅(qū)動,所有不能獲取VM內(nèi)存的詳細(xì)信息。
正常在VM內(nèi)部安裝virtio驅(qū)動并且支持memballoon,執(zhí)行上述操作可以看到如下結(jié)果:$?virsh?dommemstat?instance1
actual?2097152
swap_in?0
swap_out?0
unused?1367032
available?2050112
rss?743604
注意:
要獲取VM內(nèi)存使用詳細(xì)信息,VM中需要安裝virtio驅(qū)動并且支持memballoon。
關(guān)于virtio驅(qū)動:Linux一般都會包含(通過 lsmod | grep virtio 查看),但是windows的virtio驅(qū)動需要自己在鏡像中安裝。
windows注意事項:
首先windows需要安裝virtio-win相關(guān)驅(qū)動,驅(qū)動下載地址 在這里 ,除此之外還需要啟動BLNSVR服務(wù)。
在 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
總結(jié)
以上是生活随笔為你收集整理的python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis plus 批量保存_my
- 下一篇: 电影《拿破仑》中文角色海报发布,12 月