问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

libvirt-java怎么获得虚拟机内存使用率

发布网友 发布时间:2022-05-15 05:22

我来回答

1个回答

热心网友 时间:2023-10-09 23:13

最近在用Nagios监控Xen PV虚拟机的时候出现了问题,在被监控的服务器上是采用nrpe来采集数据的。但是在进程里无法看到PV虚拟机的进程,虽然可以通过xm top vpsname的方式来获取名为vpsname虚拟机的cpu使用率情况,但是不便于采集数据,通过xm list可以采集到cpu时间,根据CPU时间的差值,可以计算CPU使用率,可是该命令只能root执行,因为该命令可以进行关闭,重启虚拟机等重要操作,所以如果把权限给了nrpe,将可能造成严重的安全问题。
幸好livirt提供了API,所以我打算尝试用API写一个Nagios的插件来满足的我的需求,我的想法就是分别2次获得虚拟机的CPU时间,并分别记录2次取得数据时的系统时间,然后根据差值来计算,在理论上是存在一些误差的。
1.要使用API,首先需要安装libvirt-devel
[root@aikaiyuan ~]# yum -y install libvirt-devel

2.我的代码如下,文件名为vCpu.c
/**
* Program Name: vCpu.c
* Author: steptodream
* Description:A simple plugin to get vps cpu usage
* for nagios(nrpe) by libvirt api
* Compile:gcc -o vCpu vCpu.c -lvirt
*/
#include <stdlib.h>
#include <stdio.h>
#include <libvirt/libvirt.h>
/* define the exit status for nagios */
#define OK 0
#define WARNING 1
#define CRITICAL 2
#define UNKNOWN 3
/* get cpu time of the given name */
double getCpuTime(char *vpsName,virConnectPtr conn) {
virDomainInfo info;
virDomainPtr domain = NULL;
int ret;
/* Find the domain of the given name */
domain = virDomainLookupByName(conn, vpsName);
if (domain == NULL) {
printf("Failed to find the vps called %sn", vpsName);
exit(OK);
}
/* Get the information of the domain */
ret = virDomainGetInfo(domain, &info);
virDomainFree(domain);
if (ret < 0) {
printf("Failed to get information for %sn", vpsName);
exit(OK);
}
return info.cpuTime;
}
int main(int argc,char * argv[])
{
char *vpsName; /* vps name */
int interval = 1; /* check interval */
double warning; /* warning value */
double critical; /* critical value */
double cpuUsage; /* cpu usage of the vps */
struct timeval startTime; /* time of the first time to get cpu time */
struct timeval endTime; /* time of the second time to get cpu time */
int realTime; /* real interval between two times */
long long startCpuTime; /* cpu time of the first time */
long long endCpuTime; /* cpu time of the second time */
int cpuTime; /* value of startCpuTime - endCpuTime */
char *output; /* output data for nagios */
int ret; /* exit status for nagios */
virConnectPtr conn; /* connection pointer */
switch (argc){
case 5:
interval = atoi(argv[4]);
case 4:
vpsName = argv[1];
warning = atof(argv[2]);
critical = atof(argv[3]);
break;
default:
printf("Usage:vCpu <vName> <warning> <critical> [interval]nn");
return OK;
}
/* connect to local Xen Host */
conn = virConnectOpenReadOnly(NULL);
if (conn == NULL) {
printf("Failed to connect to local Xen Hostn");
return OK;
}
/* get cpu time the first time */
startCpuTime = getCpuTime(vpsName, conn);
/* get start time */
if (gettimeofday(&startTime, NULL) == -1) {
printf("Failed to get start timen");
return OK;
}
/* wait for some seconds */
sleep(interval);
/* get cpu time the second time */
endCpuTime = getCpuTime(vpsName, conn);
/* get end time */
if (gettimeofday(&endTime, NULL) == -1) {
printf("Failed to get end timen");
return OK;
}
/* colose connection */
virConnectClose(conn);
/* calculate the usage of cpu */
cpuTime = (startCpuTime - endCpuTime) / 1000;
realTime = 1000000 * (startTime.tv_sec - endTime.tv_sec) +
(startTime.tv_usec - endTime.tv_usec);
cpuUsage = cpuTime / (double)(realTime);
/* display cpuUsage by percentage */
cpuUsage *= 100;

/* make output data and exit status for nagios*/
if (cpuUsage > critical) {
output = "CRITICAL";
ret = CRITICAL;
} else if (cpuUsage > warning){
output = "WARNING";
ret = WARNING;
} else {
output = "OK";
ret = OK;
}
printf("%s CPU:%.2f%|CPU=%.2f",output,cpuUsage,cpuUsage);
return ret;
}

3.编译测试,根据我的需求,我设置了3个必须参数和1个可选参数,分别是虚拟机名称vpsName,警告值warning(百分比值),危急值critical(百分比值)和检查间隔interval(秒)
[root@aikaiyuan ~]# gcc -o vCpu vCpu.c -lvirt
[root@aikaiyuan ~]# ./vCpu vmtest 1 2
OK CPU:0.20%|CPU=0.20

当然了,你同时可以再打开一个终端,用xm top vmtest来获取vmtest的cpu使用率,然后对比一下取值是否接近一致。我们再来看看返回值是否正常,因为Nagios是靠这个来判断服务状态的。
[root@aikaiyuan ~]# echo $?
0

注意,我的具体要求是检测指定名称的虚拟机的CPU使用率,如果超过了规定的warning或者critical值,就给使用者发邮件,所以在没有得到数据或者程序出错的情况,我都是以正常状态退出程序的。
另外,本人开发经验薄弱,所以代码里难免存在错误和不合理的地方以及不完善的地方(比如参数的合法性检验),仅供参考。
最后,关于代码中时间,我是以微秒(us)为统一单位来计算的,得到的cpu的时间是纳秒(ns),这个在结构体virDomainInfo定义中可以看到:
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
}

而通过gettimeofday取得存取到timeval结构体里的时间,包含tv_sec(s秒)和tv_usec(us微秒)这2种单位,可以从timeval结构体的定义中看到:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...多少公斤的东西。托运多少?托运能拿剪刀,洗发水这些吗? 打鼾是由于空气通过口咽部使哪个部分振动引起的 ...身高153厘米,体重57.5公斤,要减多少斤才正常,还有怎样下定决心减肥... 男人经常睡一个女人就是爱她吗? 一个男人和一个女人没认识几天就提出性要求,这男人爱女人吗?还是只是性... 小米随身wifi连上电脑后能拿着到处走不? ...买门票共用去142.5元,已知1张成人票与2张�� ...已知|张成人票与2张儿童票相等。1张成人票多少元 ...买门票共用去142.5元,已知1张成人票与2张儿童票的票价相等。1... 工业燃气烤箱价格多少钱一台 java怎样获取cpu主频和使用率 java如何通过进程号获取该进程占用的CPU使用率 鱼汤里可以放黄精吗? 奥特九兄弟用英语怎么说 黄精可以添加到普通食品吗 含黄精的食物有哪些 求奥特曼攻击力排名 新三板原始股怎么买 总价包干合同的金额不能超过多少? 新浪微博怎么收藏图片才不会因为对方删除微博后连我收藏的照片也没了 总价包干合同中图纸与清单不符如何结算? 总价包干合同,只给清单量按清单的报价签合同后给的图纸,按图纸施工实际工程量比清单多很多最终如何结算_百度问一问 总价包干合同有分摊费用 建筑工程总价包干合同中总价包干是什么意思 总价包干合同该如何结算 总价包干合同的变更怎么结算? 总价包干和单价包干有什么区别 考研报名不确定档案所在地怎么办?急! 我是10年往届生,在大连理工读大学,家也在大连,毕业后一直在家,现在想知道我的档案在哪,怎么查? 怎么在Excel中计算可调整利率抵押贷款的PMT? 我订购了一个超级会员黄金版业务,如果之前已有腾讯视频VIP或QQ音乐豪华绿钻自动续费,会影响腾讯视 左右对称四驱和前后四驱,都有什么区别? fps不稳定一会160一会20左右驱动没问题怎么回事 斯巴鲁xv左右对称全时四驱驱动的优点是什么? 鼠标驱动左右两个都设置上了鼠标失灵怎么办 用电阻限流的方式驱动1瓦LED可以吗?我不需要满功率,只要100mA左右驱动即可。 全时四轮驱动的左右对称 jsp中怎么设置让一个表格在整个网页中居中 jsp中在一个表格中插入了一个表单,可是不知道怎么将整体内容居中!急!!! 怎么样才能把JSP页面居中 jsp 怎么对表格里单列数据居中 jsp怎么改变表单的位置,如何显示到网页最中间 jsp中 怎样把div居中 本来花呗有800刚去还了现在额度里面只有70怎么回事? 为什么我的花呗只有70的额度? 2010鲁能的第一场亚冠哪个电视台直播?(就是明天的比赛)山东体育播不? 我要当大哥剧本杀怎么赢 快手播放地址失效是什么意思 三谢世涂剧本杀为什么闻人_的哥哥成为了杀人犯 什么是熔点?