KVM虚拟机监控的示例分析

70次阅读
没有评论

共计 3710 个字符,预计需要花费 10 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 KVM 虚拟机监控的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    1 对 CPU 的监控

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)# 根据 OpenStack 创建的 Instance ID 得到相应的 Domain 对象
except:
print  fail to find the domain by ID
sys.exit(1)

Pstart_time=time.time()  # 取当前时间
Dstart_time=dom0.info()[4]# 直接获取 DomainInfo 中的 CPU 时间信息
time.sleep(2)
Dstop_time=dom0.info()[4]
Pstop_time=time.time()
core_num=int(dom0.info()[3])# 获取 DomainIndo 中的 core 数量信息

#CPU 利用率计算公式 -CPU 时间差 / 时间间隔 /1000000000/ 核的数量 *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 对内存的监控

python 代码

def get_memory(pid):# 定义获取当前已使用的内存的函数
mem=0

#linux 下 /proc/pid(进程 ID)/smaps 下保存的是进程内存映像信息,比同一目录下的 maps 文件更详细些

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

  #统计 Private 内存信息量
mem+=int(re.findall( (\d+) ,line)[0])
return mem

# 根据实例名获取进程 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

验证方法:可以 SSH 到相应的虚拟实例上,如果是 Linux 系统可以用 free - m 指令查看内存使用率

   3 对磁盘的监控

    创建虚拟机应用实例时,会生成相应的 XML 文件来表明实例的信息

   def get_devices(dom,path,devs):# 该函数用于获取 XML 中某节点的值

tree=ElementTree.fromstring(dom.XMLDesc(0))# 将 XML 文件转换为 XML 树对象
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):# 获取磁盘状态信息函数 包含磁盘读入的总比特数和写出的总比特数
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 为默认传入的参数
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)

验证方法:可以 SSH 到相应的虚拟实例上,如果是 Linux 系统可以用 df - h 指令查看磁盘使用率

    4 对网络的监控

def get_nicInfo(nics):# 获取网络信息包括 Receive 的总比特数和 Transmit 的总比特数
net_status={}

# 通过 cat /proc/net/dev 命令查看网络信息
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={}

# 获取网卡名称
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 官网 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 虚拟机监控的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3710字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)