Python腳本監測KVM虛擬機 CPU、內存、io使用率
libvirt-python
Libvirt本身構建於一種抽象的概念上,它爲受支持的虛擬機監控程序實現常用功能提供通用的API。Libvirt提供了操作KVM的原生層接口,可以實現對虛擬機的基本管理操作。
Libvirt-python就是基於libvirt API的python語言綁定工具包,通過該包可以實現對VM日常管理和監控數據的獲取。
我們可以利用python通過調用libvirt API獲取VM的監控信息
python腳本
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#author: Ensys Yule
#date: 2019/12/21
#mail: [email protected]
import libvirt
import time
from xml.etree import ElementTree
import os
import commands
import sys
'''將bytes數轉換成更加直觀的符號顯示'''
def bytes2symbols(bytes_value):
'''單位符號'''
symbols = ('K' ,'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
'''每個單位對應的bytes數的字典,先定義爲空'''
prefix={}
'''要得到這樣的{K:1024, M:1024*1024,G:1024**3},進行for循環'''
for i,s in enumerate(symbols):
# '''enumerate()爲列舉函數'''
# '''i:代表下標'''
# '''s:代表改下標對應的值'''
# '''取到符號元組的值,作爲prfix字典的key,根據key給value進行賦值'''
prefix[s]=1024**(i+1)
# '''打印得到的對應字典'''
# print(prefix)
symbols_value=0
symbol=''
# '''循環prefix字典,得到轉換值'''
for key,value in prefix.items():
if bytes_value >=value :
symbols_value=bytes_value/value
symbol=key
# 如果不滿足最小的KB,則以B顯示
elif bytes_value <1024:
return '%0.2fB'%bytes_value
# '''返回轉換值(str)'''
return '%0.2f%sB'%(symbols_value,symbol)
while True:
os.system('clear')
conn = libvirt.open("qemu:///system")
print '''
*********************************************
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永不宕機'''
print '\033[0;37;41m%s\033[0m'%'\n\n###################### 實時監控kvm虛擬機信息--CPU,內存,磁盤I/O ##################'
print '\n作者:黃宇軒'
print '時間: 2019/12/21'
print 'Ctrl+C 可退出程序,腳本每6秒執行一次'
if len(conn.listDomainsID()) <= 0 :
print '\033[0;37;41m%s\033[0m'%'沒有正在運行的虛擬機,程序退出.'
os.system('command')
time.sleep(1)
sys.exit()
try:
for id in reversed(conn.listDomainsID()):
print '\n'
domain = conn.lookupByID(id)
print '實例名:'+'\033[0;37;44m%s\033[0m'%domain.name() + '\n'
print '狀態:'+'\033[0;37;42m%s\033[0m'%'開機' if domain.info()[0]==1 else '\033[0;37;41m%s\033[0m'%'關機',
print '最大內存:' + (str)(domain.info()[1]/1024) + 'Mb',
print 'CPU數量:' + (str)(domain.info()[3]),
print 'CPU時間:' + (str)(domain.info()[4])
#開始計算虛擬機內存
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(util_mem)) + '%'
#開始計算磁盤I/O
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 '磁盤設備:'+(device,devstats)[0],
read_bytes = bytes2symbols((device,devstats)[1][0])
write_bytes = bytes2symbols((device,devstats)[1][2])
print('讀:%10s'%read_bytes),
print '讀取請求:' + (str)((device,devstats)[1][1])+ '次',
print('寫:%10s'%read_bytes),
print '寫入請求:' + (str)((device,devstats)[1][3])+ '次'
except libvirt.libvirtError:
pass
#開始計算cpu使用率
t1 = time.time()
c1 = int (domain.info()[4])
time.sleep(0.05);
t2 = time.time();
c2 = int (domain.info()[4])
c_nums = int (domain.info()[3])
usage = (c2-c1)*100/((t2-t1)*c_nums*1e9)
print ("CPU 已使用:" + (str)(usage)) + '%'
except:
pass
os.system('command')
time.sleep(6)
使用方法
[root@localhost ~]# python -V
Python 2.7.5
[root@localhost ~]# vim kvm_monitor.py
[root@localhost ~]# python kvm_monitor.py
運行結果
References
- 通過python獲取kvm虛擬機的監控信息(基於libvirt API):https://blog.51cto.com/10616534/1878609
More Info
你好! 如果你想學習更多最新、最高大上的 IT 技術, 關注下我的微信公衆號叭~
··································知識共享署名-發揚極客精神······························
微信公衆號回覆:666,獲取全部 “基於OpenStack+KVM 技術搭建私有云” 筆記