xen监测client os的cpu及内存使用情况

 

转自: http://wz.csdn.net/item/2416458/
基于libvirt API监测xen初探 收藏

计算机体系结构课程布置了大作业,通过使用Xen的API或封装了其API的函数库,如libvirt进行编程,实现以下功能:

  1. 以命令行形式显示宿主机(Host OS)上正在运行的客户机(Guest OS)名称;
  2. 通过命令行形式显示指定客户机(Guest OS)的工作状态(显示其 CPU 利用率,和内存使用情况即可);

这个作业工程类似于Fedora等Linux系统中内置的xm管理程序,在这里仅简单的实现xm top的功能。我选用了Fedora Core 8作为Host OS。在其上,通过Xen安装另一Fedora Core 8作为Guest OS。利用libvirt提供的API实现显示Guest OS名称、显示其 CPU 利用率,和内存使用情况的功能。并与xm、virt-manager的运行结果做对比,验证正确性。

安装所需的软件包:

  • xen-3.1.2-2.fc8
  • libvirt-o.4.2-1.fc8
  • libvirt-devl-0.4.2-1.fc8

其中,xen为虚拟机,libvirt为运行库,libvirt-devl为代码运行库,供开发编译使用。具体版本视安装源与系统其他组件的依赖关系。

在我使用Xen安装Guest OS的过程中出现的一点小问题:在Fedora Core 8中发现默认提供的SELinux服务会对xen产生影响,估计可能是阻碍了某些信号量的传递,通过修改/etc/sysconfig/selinux,设置其中SELINUX=disabled将SElinux禁用。

通过virt-manager或virt-install安装Guest OS。设置为256m内存,4G硬盘空间,半虚拟化方式。

有关libvirt API的使用:

 

virConnectPtr virConnectOpenReadOnly (const char * name)
在使用时首先应调用这个函数,获得hypervisor的链接
nameURI of hypervisor,为NULL则代表本地链接
Returns返回hypervisor的指针

 

 

int virConnectListDomains (virConnectPtr conn, int * ids, int maxids) 
获得hypervisor下所有域的ID 
connhypervisor链接指针
ids存储每个域ID的数组
maxids域数量的上限
Returns域的数量

 

 

virDomainPtr virDomainLookupByID (virConnectPtr conn, int id)
由域的ID返回域的指针 
connhypervisor链接指针
id域的ID
Returns返回域的指针

 

 

int virDomainGetInfo (virDomainPtr domain, virDomainInfoPtr info)
获得域的信息
domain域的指针
info指向存储域的信息的数据结构的指针
Returns成功获取返回0,否则返回-1

 

 

const char * virDomainGetName (virDomainPtr domain)
得到域的名字
domain域的指针
Returns域的名字

 

 

int virConnectClose (virConnectPtr conn)
释放hyperbisor的连接,如果程序出线异常或错误应调用本函数终止连接
connhypervisor的指针
Returns成功释放返回0,否则返回-1

 

 

int virDomainFree (virDomainPtr domain)
释放域的指针,如果连接到域就要先调用这个函数释放域的链接,之后再释放hyperbisor的连接
domain域的指针
Returns成功释放返回0,否则返回-1

 

一个主要的数据结构:

 

struct virDomainInfo
unsigned charstate当前域的运行状态
unsigned longmaxMem支持的最大内存
unsigned longmemory使用的内存
unsigned shortnrVirtCpu虚拟CPU数量
unsigned long longcpuTime虚拟CPU运行时间

 

我的设计思路是,利用virConnectOpenReadOnly()获取链接,通过virConnectListDomains()得到当前活跃的域的ID。对于每一个ID利用virDomainLookupByID()得到指向其域的指针。调用virDomainGetInfo()获得当前域的内存、CPU运行时间等信息。当前域的名称由virDomainGetName()获得。

CPU占用率的计算方法为:在myxm中两次调用virDomainGetInfo()获取时间段开始前和结束后的虚拟CPU运行时间,二者差值可知虚拟CPU的运行时间。间隔时间段用sleep()实现。在sleep()前后用gettimeofday()取得真实的时间差。该时间段内CPU运行时间与真实时间的比值即为这段时间内的CPU占用率。

编译时gcc增加-lvirt参数,用于包含libvirt-devl库。

  1. <PRE class=csharp name="code">/**  
  2.  * Project: myxm  
  3.  * Version: 0.2  
  4.  * Abstract: A simple xen monitor  
  5.  * Author: Gu Xiangnan  
  6.  * Date: 2008-05-25  
  7.  */ 
  8.  
  9. #include <STDLIB.H></STDLIB.H>  
  10. #include <STDIO.H></STDIO.H>  
  11. #include <LIBVIRT libvirt.h=""></LIBVIRT>  
  12.  
  13. #define MAXID 50   
  14.   
  15. /* the data structure of time */  

 

  • typedef struct timeInfo   
  • {   
  •     long long cpu_time;   
  •     struct timeval real_time;   
  • } timeInfoNode;   
  •   
  • /* the hypervisor connection */  
  • static virConnectPtr conn = NULL;   
  •   
  • /* release the connect of hypervisor */  
  • void closeConn()   
  • {   
  •     if (conn != NULL)   
  •         virConnectClose(conn);   
  • }   
  •   
  • /* release the domain pointer */  
  • void freeDom(virDomainPtr dom)   
  • {   
  •     if (dom != NULL)   
  •         virDomainFree(dom);   
  • }   
  •   
  • /* get the start time of each domain */  
  • void getTimeInfo(int id, timeInfoNode * infos)   
  • {   
  •     virDomainPtr dom = NULL;   
  •     virDomainInfo info;   
  •     int ret;   
  •   
  •     /* Find the domain of the given id */  
  •     dom = virDomainLookupByID(conn, id);   
  •     if (dom == NULL)   
  •     {   
  •         fprintf(stderr, "Failed to find Domain %d ", id);   
  •         freeDom(dom);   
  •         closeConn();   
  •     }   
  •   
  •     /* Get the information of the domain */  
  •     ret = virDomainGetInfo(dom, &info);   
  •     if (ret < 0)   
  •     {   
  •         fprintf(stderr, "Failed to get information for Domain %d ", id);   
  •         freeDom(dom);   
  •         closeConn();   
  •     }   
  •   
  •     /* get the start of realTime*/  
  •     if (gettimeofday(&(infos->real_time), NULL) ==  - 1)   
  •     {   
  •         fprintf(stderr, "Failed to get start time ");   
  •             return;   
  •     }   
  •   
  •     /* get the start of CPUTime*/  
  •     infos->cpu_time = info.cpuTime; /* nanosecond */  
  •   
  •     freeDom(dom);   
  • }   
  •   
  • void getDomainInfo(int id, timeInfoNode infos)   
  • {   
  •     virDomainPtr dom = NULL;   
  •     virDomainInfo info;   
  •     int ret;   
  •     struct timeval realTime;   
  •     int cpu_diff, real_diff;   
  •     float usage;   
  •   
  •     /* Find the domain of the given id */  
  •     dom = virDomainLookupByID(conn, id);   
  •     if (dom == NULL)   
  •     {   
  •         fprintf(stderr, "Failed to find Domain %d ", id);   
  •         freeDom(dom);   
  •         closeConn();   
  •     }    
  •   
  •     /* Get the information of the domain */  
  •     ret = virDomainGetInfo(dom, &info);   
  •     if (ret < 0)   
  •     {   
  •         fprintf(stderr, "Failed to get information for Domain %d ", id);   
  •         freeDom(dom);   
  •         closeConn();   
  •     }   
  •   
  •     /* get the end of realTime*/  
  •     if (gettimeofday(&realTime, NULL) ==  - 1)   
  •     {   
  •         fprintf(stderr, "Failed to get start time ");   
  •         return;   
  •     }   
  •   
  •     /* calculate the usage of cpu */  
  •     cpu_diff = (info.cpuTime - infos.cpu_time) / 10000;   
  •     real_diff = 1000 *(realTime.tv_sec - infos.real_time.tv_sec) +    
  •         (realTime.tv_usec - infos.real_time.tv_usec);   
  •     usage = cpu_diff / (float)(real_diff);   
  •   
  •     /* print the results */  
  •     printf("%d %.3f% %lu %lu %hu %0X %s ", id, usage, info.memory / 1024,   
  •         info.maxMem / 1024, info.nrVirtCpu, info.state, virDomainGetName(dom));   
  •   
  •     freeDom(dom);   
  • }   
  •   
  • int main()   
  • {   
  •     int idCount;   
  •     int i;   
  •     int id;   
  •     int ids[MAXID];   
  •     timeInfoNode timeInfos[MAXID];   
  •   
  •     printf("-------------------------------------------------------- ");   
  •     printf("             XEN Domain Monitor Version 0.2 ");   
  •     printf("             Build by Gu Xiangnan 35060514 ");   
  •     printf("-------------------------------------------------------- ");   
  •   
  •     /* NULL means connect to local Xen hypervisor */  
  •     conn = virConnectOpenReadOnly(NULL);   
  •     if (conn == NULL)   
  •     {   
  •         fprintf(stderr, "Failed to connect to hypervisor ");   
  •         closeConn();   
  •         return 0;   
  •     }   
  •   
  •     /* get the count of IDs and save these ID into ids[] */  
  •     idCount = virConnectListDomains(conn, &ids[0], MAXID);   
  •     if (idCount < 0)   
  •     {   
  •         fprintf(stderr, "Failed to list the domains ");   
  •         closeConn();   
  •         return 0;   
  •     }   
  •   
  •     printf("Domain Totals: %d ", idCount);   
  •     printf("ID CPU MEM MaxMEM VCPUs State NAME ");   
  •   
  •     /* loop get the CPUtime info by IDs */  
  •     for (i = 0; i < idCount; i++)   
  •     {   
  •         id = ids[i];   
  •         getTimeInfo(id, &(timeInfos[i]));   
  •     }   
  •   
  •     sleep(1);   
  •   
  •     /* loop print the domain info and calculate the usage of cpus*/  
  •     for (i = 0; i < idCount; i++)   
  •     {   
  •         id = ids[i];   
  •         getDomainInfo(id, timeInfos[i]);   
  •     }   
  •   
  •     printf("-------------------------------------------------------- ");   
  •     closeConn();   
  •     return 0;   
  • }   
  • </PRE>  

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值