使用libvirt技术监控虚拟机资源利用情况
(一)计算资源与内存资源的监控
libvirt中提供virDomainGetInfo方法可以将一个domain的计算资源和内存资源的使用情况封装在一个结构体中,如下:
- struct virDomainInfo{
- unsigned char state : //the running state, one of virDomainState
- unsigned long maxMem :// the maximum memory in KBytes allowed
- unsigned long memory :// the memory in KBytes used by the domain
- unsigned short nrVirtCpu :// the number of virtual CPUs for the domain
- unsigned long long cpuTime : //the CPU time used in nanoseconds
- }
获取内存资源和计算资源监控信息并打印的方法如下:
- virDomainInfoPtr domaininfo;
- domaininfo = malloc(sizeof(virDomainInfo)* 1);
- m = virDomainGetInfo(allDomains[numOfDom] , domaininfo);
- printf("状态:%d ",(*domaininfo).state);
- printf("最大内存:%ld ",((*domaininfo).maxMem)/1024);
- printf("内存:%ld ",((*domaininfo).memory)/1024);
- printf("虚拟cpu个数:%d ",(*domaininfo).nrVirtCpu);
- 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>
具体代码如下:
- virDomainInterfaceStatsPtr interfacestats;
- interfacestats = malloc(sizeof(virDomainInterfaceStatsStruct)* 10);
- m = virDomainInterfaceStats(allDomains[numOfDom], i_path, interfacestats, 10);
- printf("rx字节数:%ld ",(*interfacestats).rx_bytes);
- printf("tx字节数:%ld ",(*interfacestats).tx_bytes);
- printf("rx丢包:%ld ",(*interfacestats).rx_drop);
- printf("tx丢包:%ld\n",(*interfacestats).tx_drop);
转载于:https://www.cnblogs.com/zhangzhang/archive/2013/02/28/2936248.html
使用libvirt技术监控虚拟机资源利用情况相关推荐
- 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...
- 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...
虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...
- 虚拟化技术:实现资源高效利用和灵活管理的利器
虚拟化技术是一种通过软件或硬件手段,将物理资源抽象化,从而创建虚拟资源的技术.这种技术可以应用于计算.存储.网络等领域,通过将物理资源划分为多个虚拟资源,使得多个应用程序或用户可以共享同一组物理资源, ...
- 【转载】阿里云ECS服务器监控资源使用情况
在阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况.内存使用率.网络流入带宽.网络流 ...
- elk6.3.1版本+metricbeat监控收集swarm的资源使用情况
Elk自从5版本之后进行了这个metricbeat监控的增加: 主要用来收集服务器的资产使用情况 接下来我们开始配置一下: 首先下载metricbeat包6.3版本的 metricbeat.modul ...
- 利用ngxtop实时监控nginx的访问情况
利用ngxtop实时监控nginx的访问情况 关于对nginx web server的实时访问的实时监控问题,我很久之前就想实现的,现在虽有nginx自带的status扩展,但那是全局的,无法细分到v ...
- 资源不足的情况怎么设置sparkrdd并行度_监控录像机资源不足或达到上限的原因及解决方法!...
在安装网络监控摄像机过程中,很多人遇到硬盘录像机画面上提升"资源不足"或性能"达到上限"的问题,新手遇到这样的问题会选择重启录像机,但是几次反复发现并不能解决. ...
- [原创]如何在Windows XP 中利用监视计算机中的资源使用情况
[原创]如何在Windows XP 中利用监视计算机中的资源使用情况 1. 开始菜单->控制面板->管理工具->性能 2. 右键单击添加计数器 3. 选择要监视计算机,我在这里选择了 ...
- Windows下使用Jconsole远程监控Linux系统中java服务器资源占用情况
1.首先需要停止正在运行的服务:resin-XXX stop 2.然后在Linux的服务器启动项中添加如下信息: -Djava.rmi.server.hostname=192.168.1.122-Dc ...
最新文章
- git 远程仓库版本的回退以及git reset 几种常用方式记录
- 秋招 百度二轮面试---血淋淋的经历写实
- 把 分数化为循环小数 和 把循环小数化为分数 的方法
- SVN基本的理解和使用
- WPF DataGrid 通过自定义表头模拟首行固定
- 在Python中写入文件时,权限被拒绝错误
- 95-18-015-配置-AbstractBootstrapConfig
- 用友erpU8V10服务器数据库整体迁移解决方法采用数据库附加方法
- mysql 随机槽_mysql怎样高效率随机获取n条数据
- jquery的img的动态title换行
- (一) js + Vue 写扫雷
- 【BZOJ1500】[NOI2005]维修数列
- 何如添加到将文章添加到首页
- 手机上最好用的五笔输入法_手机输入法之争:九宫格和全键盘到底哪个更好用...
- 西门子定时器有几种_【图】西门子step7功能块中定时器的类型与参数
- 湖南大学基于SMTP和POP3的邮件系统课程设计
- word中图片为嵌入式格式时显示不全_word嵌入图片显示不全,教您word插入图片显示不全怎么办...
- Freetype的基本应用
- Excel超实用办公技巧,迅速提高办公效率
- 解读VL162最新Switshi切换芯片是VIA最新推出的Switsh芯片USB 3.1 Type-C接口数据切换开关专用芯片
热门文章
- (转)深入分析 Java I/O 的工作机制
- Enterprise Vault 2007 软硬件兼容性
- 未能初始化appscan应用程序现在将关闭_教你如何将电脑瞬间关掉
- android黑屏日志_Android启动页黑屏的解决方案
- 可视化折线圆形统计图_统计图表的优雅变换:Altair|可视化系列06
- PostgreSQL版本通过pg_upgrade升级(9.6.21升级到13.2)
- plt绘制1 / (1 + np.exp(-x))
- pythonif有多个条件怎么办,Python if有多个条件怎么办
- 大文件分片上传前端框架_无插件实现大文件分片上传,断点续传
- hana 查看表字段_hana 查看表数据库