您的位置:首页 > 其它

基于 CIMPLE 接口的 CIM Provider 的实现及其性能测试

2010-04-05 21:41 736 查看
1 概述

开源项目 CIMPLE 为开发 CIM Provider 提供了一种新的接口。 它比之于现存的几个主要开发接口如Pegasus C++ ,CMPI 等在平台支持性,代码量和运行效率方面都有着显著的优点。 为了向读者展示这些优点,本文将着重从相关标准,具体实现和性能测试三个方面对 CIMPLE 接口进行详细的介绍, 希望对 CIM Provider 的设计和开发人员有所帮助。

2 CIM Provider 相关标准及其开发现状

2.1 CIM 及其相关标准

CIM(Common Information Module)通用信息模型,是由分布式管理项目组 Distributed Management Task Force (DMTF)制定的标准,该标准提供了一个通用的模型框架, 用来描述网络和计算机世界的主要组成部分,包括:网络、服务、计算机系统、应用程序、数据库、用户、设备、策略等。 其最大的特点就是采用统一的模型和协议去管理设备和事件,使得各个公司能够遵循相同的标准模型来生产通用性更强的系统管理软件。 关于CIM标准的详细资料请参见参考资源。基于CIM 标准的管理应用程序如下图1所示。

图1 基于CIM 标准的管理应用程序框架示意图



通过CIM的框架开发的针对不同设备和系统的管理软件,主要都是遵循上图所示模块划分, 管理应用程序(web service/GUI)通过CIM/Http连接到要管理的设备上的CIMOM(CIM Object Manager), CIMOM再通过具体的称为CIM Provider的模块来和设备资源交互。CIM Provider是动态加载的CIMOM的扩展插件, 不同的设备需要不同的CIM Provider模块,因此也可以把CIM Provider看成是设备驱动程序, 在CIM Provider中要做事情简单来说就是把资源对象化,通过CIMOM和上层管理程序交互。

2.2 CIM Provider开发现状及主要接口介绍

目前,主要的CIMOM实现主要有OpenPegasus,OpenWBEM,WMI以及WBEM Service等开源项目, 不同的CIMOM都拥有自己的Provider接口标准,比如OpenPegasus的C++接口,或者WBEM Service的Java接口, 因此针对不同的CIMOM都有相对不同的Provider开发方法。一方面Provider内部繁琐的实现接口和逻辑过程, 导致Provider的学习和开发过程漫长而艰难。另一方面采用这些相对独立的方式开发Provider 必然会导致的问题是移植性和通用性的降低,如长期开发C++ Provider的工程师要把项目转移到Java中, 就不可避免的面对一段艰苦的过程。

针对以上问题,为了降低不同Provider开发接口的差异性,目前已经有一些统一的接口标准出台。 使用C语言的CMPI接口(见参考资源)和基于C++的CIMPLE接口就是其中主要的两项接口标准。

2.3 CIMPLE 接口的主要特点及与其他CIM Provider接口的关系

CIMPLE 是一个开发CIM Provider的引擎,它提供了一个完整的开发Provider的环境和对外的调用接口。 CIMPLE被用来:

开发针对各种不同CIMOM的通用Provider程序;

提供了一个用来实现基于CIM标准程序(WBEM,SMASH,WSDM,etc)的基础。

CIMPLE 相比与传统的CIM Provider开发方式有四个最主要的优势:

通过CIMPLE工具自动生成框架代码,显著降低开发周期;

广泛的通用性,同样的Provider代码可以被用于多种CIMOM;

CIMPLE程序代码简洁高效;

模块加载与管理工具简化了的模块的管理流程。

CIMPLE框架示意图如图2所示,

图2 CIMPLE框架示意图



其中CIMPLE Provider可以兼容CMPI Adapter, Pegasus Adapter, OpenWBEM Adapter, CIMPLE将封装各种Provider开发适配器,得到一个统一的开发接口。因此CIMPLE Provider使用两个库, 一个是主要的CIMPLE库,另一个是适配器库,如图3所示:

图3 CIMPLE库示意图



通常,CIMPLE Provider的开发过程包括如下一些步骤:定义类,生成类,生成Provider, 生成模块,丰富代码框架,编译链接,注册Provider。具体实例将在下一章节给出。








回页首
3 基于CIMPLE接口的CIM Provider的实现样例

目前CIMPLE的最新版本为CIMPLE 1.0.0,其同时支持windows和linux环境。 对于CIMPLE详细的安装步骤,请参阅参考资源。在CIM Provider标准中一共定义了六种CIM Provider, 分别为Instance Provider, Method Provider, Association Provider, Indication Provider, Query Provider和Consumer Provider。具体的相关标准请参见参考资源。在CIM Provider的实现中, 每一种Provider应属于以上六种Provider 中的一种或多种。在本例中,将主要就Instance和 Method Provider的基于CIMPLE Provider的具体实现进行介绍。开发环境为Linux Fedora 7, CIM Server平台为OpenPegasus 2.6.0。

3.1 设计相关的CIM Class

对于CIM Provider,其操作的对象都必须是在CIMOM (CIM Object Manager) 中预先定义好的 CIM Class, 而用来描述CIM class的文件称为MOF(Managed Object Format).关于CIM Class 标准和其描述文件MOF 请参见附件。

在本例中,我们定义一个名为Sample_MyProviderClass的CIM Class。Sample_MyProviderClass 具有一个名为Identifier的无符号整形的可读的键值属性和一个名为Message的字符串,具有可读可写的普通属性。 它还具有两个方法。一个名位SayHello,有一个类型为字符串的输入参数name,一个字符串的输出参数place, 返回类型为String。另一个方法一个名为TestPerformance,有一个无符号整形输入参数number, 无符号整形输入参数milliseconds,返回类型为String。

Sample_MyProviderClass的MOF定义如清单1所示:

清单1 Sample_MyProviderClass的mof定义

#The definition of Sample_MyProviderClass
[Version ("2.2.1")]
class Sample_MyProviderClass
{
[key, read]
Uint32 Identifier;

[read, write]
string Message;

string SayHello(
[IN]  string name,
[OUT] string place);

string TestPerformance(
[IN]  Uint32 number,
[OUT] Uint32 milliseconds);
};

其完整定义将存储于repository.mof文件中。

3.2 使用CIMPLE工具生成代码框架

CIMPLE的一大优点在于提供了一组工具,通过定义CIM Class的MOF文件方便而快速地生成一系列的 CIM Provider框架代码,从而将开发人员从复杂的接口规范解脱出来,使其能专注于具体逻辑层面的开发。

CIMPLE主要提供以下三种工具来生成框架代码:

genclass: 生成包含CIM Class信息的C++代码。

genprov: 生成CIM Class相对应的CIM Provider的C++框架代码

genmod: 生成包含模块注册信息的module.cpp文件。

genproj: 同时包含genclass, genprov和genmod的工程,生成包含包含CIM Class, CIM Provider和module注册信息的完整的工程文件。

在本例中为方便起见,我们使用genproj工具快速生成Sample_MyProviderClass的CIM Provider 的所有开发文件。

首先进入包含Sample_MyProviderClass信息的repository.mof所在文件夹,并键入genproj命令(如下图):

图4 使用genproj工具生成代码



CIMPLE将为开发者生成7份代码,其中具体清单可参照上图。

其中, Sample_MyProviderClass_Provider.cpp即为开发者所要专注的CIM Provider的框架代码。 在此列出其代码如下,其他代码可参阅附件。

清单2 Sample_MyProviderClass_Provider.cpp代码片段

#include <sys/time.h>

CIMPLE_NAMESPACE_BEGIN

Sample_MyProviderClass_Provider::Sample_MyProviderClass_Provider()
{
}

Sample_MyProviderClass_Provider::~Sample_MyProviderClass_Provider()
{
}

Load_Status Sample_MyProviderClass_Provider::load()
{
return LOAD_OK;
}

Unload_Status Sample_MyProviderClass_Provider::unload()
{
return UNLOAD_OK;
}

Get_Instance_Status Sample_MyProviderClass_Provider::get_instance(
const Sample_MyProviderClass* model,
Sample_MyProviderClass*& instance)
{
return GET_INSTANCE_UNSUPPORTED;
}

Enum_Instances_Status Sample_MyProviderClass_Provider::enum_instances(
const Sample_MyProviderClass* model,
Enum_Instances_Handler<Sample_MyProviderClass>* handler)
{
return ENUM_INSTANCES_OK;
}

Create_Instance_Status Sample_MyProviderClass_Provider::create_instance(
Sample_MyProviderClass* instance)
{
return CREATE_INSTANCE_UNSUPPORTED;
}

Delete_Instance_Status Sample_MyProviderClass_Provider::delete_instance(
const Sample_MyProviderClass* instance)
{
return DELETE_INSTANCE_UNSUPPORTED;
}

Modify_Instance_Status Sample_MyProviderClass_Provider::modify_instance(
const Sample_MyProviderClass* model,
const Sample_MyProviderClass* instance)
{
return MODIFY_INSTANCE_UNSUPPORTED;
}

Invoke_Method_Status Sample_MyProviderClass_Provider::SayHello(
const Sample_MyProviderClass* self,
const Property<String>& name,
Property<String>& place,
Property<String>& return_value)
{
return INVOKE_METHOD_UNSUPPORTED;
}

Invoke_Method_Status Sample_MyProviderClass_Provider::TestPerformance(
const Sample_MyProviderClass* self,
const Property<uint32>& number,
Property<uint32>& milliseconds,
Property<String>& return_value)
{
return INVOKE_METHOD_OK;
}

/*@END@*/

CIMPLE_NAMESPACE_END

3.3 填写CIM Provider的框架代码

在上面一部分中,CIMPLE为Sample_MyProviderClass生成了完整的框架代码Sample_MyProviderClass_Provider.cpp。 在该框架代码中,开发者需要实现的,除了CIM Provider的构造和析够构函数外,还有:

Load()和unload()函数。该函数完成CIMOM在加载和卸载模块时需要完成的事情。

5个Instance Provider的标准方法:get_instance, enum_instances, create_instance, delete_instance, modify_instance。

两个开发者自定义的CIM Class方法:SayHello, TestPerformance. 值得注意的是在大多数 CIM Provider实现标准中一个Method Provider应该实现的接口应该是一个叫做的InvokeMethod接口, 在该接口函数由开发者根据实际客户调用的MethodName来进行不同情况的处理。而在CIMPLE接口中, 其框架代码已自动为开发者做好了相关方法名映射。开发者只需要负责实现相关的方法即可。

在本例中我们将为Sample_MyProviderClass_Provider实现一个TestPerformance方法,用其来测试CIMPLE接口对于CIM Class的操作性能。 它也将在我们随后的CIM Provider性能测试中用到的。该测试方法的实现逻辑很简单,分以下三步,

动态产生CIM Class Sample_MyProviderClass的实例(instance),其具体个数将由传入参数number决定。

将在第一步中生成的实例全部析构。

将整个过程的系统时间以微秒为单位传回到milliseconds参数中发回客户端。

具体代码实现如下所示:

清单3 TestPerformance方法实现代码片段

Invoke_Method_Status Sample_MyProviderClass_Provider::TestPerformance(
const Sample_MyProviderClass* self,
const Property<uint32>& number,
Property<uint32>& milliseconds,
Property<String>& return_value)
{
//Define the timestamps
timeval tpstart, tpend;
//Set the start timestamp
gettimeofday(&tpstart, NULL);
//Define the Sample_MyProviderClass Array
Array< Sample_MyProviderClass *> Sample_MyProviderClasses;

//Instantiate the instances
for (unsigned int i=0; i<number.value; i++) {
//Instanciate CIM Class
Sample_MyProviderClass* inst = Sample_MyProviderClass::create(true);
//Set Identifier property
inst->Identifier.set(i);
char message[100];
sprintf(message, "message_%d", i);
//Set Message property
inst->Message.set(message);
Sample_MyProviderClasses.append(inst);
}

//Destroy the instances
for (unsigned int i=0; i<number.value; i++) {
Sample_MyProviderClass::destroy(Sample_MyProviderClasses[i]);
}

//Set the end timestamp
gettimeofday(&tpend, NULL);
//Calculate the TAT (turn around time)
long millisecondUsed = 1000 * (tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_usec
- tpstart.tv_usec) / 1000;
//Set the output value to return the TAT
milliseconds.set(millisecondUsed);

return INVOKE_METHOD_OK;
}

3.4 编译工程

完成上述CIMPLE 工程以后将最终的7个文件进行编译生成相应的动态链接库so文件(windows下为dll文件)。

在工程中通过设置相应的宏来告诉CIMPLE工程中的CIM Provider采用的是哪种适配器 (Adapter)。 以下表格叙述了使用不同适配器的工程中所需要的编译选项。

表1 编译CIMPLE工程的相关选项

适配器的目标工程宏定义链接的库文件
CMPICIMPLE_CMPI_MODULE(lib)CIMPLEcmpiadap(.so/lib)
OpenPegasusCIMPLE_PEGASUS_MODULE(lib)CIMPLEpegadap(.so/lib)
OpenWbemCIMPLE_OPENWBEM_MODULE(lib)CIMPLEowadap(.so/lib)
值得注意的是,在linux环境中编译时需要加-fPIC选项来生成动态链接库。否则在运行时可能会导致运行失败。

在本文中采用的环境是Linux下的CMPI适配器。

3.5 注册模块

在CIMPLE内置了工具genmod帮助用户简单迅速地进行模块的动态注册,避免了用户繁琐的撰写MOF注册文件的常规注册过程。 在Windows中相应的dll文件需要部署在pegasus_home目录中的bin目录下,linux中相应的so文件则部署在 pegasus_home目录中的lib目录下即可。

以下截屏显示了CIMPLE模块的注册过程:

图5 注册CIMPLE Provider



其中, -c参数使让CIMPLE在相应CIM Class还未在CIMON中注册的情况下自动注册一个。 -n root/pg_interop参数指明其注册的Space Name。

注册以后使用OpenPegasus内置命令cimprovider 进行查询已经注册的模块,如图5所示, 如果发现显示结果中存在Sample_MyProviderModule_Module这个模块,表示注册成功。








回页首
性能测试介绍

4.1 性能测试方法与环境

在第3.3节中我们对Sample_MyProviderClass_Provider类实现了一个TestPerformance方法。 在本章中我们将通过客户端对该方法的调用来完成测试。为了能对CIMPLE的性能有一个宏观的理解, 我们使用Pegasus和CMPI接口分别实现了与Sample_MyProviderClass_Provider类的TestPerformance方法 具有相同逻辑功能的Method Provider。关于Pegasus和CMPI接口的具体实现请参见附件的代码。

测试环境:

OS: Linux Kernel 2.6.18

CPU: Intel(R) Pentium(R) D CPU 2.80GHz

Memory: 2G

CIM Server Platform: Pegasus 2.6.0

性能测试具体方法如下:

启动Pegasus Server

开启系统监测工具

注册CIMPLE Interface Module,启动客户端测试TestPerformance方法,输入参数number为1000000, 成功返回后卸载CIMPLE Interface Module

注册CMPI Interface Module,启动客户端测试TestPerformance方法,输入参数number为1000000, 成功返回后卸载CIMPLE Interface Module

注册Pegasus Interface Module,启动客户端测试TestPerformance方法,输入参数number为1000000, 成功返回后卸载Pegasus Interface Module

再次重复3至5步两次,以取得平均结果

关闭系统监测工具

关闭Pegasus Server

统计TAT(Turn Around Time),Memory usage和CPU usage等性能指标

关于系统监测,我们采用的工具是NMON。读者可以从参考资源中获得关于NMON的详细介绍。

4.2 性能测试结果

按照4.1节中得测试方案,我们统计了测试期间系统实时的CPU和Free Memory的状况,统计结果如图6所示:

图6 CPU和Free Memory的性能监测图



具体的数值统计结果如下表所示:

图7 测试统计结果



其中,图7中:

Ave CPU Utility = 单个测试案例的中CPU 使用率的平均值。

Max Memory Consumed = 单个测试案例开始前memfree值 - 测试中memfree最小值。

Turn Around Time = TestPerformance方法中返回参数milliseconds的值。

从CPU 使用率上讲,CIMPLE的的平均 CPU占用率仅为18.33%,而CMPI和PEGASUS都达到了单个线程最大的50% (考虑到测试机为双CPU),CIMPLE仅为其他两种接口40%不到。而从内存占用率上看,CIMPLE接口的内存消耗量分别为 CMPI的24.78%和Pegasus的19.10%。而在用户最为关心的运行时间上看,CIMPLE接口更是占用绝对优势, 仅为CMPI的8.38%和Pegasus的22.83%,最大的性能差距竟为一个数量级之多。

不难看出,基于CIMPLE Interface的CIM Provider比之于目前常用的其他两种接口CMPI和Pegasus, 在性能上有着绝对的优势。








回页首
5 总结

在文章的末尾我们通过一个表格对比CIMPLE,Pegasus和CMPI三大接口特点,来总结基于CIMPLE的CIM Provider的特点, 同时也总结全文。

表2 三大接口Pegasus,CMPI和CIMPLE的特点对比

Pegasus InterfaceCMPI InterfaceCIMPLE Interface
支持的CIMOM OpenPegasusOpenPegasus目前支持Open Pegasus, Open Wbem, WMI, sfcb等所有CMPI支持的平台
支持语言C++, javaCc++
代码量中等最大最少,框架部分由工具自动生成
性能资源消耗量大,处理时间长资源消耗量较大,处理时间长很小的资源消耗和处理时间







回页首
下载

描述名字大小下载方法
本文用到的Provider程序示例code.zip11KBHTTP


关于下载方法的信息
参考资料

DMTF组织的CIM标准:提供详细的CIM 标准白皮书。

OpenPegasus:提供关于OpenPegasus项目的所有信息,包括代码包和使用手册。

CMPI相关资料库:提供关于CMPI接口的介绍和实现标准。

CIMPLE:提供CIMPLE的代码包,使用手册的详细信息。

Using CIMPLE:完整的CIMPLE接口编程手册。

Pegasus Tech Workshop :提供学习Pegasus下的CIM Provider开发的各种资料学习。

NMON :一款用于分析Linux和AIX性能的免费软件。Developerworks上提供了关于NMON的详细使用介绍。(developerWorks, 04 Nov 2003)。

Open Pegasus中的安全体系 :提供OpenPegasus的安全体系介绍的一篇学习资料。(developerWorks, 2006 年 12 月 31 日)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐