专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 测试电脑性能的软件:基于 CIMPLE 接口的 CIM Provider 的实现及其性能测试 »正文

测试电脑性能的软件:基于 CIMPLE 接口的 CIM Provider 的实现及其性能测试

来源: 发布时间:星期六, 2009年12月19日 浏览:0次 评论:0
  1 概述

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

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

  2.1 CIM 及其相关标准

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

  基于CIM 标准管理应用如下图1所示


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


  查看原图(大图)

  通过CIM框架开发针对区别设备和系统管理软件Software主要都是遵循上图所示模块划分 管理应用(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实现主要有OpenPegasusOpenWBEMWMI以及WBEM Service等开源项目 区别CIMOM都拥有自己Provider接口标准比如OpenPegasusC接口或者WBEM ServiceJava接口 因此针对区别CIMOM都有相对区别Provider开发思路方法方面Provider内部繁琐实现接口和逻辑过程 导致Provider学习和开发过程漫长而艰难方面采用这些相对独立方式开发Provider 必然会导致问题是移植性和通用性降低如长期开发C Provider工程师要把项目转移到Java中 就不可避免面对段艰苦过程

  针对以上问题为了降低区别Provider开发接口差异性目前已经有些统接口标准出台 使用C语言CMPI接口和基于CCIMPLE接口就是其中主要两项接口标准

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

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

  开发针对各种区别CIMOM通用Provider

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

  CIMPLE 相比和传统CIM Provider开发方式有 4个最主要优势:

  通过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环境 在CIM Provider标准中共定义了 6种CIM Provider 分别为Instance Provider, Method Provider, Association Provider, Indication Provider, Query Provider和Consumer Provider在CIM Provider实现中种Provider应属于以上 6种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 文件称为MOF(Managed Object Format).有关CIM Class 标准和其描述文件MOF 请参见附件

  在本例中我们定义个名为Sample_MyProviderClassCIM ClassSample_MyProviderClass 具有个名为Identier无符号整形可读键值属性和个名为Message具有可读可写普通属性 它还具有两个思路方法个名位SayHello个类型为输入参数name输出参数place 返回类型为String个思路方法个名为TestPerformance个无符号整形输入参数number 无符号整形输入参数milliseconds返回类型为String

  Sample_MyProviderClassMOF定义如清单1所示:


清单1 Sample_MyProviderClassmof定义
#The definition of Sample_MyProviderClass 
[Version ("2.2.1")] 
 Sample_MyProviderClass 
{ 
  [key, read] 
  U32 Identier; 
 
  [read, write] 
   Message; 
   
   SayHello( 
  [IN]  name, 
  [OUT]  place); 
 
   TestPerformance( 
  [IN] U32 number, 
  [OUT] U32 milliseconds); 
}; 


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

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

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

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

  gen: 生成包含CIM Class信息C代码

  genprov: 生成CIM Class相对应CIM ProviderC框架代码

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

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

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

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


图4 使用genproj工具生成代码


  查看原图(大图)

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

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


清单2 Sample_MyProviderClass_Provider.cpp代码片段
# <sys/time.h> 
 
CIMPLE_NAMESPACE_BEGIN 
 
Sample_MyProviderClass_Provider::Sample_MyProviderClass_Provider 
{ 
} 
 
Sample_MyProviderClass_Provider::~Sample_MyProviderClass_Provider 
{ 
} 
 
Load_Status Sample_MyProviderClass_Provider::load 
{ 
   LOAD_OK; 
} 
 
Unload_Status Sample_MyProviderClass_Provider::unload 
{ 
   UNLOAD_OK; 
} 
 
Get_Instance_Status Sample_MyProviderClass_Provider::get_instance( 
const Sample_MyProviderClass* model, 
Sample_MyProviderClass*& instance) 
{ 
   GET_INSTANCE_UNSUPPORTED; 
} 
 
Enum_Instances_Status Sample_MyProviderClass_Provider::enum_instances( 
const Sample_MyProviderClass* model, 
Enum_Instances_Handler<Sample_MyProviderClass>* handler) 
{ 
   ENUM_INSTANCES_OK; 
} 
 
Create_Instance_Status Sample_MyProviderClass_Provider::create_instance( 
Sample_MyProviderClass* instance) 
{ 
   CREATE_INSTANCE_UNSUPPORTED; 
} 
 
Delete_Instance_Status Sample_MyProviderClass_Provider::delete_instance( 
const Sample_MyProviderClass* instance) 
{ 
   DELETE_INSTANCE_UNSUPPORTED; 
} 
 
Mody_Instance_Status Sample_MyProviderClass_Provider::mody_instance( 
const Sample_MyProviderClass* model, 
const Sample_MyProviderClass* instance) 
{ 
   MODIFY_INSTANCE_UNSUPPORTED; 
} 
 
Invoke_Method_Status Sample_MyProviderClass_Provider::SayHello( 
const Sample_MyProviderClass* self, 
const Property<String>& name, 
Property<String>& place, 
Property<String>& _value) 
{ 
   INVOKE_METHOD_UNSUPPORTED; 
} 
 
Invoke_Method_Status Sample_MyProviderClass_Provider::TestPerformance( 
const Sample_MyProviderClass* self, 
const Property<u32>& number, 
Property<u32>& milliseconds, 
Property<String>& _value) 
{ 
   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, mody_instance

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

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

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

  将在第步中生成例子全部析构

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

  具体代码实现如下所示:


清单3 TestPerformance思路方法实现代码片段
Invoke_Method_Status Sample_MyProviderClass_Provider::TestPerformance( 
const Sample_MyProviderClass* self, 
const Property<u32>& number, 
Property<u32>& milliseconds, 
Property<String>& _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  i=0; i<number.value; i) { 
    //Instanciate CIM Class 
    Sample_MyProviderClass* inst = Sample_MyProviderClass::create(true); 
    //Set Identier property 
    inst->Identier.(i); 
    char message[100]; 
    sprf(message, "message_%d", i); 
    //Set Message property 
    inst->Message.(message); 
    Sample_MyProviderClasses.append(inst); 
  } 
   
  //Destroy the instances 
  for (unsigned  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  the TAT 
  milliseconds.(millisecondUsed); 
   
   INVOKE_METHOD_OK; 
} 




  3.4 编译工程

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

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


表1 编译CIMPLE工程相关选项
适配器目标工程 宏定义 链接库文件
CMPI CIMPLE_CMPI_MODULE (lib)CIMPLEcmpiadap(.so/lib)
OpenPegasus CIMPLE_PEGASUS_MODULE (lib)CIMPLEpegadap(.so/lib)
OpenWbem CIMPLE_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_erop参数指明其注册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

  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接口内存消耗量分别为 CMPI24.78%和Pegasus19.10%而在用户最为关心运行时间上看CIMPLE接口更是占用绝对优势 仅为CMPI8.38%和Pegasus22.83%最大性能差距竟为个数量级的多

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

  5 整理总结

  在文章末尾我们通过个表格对比CIMPLEPegasus和CMPI 3大接口特点来整理总结基于CIMPLECIM Provider特点 同时也整理总结全文


表2 3大接口Pegasus,CMPI和CIMPLE特点对比
  Pegasus Interface CMPI Interface CIMPLE Interface
支持CIMOM OpenPegasus OpenPegasus 目前支持Open Pegasus, Open Wbem, WMI, sfcb等 所有CMPI支持平台
支持语言 C, java C c
代码量 中等 最大 最少框架部分由工具自动生成
性能 资源消耗量大处理时间长 资源消耗量较大处理时间长 很小资源消耗和处理时间



  本文举例源代码或素材下载

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: