基于libvirt API监测xen初探
来源:互联网 发布:k30平板荷载试验算法 编辑:程序博客网 时间:2024/05/22 00:06
计算机体系结构课程布置了大作业,通过使用Xen的API或封装了其API的函数库,如libvirt进行编程,实现以下功能:
- 以命令行形式显示宿主机(Host OS)上正在运行的客户机(Guest OS)名称;
- 通过命令行形式显示指定客户机(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域的IDReturns返回域的指针int virDomainGetInfo (virDomainPtr domain, virDomainInfoPtr info)获得域的信息domain域的指针info指向存储域的信息的数据结构的指针Returns成功获取返回0,否则返回-1const char * virDomainGetName (virDomainPtr domain)得到域的名字domain域的指针Returns域的名字int virConnectClose (virConnectPtr conn)释放hyperbisor的连接,如果程序出线异常或错误应调用本函数终止连接connhypervisor的指针Returns成功释放返回0,否则返回-1int virDomainFree (virDomainPtr domain)释放域的指针,如果连接到域就要先调用这个函数释放域的链接,之后再释放hyperbisor的连接domain域的指针Returns成功释放返回0,否则返回-1一个主要的数据结构:
struct virDomainInfounsigned 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库。
- <pre class="csharp" name="code">/**
- * Project: myxm
- * Version: 0.2
- * Abstract: A simple xen monitor
- * Author: Gu Xiangnan
- * Date: 2008-05-25
- */
- #include <stdlib.h></stdlib.h>
- #include <stdio.h></stdio.h>
- #include <libvirt libvirt.h=""></libvirt>
- #define MAXID 50
- /* 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/n", 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/n", id);
- freeDom(dom);
- closeConn();
- }
- /* get the start of realTime*/
- if (gettimeofday(&(infos->real_time), NULL) == - 1)
- {
- fprintf(stderr, "Failed to get start time/n");
- 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/n", 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/n", id);
- freeDom(dom);
- closeConn();
- }
- /* get the end of realTime*/
- if (gettimeofday(&realTime, NULL) == - 1)
- {
- fprintf(stderr, "Failed to get start time/n");
- 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/t%.3f%/t%lu/t%lu/t%hu/t%0X/t%s/n", 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("--------------------------------------------------------/n");
- printf(" XEN Domain Monitor Version 0.2/n");
- printf(" Build by Gu Xiangnan 35060514/n");
- printf("--------------------------------------------------------/n");
- /* NULL means connect to local Xen hypervisor */
- conn = virConnectOpenReadOnly(NULL);
- if (conn == NULL)
- {
- fprintf(stderr, "Failed to connect to hypervisor/n");
- 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/n");
- closeConn();
- return 0;
- }
- printf("Domain Totals: %d/n", idCount);
- printf("ID/tCPU/tMEM/tMaxMEM/tVCPUs/tState/tNAME/n");
- /* 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("--------------------------------------------------------/n");
- closeConn();
- return 0;
- }
- </pre>
运行结果:
可以对比一下vmm与xm top,验证实现的正确性:
- 基于libvirt API监测xen初探
- 基于libvirt API监测xen初探
- 基于libvirt API监测xen初探 (转)
- 基于libvirt API监测xen初探
- 基于libvirt API监测xen初探
- 基于libvirt的XEN初探
- libvirt配置xen网络 API
- libvirt API初探
- XEN<->libvirt札记
- Use libvirt with Xen/xVM
- linux xen libvirt- Virsh 命令
- xen toolstack - xen api
- xen toolstack - xen api
- 基于HTTPS的REST API设计初探
- libvirt API学习
- libvirt API学习笔记
- libvirt API 简介
- libvirt API简介
- ios中的图标
- 图形验证码生成工具类
- js正则表达式大全
- tc-551-div2
- 文件的操作
- 基于libvirt API监测xen初探
- UTF-8 和 GBK 的 NSString 相互转化的方法
- 飞机座位(数组练习)
- 关于gdb debug android
- C++指针
- Tomcat Introduction
- Xen api 的层次结构
- 水题 Border
- 抽象外观类的单例化分析与改造