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

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

C代码  
  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. }

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

C代码  
  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>

具体代码如下:

C代码  
  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);

转载于:https://www.cnblogs.com/zhangzhang/archive/2013/02/28/2936248.html

使用libvirt技术监控虚拟机资源利用情况相关推荐

  1. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  2. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

    虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...

  3. 虚拟化技术:实现资源高效利用和灵活管理的利器

    虚拟化技术是一种通过软件或硬件手段,将物理资源抽象化,从而创建虚拟资源的技术.这种技术可以应用于计算.存储.网络等领域,通过将物理资源划分为多个虚拟资源,使得多个应用程序或用户可以共享同一组物理资源, ...

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

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

  5. elk6.3.1版本+metricbeat监控收集swarm的资源使用情况

    Elk自从5版本之后进行了这个metricbeat监控的增加: 主要用来收集服务器的资产使用情况 接下来我们开始配置一下: 首先下载metricbeat包6.3版本的 metricbeat.modul ...

  6. 利用ngxtop实时监控nginx的访问情况

    利用ngxtop实时监控nginx的访问情况 关于对nginx web server的实时访问的实时监控问题,我很久之前就想实现的,现在虽有nginx自带的status扩展,但那是全局的,无法细分到v ...

  7. 资源不足的情况怎么设置sparkrdd并行度_监控录像机资源不足或达到上限的原因及解决方法!...

    在安装网络监控摄像机过程中,很多人遇到硬盘录像机画面上提升"资源不足"或性能"达到上限"的问题,新手遇到这样的问题会选择重启录像机,但是几次反复发现并不能解决. ...

  8. [原创]如何在Windows XP 中利用监视计算机中的资源使用情况

    [原创]如何在Windows XP 中利用监视计算机中的资源使用情况 1. 开始菜单->控制面板->管理工具->性能 2. 右键单击添加计数器 3. 选择要监视计算机,我在这里选择了 ...

  9. Windows下使用Jconsole远程监控Linux系统中java服务器资源占用情况

    1.首先需要停止正在运行的服务:resin-XXX stop 2.然后在Linux的服务器启动项中添加如下信息: -Djava.rmi.server.hostname=192.168.1.122-Dc ...

最新文章

  1. git 远程仓库版本的回退以及git reset 几种常用方式记录
  2. 秋招 百度二轮面试---血淋淋的经历写实
  3. 把 分数化为循环小数 和 把循环小数化为分数 的方法
  4. SVN基本的理解和使用
  5. WPF DataGrid 通过自定义表头模拟首行固定
  6. 在Python中写入文件时,权限被拒绝错误
  7. 95-18-015-配置-AbstractBootstrapConfig
  8. 用友erpU8V10服务器数据库整体迁移解决方法采用数据库附加方法
  9. mysql 随机槽_mysql怎样高效率随机获取n条数据
  10. jquery的img的动态title换行
  11. (一) js + Vue 写扫雷
  12. 【BZOJ1500】[NOI2005]维修数列
  13. 何如添加到将文章添加到首页
  14. 手机上最好用的五笔输入法_手机输入法之争:九宫格和全键盘到底哪个更好用...
  15. 西门子定时器有几种_【图】西门子step7功能块中定时器的类型与参数
  16. 湖南大学基于SMTP和POP3的邮件系统课程设计
  17. word中图片为嵌入式格式时显示不全_word嵌入图片显示不全,教您word插入图片显示不全怎么办...
  18. Freetype的基本应用
  19. Excel超实用办公技巧,迅速提高办公效率
  20. 解读VL162最新Switshi切换芯片是VIA最新推出的Switsh芯片USB 3.1 Type-C接口数据切换开关专用芯片

热门文章

  1. (转)深入分析 Java I/O 的工作机制
  2. Enterprise Vault 2007 软硬件兼容性
  3. 未能初始化appscan应用程序现在将关闭_教你如何将电脑瞬间关掉
  4. android黑屏日志_Android启动页黑屏的解决方案
  5. 可视化折线圆形统计图_统计图表的优雅变换:Altair|可视化系列06
  6. PostgreSQL版本通过pg_upgrade升级(9.6.21升级到13.2)
  7. plt绘制1 / (1 + np.exp(-x))
  8. pythonif有多个条件怎么办,Python if有多个条件怎么办
  9. 大文件分片上传前端框架_无插件实现大文件分片上传,断点续传
  10. hana 查看表字段_hana 查看表数据库