您好,登錄后才能下訂單哦!
小編給大家分享一下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 long | capacity | logical size in bytes of the block device backing image |
unsigned long long | allocation | highest allocated extent in bytes of the block device backing image |
unsigned long long | physical | physical size in bytes of the container of the backing image |
}
virDomainBlockStatsStruct
struct virDomainBlockStatsStruct {
long long | rd_req | number of read requests |
long long | rd_bytes | number of read bytes |
long long | wr_req | number of write requests |
long long | wr_bytes | number of written bytes |
long long | errs | In Xen this returns the mysterious 'oo_req'. |
}
以上是“KVM虛擬機(jī)監(jiān)控的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(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)容。