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

简介: 使用libvirt技术监控虚拟机资源利用情况(一)计算资源与内存资源的监控libvirt中提供virDomainGetInfo方法可以将一个domain的计算资源和内存资源的使用情况封装在一个结构体中,如下:struct virDomainInfo{  unsigned char st...

使用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.   
    3. interfacestats = malloc(sizeof(virDomainInterfaceStatsStruct)* 10);  
    4. m = virDomainInterfaceStats(allDomains[numOfDom], i_path, interfacestats, 10);  
    5.  printf("rx字节数:%ld    ",(*interfacestats).rx_bytes);  
    6.  printf("tx字节数:%ld    ",(*interfacestats).tx_bytes);  
    7.  printf("rx丢包:%ld    ",(*interfacestats).rx_drop);  
    8.  printf("tx丢包:%ld\n",(*interfacestats).tx_drop);
目录
相关文章
|
监控 数据可视化 Java
visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优
本文档主要总结在window本地环境远程对linux服务断的JVM虚拟机进行监控与调优的方法。
184 0
|
6月前
|
监控 Oracle Java
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
105 0
|
5月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
100 1
|
11天前
|
存储 持续交付 虚拟化
|
3月前
|
安全
【Azure 云服务】Azure Cloud Service 关于虚拟机资源,杀毒软件配置,补丁机制的问答
【Azure 云服务】Azure Cloud Service 关于虚拟机资源,杀毒软件配置,补丁机制的问答
|
2月前
|
KVM 虚拟化
使用libvirt的端口转发,实现虚拟机跟外界互通
使用libvirt的端口转发,实现虚拟机跟外界互通
|
6月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
63 0
|
6月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
152 0
|
3月前
|
存储 API 开发工具
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
|
3月前
|
存储 缓存 监控
在Linux中,如何优化虚拟机和容器的性能和资源使用?
在Linux中,如何优化虚拟机和容器的性能和资源使用?
下一篇
无影云桌面