KVM 가상 머신 CPU, 메모리, io 사용량을 모니터링하는 Python 스크립트

KVM 가상 머신 CPU, 메모리, io 사용량을 모니터링하는 Python 스크립트

libvirt-python

Libvirt 자체는 지원되는 하이퍼 바이저의 일반적으로 사용되는 기능에 대한 공통 API를 제공하는 추상 개념을 기반으로합니다. Libvirt는 가상 머신에서 기본 관리 작업을 구현할 수있는 KVM 운영을위한 기본 계층 인터페이스를 제공합니다.

Libvirt-python은 libvirt API를 기반으로 한 Python 언어 바인딩 툴킷으로,이를 통해 VM의 일일 관리 및 모니터링 데이터를 얻을 수 있습니다.

Python을 사용하여 libvirt API를 호출하여 VM 모니터링 정보를 얻을 수 있습니다.

파이썬 스크립트

#!/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 

가동 결과

여기에 사진 설명 삽입

참고 문헌

  • Python (libvirt API 기반)을 통해 kvm 가상 머신의 모니터링 정보 얻기 : https://blog.51cto.com/10616534/1878609

더 많은 정보


안녕하십니까! 최신 최고의 IT 기술에 대해 더 알고 싶다면 내 WeChat 공개 계정을 팔로우하세요 ~


······································· ······································· ········································


WeChat 공개 계정 회신 : 666, "OpenStack + KVM 기술을 기반으로 사설 클라우드 구축"의 모든 메모를받습니다.

여기에 사진 설명 삽입

추천

출처blog.csdn.net/geeksoarsky/article/details/103651538