經過python獲取kvm虛擬機的監控信息(基於libvirt API)

  一般在咱們的雲環境中,爲了保證雲平臺中虛擬機的正常運行,基本都須要這樣一個功能,就是收集虛擬機的監控數據,好比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

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()返回列表參數說明:bash

[State:1, Max memory:2097152L, Used memory:2097152L, CPU(s):2, CPU time:4245630000000L]網絡

 具體的參數值表明的意思請參考http://libvirt.org/html/libvirt-libvirt-domain.html對應的API。dom

 經過這個簡單的示例能夠看出libvirt經過python提供的強大功能。ide

 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

相關文章
相關標籤/搜索