通過python擷取kvm虛擬機器的監控資訊(基於libvirt API)

來源:互聯網
上載者:User

標籤:管理工具   虛擬機器   python   監控   雲平台   kvm   

  通常在我們的雲環境中,為了保證雲平台中虛擬機器的正常運行,基本都需要這樣一個功能,就是收集虛擬機器的監控資料,比如cpu的使用率、記憶體的使用率、磁碟io、網路io等基本資料。可以利用這些資訊及時調整雲平台環境中出現的一些問題,從而實現保證VM的正常運行。

  說到KVM管理工具,首先應該想到的就是libvirt,因為目前對KVM使用最為廣泛的管理工具(應用程式介面)就是libvirt。Libvirt本身構建於一種抽象的概念上,它為受支援的Hypervisor實現常用功能提供通用的API。Libvirt提供了操作KVM的原生層介面,可以實現對虛擬機器的基本管理操作。Libvirt庫用C實現,且包含對python的直接支援。Libvirt-python就是基於libvirt API的python語言綁定工具包,通過該包可以實現對VM日常管理和監控資料的擷取。

 利用python通過調用libvirt API擷取VM的監控資訊

 1)通過匯入libvirt模組,然後串連本地qemuHypervisor。擷取宿主機上每個instance的domain並擷取一些基本資料。

import libvirtconn = libvirt.open("qemu:///system")for id in conn.listDomainsID():    domain = conn.lookupByID(id)    print domain.name()      print domain.UUIDString()    print domain.info()conn.close()
[[email protected] opt]# python libvirt_test.py KaMg8c0hOSn1instance17dd3ec0e-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 libvirtimport timeconn = 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()
[[email protected] opt]# python libvirt_test.py instance1 Cpu usage 0.998784

 3)擷取網路流量資訊

  可以利用dom.interfaceStats(interface)擷取虛擬網卡的流量資訊,但是該方法需要傳遞一個虛擬網卡名做為參數。可以使用libvirt的API擷取domain的情況,並擷取xml設定檔。通過xml的tree來擷取每個可用的要監測裝置的名稱,再通過domain去擷取裝置的屬性欄位值即是要監控的數值。

簡單樣本:

import libvirtfrom xml.etree import ElementTreeconn = 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,ifaceinfoconn.close()
[[email protected] 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 libvirtfrom xml.etree import ElementTreeconn = 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,devinfoconn.close()
[[email protected] 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 libvirtfrom xml.etree import ElementTreeconn = 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:            passconn.close()
[[email protected] 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 libvirtconn = 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()
[[email protected] 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 instance1actual 2097152swap_in 0rss 743604

如果出現如上情況,是因為在VM內沒有安裝virtio驅動,所有不能擷取VM記憶體的詳細資料。


正常在VM內部安裝virtio驅動並且支援memballoon,執行上述操作可以看到如下結果:

$ virsh dommemstat instance1actual 2097152swap_in 0swap_out 0unused 1367032available 2050112rss 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擷取kvm虛擬機器的監控資訊(基於libvirt API)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.