Python脚本监测KVM虚拟机 CPU、内存、io使用率

释放双眼,带上耳机,听听看~!

Python脚本监测KVM虚拟机 CPU、内存、io使用率

  • libvirt-python
    • python脚本
    • 使用方法
    • 运行结果
    • References
    • More Info

libvirt-python

Libvirt本身构建于一种抽象的概念上,它为受支持的虚拟机监控程序实现常用功能提供通用的API。Libvirt提供了操作KVM的原生层接口,可以实现对虚拟机的基本管理操作。

Libvirt-python就是基于libvirt API的python语言绑定工具包,通过该包可以实现对VM日常管理和监控数据的获取。

我们可以利用python通过调用libvirt API获取VM的监控信息

python脚本


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
1#!/usr/bin/python
2# -*- coding: UTF-8 -*-
3#author: Ensys Yule
4#date: 2019/12/21
5#mail: 609961022@qq.com
6import libvirt
7import time
8from xml.etree import ElementTree
9import os
10import commands
11import sys
12'''将bytes数转换成更加直观的符号显示'''
13def bytes2symbols(bytes_value):
14
15    '''单位符号'''
16    symbols = ('K' ,'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
17
18    '''每个单位对应的bytes数的字典,先定义为空'''
19    prefix={}
20
21    '''要得到这样的{K:1024, M:1024*1024,G:1024**3},进行for循环'''
22    for i,s in enumerate(symbols):
23        # '''enumerate()为列举函数'''
24        # '''i:代表下标'''
25        # '''s:代表改下标对应的值'''
26
27        # '''取到符号元组的值,作为prfix字典的key,根据key给value进行赋值'''
28        prefix[s]=1024**(i+1)
29
30    # '''打印得到的对应字典'''
31    # print(prefix)
32    symbols_value=0
33    symbol=''
34    # '''循环prefix字典,得到转换值'''
35    for key,value in prefix.items():
36        if bytes_value >=value :
37            symbols_value=bytes_value/value
38            symbol=key
39        # 如果不满足最小的KB,则以B显示
40        elif bytes_value <1024:
41            return  '%0.2fB'%bytes_value
42        # '''返回转换值(str)'''
43    return  '%0.2f%sB'%(symbols_value,symbol)
44
45while True:
46    os.system('clear')
47    conn = libvirt.open("qemu:///system")
48    print '''
49*********************************************
50                   _ooOoo_
51                  o8888888o
52                  88" . "88
53                  (| -_- |)
54                  O\  =  /O
55               ____/`---'\____
56             .'  \\|     |//  `.
57            /  \\|||  :  |||//  \
58           /  _||||| -:- |||||-  \
59           |   | \\\  -  /// |   |
60           | \_|  ''\---/''  |   |
61           \  .-\__  `-`  ___/-. /
62         ___`. .'  /--.--\  `. . __
63      ."" '<  `.___\_<|>_/___.'  >'"".
64     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
65     \  \ `-.   \_ __\ /__ _/   .-` /  /
66======`-.____`-.___\_____/___.-`____.-'======
67                   `=---='
68^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
69           佛祖保佑       永不宕机'''
70    print '\033[0;37;41m%s\033[0m'%'\n\n######################     实时监控kvm虚拟机信息--CPU,内存,磁盘I/O    ##################'
71    print '\n作者:黄宇轩'
72    print '时间: 2019/12/21'
73    print 'Ctrl+C 可退出程序,脚本每6秒执行一次'
74    if len(conn.listDomainsID()) <= 0 :
75        print '\033[0;37;41m%s\033[0m'%'没有正在运行的虚拟机,程序退出.'
76        os.system('command')
77        time.sleep(1)
78        sys.exit()
79    try:
80        for id in reversed(conn.listDomainsID()):
81            print '\n'
82            domain = conn.lookupByID(id)
83            print '实例名:'+'\033[0;37;44m%s\033[0m'%domain.name() + '\n'
84            print '状态:'+'\033[0;37;42m%s\033[0m'%'开机' if domain.info()[0]==1 else '\033[0;37;41m%s\033[0m'%'关机',
85            print '最大内存:' + (str)(domain.info()[1]/1024) + 'Mb',
86            print 'CPU数量:' + (str)(domain.info()[3]),
87            print 'CPU时间:' + (str)(domain.info()[4])
88
89            #开始计算虚拟机内存
90            domain.setMemoryStatsPeriod(10)
91            meminfo = domain.memoryStats()
92            free_mem = float(meminfo['unused'])
93            total_mem = float(meminfo['available'])
94            util_mem = ((total_mem-free_mem) / total_mem)*100
95            print ('内存已使用:' + str(util_mem)) + '%'
96
97            #开始计算磁盘I/O
98            tree = ElementTree.fromstring(domain.XMLDesc())
99            devices = tree.findall('devices/disk/target')
100            for d in devices:
101                device = d.get('dev')
102                try:
103                    devstats = domain.blockStats(device)
104                    print '磁盘设备:'+(device,devstats)[0],
105                    read_bytes = bytes2symbols((device,devstats)[1][0])
106                    write_bytes = bytes2symbols((device,devstats)[1][2])
107
108                    print('读:%10s'%read_bytes),
109                    print '读取请求:' + (str)((device,devstats)[1][1])+ '次',
110                    print('写:%10s'%read_bytes),
111                    print '写入请求:' + (str)((device,devstats)[1][3])+ '次'
112                except libvirt.libvirtError:
113                    pass
114            
115            #开始计算cpu使用率
116            t1 = time.time()
117            c1 = int (domain.info()[4])
118            time.sleep(0.05);
119            t2 = time.time();
120            c2 = int (domain.info()[4])
121            c_nums = int (domain.info()[3])
122            usage = (c2-c1)*100/((t2-t1)*c_nums*1e9)
123            print ("CPU 已使用:" + (str)(usage)) + '%'
124    except:
125        pass
126    os.system('command')
127    time.sleep(6)
128
129

使用方法


1
2
3
4
5
6
1[root@localhost ~]# python -V
2Python 2.7.5
3[root@localhost ~]# vim kvm_monitor.py
4[root@localhost ~]# python kvm_monitor.py
5
6

运行结果

Python脚本监测KVM虚拟机 CPU、内存、io使用率

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ list, vector, map, set 区别与用法比较

2022-1-11 12:36:11

安全漏洞

2019 年热门开源项目中的漏洞增加了一倍以上

2020-6-10 11:12:22

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索