使用libvirt技术监控虚拟机资源利用情况

(一)计算资源与内存资源的监控

libvirt中提供virDomainGetInfo方法可以将一个domain的计算资源和内存资源的使用情况封装在一个结构体中,如下:

  1. struct virDomainInfo{
  2. unsigned char state : //the running state, one of virDomainState
  3. unsigned long maxMem :// the maximum memory in KBytes allowed
  4. unsigned long memory :// the memory in KBytes used by the domain
  5. unsigned short nrVirtCpu :// the number of virtual CPUs for the domain
  6. unsigned long long cpuTime : //the CPU time used in nanoseconds
  7. }

获取内存资源和计算资源监控信息并打印的方法如下:

  1. virDomainInfoPtr domaininfo;
  2. domaininfo = malloc(sizeof(virDomainInfo)* 1);
  3. m = virDomainGetInfo(allDomains[numOfDom] , domaininfo);
  4. printf("状态:%d    ",(*domaininfo).state);
  5. printf("最大内存:%ld    ",((*domaininfo).maxMem)/1024);
  6. printf("内存:%ld   ",((*domaininfo).memory)/1024);
  7. printf("虚拟cpu个数:%d   ",(*domaininfo).nrVirtCpu);
  8. printf("cpu时间:%lld   ",(*domaininfo).cpuTime);

libvirt中并不能直接获取到虚拟机的CPU使用率,但是可以通过CPUTIME来计算出实际使用率。计算的公式为:

首先得到一个周期差:cpu_time_diff = cpuTimenow — cpuTimet seconds ago

然后根据这个差值计算实际使用率:%CPU = 100 × cpu_time_diff / (t × nr_cores × 109)

cpuTime可以通过virDomainGetInfo(C)和virDomain::info()(Python)获得

#include <stdio.h>
#include <sys/time.h>
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h> int main(int argc, char ** argv) {
virConnectPtr conn = virConnectOpen("qemu:///system");
if(conn == NULL) {
printf("error connecting qemu driver\n");
exit(1);
}
virDomainPtr vm_ptr = virDomainLookupByName(conn, "1");
if(vm_ptr == NULL) {
printf("error finding domain\n");
virConnectClose(conn);
exit(1);
}
virDomainInfo info_s,info_e;
struct timeval real_time_s, real_time_e;
int cpu_diff, real_diff;
float usage;
while(true){
if(virDomainGetInfo(vm_ptr, &info_s) !=0) {
printf("error get domain info\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
} if(gettimeofday(&real_time_s, NULL) == -1) {
printf("error get time of day\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
} sleep(1); if(virDomainGetInfo(vm_ptr, &info_e) !=0) {
printf("error get domain info\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
} if(gettimeofday(&real_time_e, NULL) == -1) {
printf("error get time of day\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
}//转换成微秒
cpu_diff = (info_e.cpuTime - info_s.cpuTime) / 1000;
//转换成微秒
real_diff = 1000000 * (real_time_e.tv_sec - real_time_s.tv_sec) +
(real_time_e.tv_usec - real_time_s.tv_usec);
//是否要考虑多核的情况?
usage = cpu_diff / (float) (real_diff);
printf("cpu_diff:%d, real_diff:%d, cpu usage:%f\n", cpu_diff, real_diff, usage);
}
virDomainFree(vm_ptr);
virConnectClose(conn);
return 0;
#include <stdio.h>
#include <sys/time.h>
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h> int main(int argc, char ** argv) {
virConnectPtr conn = virConnectOpen("qemu:///system");
if(conn == NULL) {
printf("error connecting qemu driver\n");
exit(1);
}
virDomainPtr vm_ptr = virDomainLookupByName(conn, "1");
if(vm_ptr == NULL) {
printf("error finding domain\n");
virConnectClose(conn);
exit(1);
} virTypedParameter par_s, par_e;
struct timeval real_time_s, real_time_e; int cpu_diff, real_diff;
float usage; while(true){
if(gettimeofday(&real_time_s, NULL) == -1) {
printf("error get time of day\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
}
virDomainGetCPUStats(vm_ptr, &par_s, 1, -1, 1, 0);
sleep(1);
if(gettimeofday(&real_time_e, NULL) == -1) {
printf("error get time of day\n");
virDomainFree(vm_ptr);
virConnectClose(conn);
exit(1);
virDomainGetCPUStats(vm_ptr, &par_e, 1, -1, 1, 0);
cpu_diff = (par_e.value.ul - par_s.value.ul) / 1000;
real_diff = 1000000 * (real_time_e.tv_sec - real_time_s.tv_sec) +
(real_time_e.tv_usec - real_time_s.tv_usec);
usage = cpu_diff / (float)(real_diff);
printf("cpu_diff:%d, real_diff:%d, cpu usage:%f\n", cpu_diff, real_diff, usage); }
virDomainFree(vm_ptr);
virConnectClose(conn);
return 0;
}

这两个接口的结果差不多,利用率与top命令输出一致,但是与虚拟机内部使用率不一致。如将结果除以vcpu个数,则cpu利用率更接近虚拟机内部的虚拟机使用率。

对于memory利用率,windows需要安装 virtio memory balloon drivers for Windows guests,这样 memory/MaxMemory就是正确的内存利用率。如果不安装,那么这个比例始终为1。

(二)获得网络流量信息

可以使用 virDomainInterfaceStats方法,将一个domain的网络流量信息封装在一个virDomainInterfaceStatsStruct结构体中,该方法需要传递一个虚拟网卡接口的参数,这个参数可以通过XML文件取得:

<interface type='bridge'>
      <mac address='00:16:3e:74:03:53'/>
      <source bridge='xenbr0'/>
      <script path='vif-bridge'/>
      <target dev='vif1.0 '/>          /*这个就是需要的参数*/
    </interface>

具体代码如下:

    1. virDomainInterfaceStatsPtr interfacestats;
    2. interfacestats = malloc(sizeof(virDomainInterfaceStatsStruct)* 10);
    3. m = virDomainInterfaceStats(allDomains[numOfDom], i_path, interfacestats, 10);
    4. printf("rx字节数:%ld    ",(*interfacestats).rx_bytes);
    5. printf("tx字节数:%ld    ",(*interfacestats).tx_bytes);
    6. printf("rx丢包:%ld    ",(*interfacestats).rx_drop);
    7. printf("tx丢包:%ld\n",(*interfacestats).tx_drop);

使用libvirt技术监控虚拟机资源利用情况的更多相关文章

  1. 【转载】阿里云ECS服务器监控资源使用情况

    在阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况.内存使用率.网络流入带宽.网络流 ...

  2. 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

    前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能 ...

  3. 第15章: Prometheus监控Kubernetes资源与应用

    Prometheus监控Kubernetes资源与应用 目录 1 监控方案 2 2 监控指标 4 3 实现思路 4 4 在K8S中部署Prometheus 4 5 在K8S中部署Grafana与可视化 ...

  4. 使用visualVM 1.3.8(visualvm_138-ml.zip) 监控远程Tomcat运行情况

    服务端CentOS6.4 x64安装的是jdk1.7 下载visualVM1.3.8-ml 也就是多语言版本,包含中文,界面用起来方便.官方下载地址比较慢,百度上搜索的都是csdn,51cto等必须登 ...

  5. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

    原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...

  6. docker stats监控容器资源消耗

    在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸运的是 docker 自己就提供了这样的命令:docker stats. 默认输出 docker sta ...

  7. libvirt工具实现虚拟机管理

    libvirt工具实现虚拟机管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.介绍virt-install命令的常用参数 virt-install是一个命令行工具,它能够为K ...

  8. Prometheus 监控K8S 资源状态对象

    Prometheus 监控K8S 资源状态对象 官方文档:https://github.com/kubernetes/kube-state-metrics kube-state-metrics是一个简 ...

  9. COW技术重置虚拟机

    最近使用COW技术做虚拟机重置,结果成功了,特地来给大家分享一下这次的成果! 文章目录 一.COW技术是什么? 二.重置虚拟机步骤 总结 往期杂文 一.COW技术是什么? Copy On Write, ...

随机推荐

  1. java开始到熟悉105-107

    1,HashMap基本用法 package list; import java.util.HashMap; import java.util.Map; /** * 测试map的基本用法 * @auth ...

  2. .Net 平台WebService的创建、部署和使用介绍

    .NET平台内建了对Web Service的支持,包括Web Service的构建和使用.与其它开发平台不同,使用.NET平台,你不需要其他的工具或者SDK就可以完成Web Service的开发了.. ...

  3. java基础&amp;&amp;高薪面试

    董鹏老师 ,多年经验总结出 [高薪就业必备]之java基础面试题[更新中]:     第01篇       学习Java基础的目的?       第02天       java语言中有没有gotoke ...

  4. 成长为 iOS 大 V 的秘密

    成长为 iOS 大 V 的秘密   前言 毫不谦虚地说,我是国内 iOS 开发的大 V.我从 2011 年底开始自学 iOS 开发,经过 3 年时间,到 2014 年底,我不但写作了上百篇 iOS 相 ...

  5. HBase写请求分析

    HBase作为分布式NoSQL数据库系统,不单支持宽列表.而且对于随机读写来说也具有较高的性能.在高性能的随机读写事务的同一时候.HBase也能保持事务的一致性. 眼下HBase仅仅支持行级别的事务一 ...

  6. oracle指定访问某表或某视图

    在oracle中,想创建一个账号,然后只能只读地访问指定的表,怎么搞? 一.为特定的表创建视图 创建视图的时候还可以加上过滤条件,连访问哪些数据都可以指定. create or replace vie ...

  7. bzoj4486: [Jsoi2015]串分割

    肉丝哥哥钦定好题 话说我的blog现在为什么到处都是肉丝哥哥 先来想一个弱化版,假如能够n整除K怎么做? 把每个数字看成一个字符串,按字典序排名,这个可以后缀数组解决,然后暴力枚举每种情况,O(1)判 ...

  8. POJ 1088 滑雪 ( DFS+动态规划思想 )

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79519   Accepted: 29581 Description ...

  9. Codeforces Beta Round #7 D. Palindrome Degree —— 字符串哈希

    题目链接:http://codeforces.com/contest/7/problem/D D. Palindrome Degree time limit per test 1 second mem ...

  10. BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...