溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

KVM虛擬機(jī)監(jiān)控的示例分析

發(fā)布時(shí)間:2021-12-17 11:31:59 來源:億速云 閱讀:207 作者:小新 欄目:云計(jì)算

小編給大家分享一下KVM虛擬機(jī)監(jiān)控的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    1 對(duì)CPU監(jiān)控

Python 代碼

import libvirt
import os
import time

conn=libvirt.open("qemu:///system")
if conn==None:
print "fail to connect hypervisor"
sys.exit(1)
try:
dom0=conn.lookupByID(85)#根據(jù)OpenStack創(chuàng)建的Instance ID得到相應(yīng)的Domain對(duì)象
except:
print "fail to find the domain by ID"
sys.exit(1)

Pstart_time=time.time()   #取當(dāng)前時(shí)間
Dstart_time=dom0.info()[4]#直接獲取DomainInfo中的CPU時(shí)間信息
time.sleep(2)
Dstop_time=dom0.info()[4]
Pstop_time=time.time()
core_num=int(dom0.info()[3])#獲取DomainIndo中的core數(shù)量信息

#CPU利用率計(jì)算公式-CPU時(shí)間差/時(shí)間間隔/1000000000/核的數(shù)量*100=CPU利用率
cpu_usage=(Dstart_time-Dstop_time)/(Pstart_time-Pstop_time)/1000000000/core_num*100
cpu_usage=cpu_usage if (cpu_usage>0) else 0.0
cpu_usage=cpu_usage if (cpu_usage<100) else 100.0
print cpu_usage

     

   2 對(duì)內(nèi)存的監(jiān)控

python代碼

def get_memory(pid):#定義獲取當(dāng)前已使用的內(nèi)存的函數(shù)
mem=0

#linux下 /proc/pid(進(jìn)程ID)/smaps 下保存的是進(jìn)程內(nèi)存映像信息,比同一目錄下的maps文件更詳細(xì)些

for line in file('/proc/%d/smaps' % int(pid),'r'):
if re.findall('Private_',line):

  #統(tǒng)計(jì)Private內(nèi)存信息量
mem+=int(re.findall('(\d+)',line)[0])
return mem

#根據(jù)實(shí)例名獲取進(jìn)程ID

pid=(os.popen("ps aux|grep "+dom0.name()+" | grep -v 'grep' | awk '{print $2}'").readlines()[0])
memstatus=get_memory(pid)
memusage='%.2f' % (int(memstatus)*100.0/int(dom0.info()[2]))
print memusage

驗(yàn)證方法: 可以SSH到相應(yīng)的虛擬實(shí)例上,如果是Linux 系統(tǒng)可以用free -m指令查看內(nèi)存使用率

   3 對(duì)磁盤的監(jiān)控

   創(chuàng)建虛擬機(jī)應(yīng)用實(shí)例時(shí),會(huì)生成相應(yīng)的XML文件來表明實(shí)例的信息

   def get_devices(dom,path,devs):#該函數(shù)用于獲取XML中某節(jié)點(diǎn)的值

tree=ElementTree.fromstring(dom.XMLDesc(0))#將XML文件轉(zhuǎn)換為XML樹對(duì)象
devices=[]
for target  in tree.findall(path):
dev=target.get(devs)
if  not dev  in devices:
devices.append(dev)
return devices

def get_blockStats(dom):#獲取磁盤狀態(tài)信息函數(shù) 包含磁盤讀入的總比特?cái)?shù)和寫出的總比特?cái)?shù)
block_status={}
disks=get_devices(dom,"devices/disk/target","dev")
for block in disks:
block_status[block]=dom.blockStats(block)
return block_status

block_status0={}
block_status1={}
block_status0=get_blockStats(dom0)
time.sleep(2)
block_status1=get_blockStats(dom0)
block_info=[]
for block in get_devices(dom0,"devices/disk/source","file"):
block_info.append(dom0.blockInfo(block,0))#獲取磁盤信息 其中0為默認(rèn)傳入的參數(shù)
for domBlockInfo in block_info:
print "logical size in bytes :%s" % domBlockInfo[0]
print "highest allocated extent in bytes :%s" % domBlockInfo[1]
print "physical size in bytes :%s" % domBlockInfo[2]
print "disk usage :%s" % str(domBlockInfo[1]/1.0/domBlockInfo[0]*100)[:5]
for block in get_devices(dom0,"devices/disk/target","dev"):
print "rd_speed :%s" % str((block_status1[block][1]-block_status0[block][1])/2048)
print "wr_speed :%s" % str((block_status1[block][3]-block_status0[block][3])/2048)

驗(yàn)證方法: 可以SSH到相應(yīng)的虛擬實(shí)例上,如果是Linux 系統(tǒng)可以用df -h指令查看磁盤使用率

    4 對(duì)網(wǎng)絡(luò)的監(jiān)控

def get_nicInfo(nics):#獲取網(wǎng)絡(luò)信息包括Receive的總比特?cái)?shù)和Transmit的總比特?cái)?shù)
net_status={}

#通過 cat /proc/net/dev 命令查看網(wǎng)絡(luò)信息
for nic  in nics:
net_status[nic]=[os.popen("cat /proc/net/dev |grep -w '"+nic+"' |awk '{print $10}'").readlines()[0][:-1],os.popen("cat /proc/net/dev |grep -w '"+nic+"' |awk '{print $2}'").readlines()[0][:-1]]
return net_status
net_status0={}
net_status1={}

#獲取網(wǎng)卡名稱
nics=get_devices(dom0,"devices/interface/target","dev")
net_status0=get_nicInfo(nics)
time.sleep(2)
net_status1=get_nicInfo(nics)
for nic  in nics:
print  "netcard_name :%s" % nic
print  "transmit_speed :%s" %  str((int(net_status1[nic][0])-int(net_status0[nic][0]))/2048)
print  "receive_speed :%s" %  str((int(net_status1[nic][1])-int(net_status0[nic][1]))/2048)

參考:

Libvirt 官網(wǎng)API定義

virDomainBlockInfo

struct virDomainBlockInfo {
unsigned long longcapacity

logical size in bytes of the block device backing image

unsigned long longallocation

highest allocated extent in bytes of the block device backing image

unsigned long longphysical

physical size in bytes of the container of the backing image

}

virDomainBlockStatsStruct

struct virDomainBlockStatsStruct {
long longrd_req

number of read requests

long longrd_bytes

number of read bytes

long longwr_req

number of write requests

long longwr_bytes

number of written bytes

long longerrs

In Xen this returns the mysterious 'oo_req'.

}

以上是“KVM虛擬機(jī)監(jiān)控的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

kvm
AI