`
lzy.je
  • 浏览: 151335 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

活用 LoadRunner 对应用接口 Profiling

阅读更多

          在二年前开始使用 LoadRunner 工具,那时还是 8.0 版 Mercury 的产品,一年前开始使用 HP 的 LoadRunner 9.0,很好很实用的工具。用了这么长时间也没写过与它有关的东西,主要是觉得真是没什么可写的,仅仅是一个负载生成工具,为了在性能测试中生成需要的压力而已,能够很灵活的开发基于 C 或其它语言(如 C#)程序脚本,当然了为了使用它的一些自动指标采集等功能,需要基于它的框架/结构和函数集来开发,基本程序脚本可以通过“录制”来自动生成大半,更多时候运气好的话基本直接可以做参数化了,这个过程不会太困难。

          这里想说的是使用 LoadRunner 工具来对应用系统的接口部分进行 Profiling。实际上个人觉得 LoadRunner“录制”功能本身就是个 Profiling 的过程,它记录了客户端(Bowser/Fat client app)与服务器端应用的通信过程.如在典型的B/S Web 应用结构中,它会记录如表单提交、JavaScript 异步请求等操作。根据协议的不同,Profiling 关注的方面/层面也会不一样。当然,Profiling 的角度问题平时我们不太会关注,因为使用该工具基本是为了完成模拟生成负载来做性能相关的测试,完成程序脚本的目的也在于执行测试本身。

 

          我这里有这样一个需求。有一个基于 Microsoft .NET Remoting 框架的分布式应用,前端表现层有 Smart Client 和 ASP.NET 二套应用;业务应用层为 Remoting 服务,它包括了好多 Well-known 远程对象,用以实现业务用例;后端使用 Microsoft SQL Server 数据库做持久化。没错,很标准的企业应用(还是MIS系统,呵呵)。需求在于该业务用例出现较重负载下出现功能性问题,丢失少量事务。要想解决这样一个问题,首先就需要快速取得 Remoting 中一个特定业务用例所使用的接口(Well-known 远程对象及使用的方法集),因为对该问题的描述是从用户使用角度出发的,这就需要逐步细化的分析过程,从接口开始并最终找到用例实现中的问题本质原因。我想对于一般开发人员来说,头脑中闪现的是先找设计文档再看代码,这其中还可以参考 web.config 或 app.config 中的 Remoting 服务配置来辅助分析、判断。这个方法很对,也很有条例,也符合过程、方法,但关键问题是它不够迅速,其次会依赖其它相关设计、开发等人员。如果你负责做过应用系统(尤其是上线的生产系统)的 Troubleshooting 或 tuning 工作,你大概会理解我的意思。

          说了这么多赶紧进入正题。聪明的读者肯定已经反应过来,只要用 LoadRunner“录制”一下应用中我们关注的业务用例,就可以把想要的 Remoting 接口得到了。说得很对不过真实过程还需要一些技巧。下面记录下我完成上面需求的做法。

 

          首先使用 LoadRunner 9.0 提供的 Microsoft .NET 协议,配置“录制”的过滤器(Filters),这里可以说是你所关注的 Profiling 的层面,LoadRunner 9.0 支持 4 种过程器,这里我只关注 Remoting 层面的通信/调用,其它几项根据你的需要来配置:

 

filterr

 

          通过上面配置的过程器完成“录制”后,就可以 Profiling 得到如下 Remoting 接口调用程序脚本,LoadRunner 实际是创建了一个标准的 C# 项目(csproj 8.0.50727)并生成了其中的业务用例接口的客户端调用代码,这个程序脚本也是通过 msbuild 工具编译的。下面列出简短片段:

 

namespace Script {
    using LoadRunner;
    using Mercury.LoadRunner.DotNetProtocol.Replay;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using BusinessFacadeInterface;
    using Entity;
    
    public partial class VuserClass {
        
        public virtual int Action() {

            ... ...

            String url_17;
            url_17 = "Tcp://192.168.0.1:9090/Query.rem";
            IBusinessFacadeQuery_3 = ((IBusinessFacadeQuery)(Activator.GetObject(typeof(BusinessFacadeInterface.IBusinessFacadeQuery), url_17)));
            otherChangeDec_2 =             ((ChargeDescription)(LrReplayUtils.GetSerializedObject("Serialization_3016.bin")));
DataTable_27 = IBusinessFacadeQuery_3.QueryByChangeDec(otherChangeDec_2);

            String url_18;
            url_18 = "Tcp://192.168.0.1:9090/Query.rem";
            IBusinessFacadeQuery_3 = ((IBusinessFacadeQuery)(Activator.GetObject(typeof(BusinessFacadeInterface.IBusinessFacadeQuery), url_18)));
            Result_1 = IBusinessFacadeQuery_3.QueryByNO("010");

            String url_19;
            url_19 = "Tcp://192.168.0.1:9090/ResQuery.rem";
            IBusinessFacadeResQuery_1 = ((IBusinessFacadeResQuery)(Activator.GetObject(typeof(BusinessFacadeInterface.IBusinessFacadeResQuery), url_19)));
            condition_1 = ((ResEntity)(LrReplayUtils.GetSerializedObject("Serialization_3017.bin")));
            user_1 = ((SystemUserEntity)(LrReplayUtils.GetSerializedObject("Serialization_3018.bin")));
            List_2 = IBusinessFacadeResQuery_1.GetResEntity(condition_1, user_1);

            ... ...

            return 0;
        }
    }
}

 

namespace Script {
    using LoadRunner;
    using Mercury.LoadRunner.DotNetProtocol.Replay;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using BusinessFacadeInterface;
    using Entity;
    
    public partial class VuserClass {

        ... ...

        private IBusinessFacadeQuery IBusinessFacadeQuery_3;
        private OtherChargeDescription otherChangeDec_2;
        private IBusinessFacadeResQuery IBusinessFacadeResQuery_1;
        private ResCondition condition_1;
        private User user_1;
        private List<Res> List_2;

        ... ...

    }
}

 

          相信写过 Remoting 客户端的都已经看得很明白了,上面代码片段包括了激活服务器端 well-known Remoting 远程对象,通过反序列化准备参数对象,调用远程对象的接口方法并取得结果。通过这个简单的 profiling 过程我们可以很清晰的了解整个关注业务用例的接口调用、执行序列细节。说老实话,就接口 profiling 这一块来说,上面这个结果可比 Red Gate ANTS Performance Profiler 这类 profiling 工具快捷方便很多,而且结果相当清晰。

 

          接下来,为了明确关注业务用例的接口执行/调用过程和状态迁移,则可以通过分析上面生成的 profiling 代码形成一份 UML序列图就会比较清晰了。当然这要看你需要解决问题的复杂度,如果简单看看就已经很清晰了,生成序列图就显然没有必要。

 

          另外,可以供参考的重要资源是 Remoting 配置文件,web.config 或 app.config(进程 config)文件。因为上面 LoadRunner profiling 的代码中激活返回结果都是接口(C# interface),如其中第 4 行代码所示:

 

Activator.GetObject(typeof(BusinessFacadeInterface.IBusinessFacadeQuery), "Tcp://192.168.0.1:9090/Query.rem");

 

          这可以通过和 Remoting 服务端配置中对应的服务rem地址,来确定接口的具体实现类是什么,这很容易找到。最后把我这里最后分析得到的流程图贴上来,由于涉及项目内容所以处理成了小图,看个意思吧。

 

sequence

 

          有了上面些分析结果,已经可以明确问题可以存在的位置或范围,为下阶段的细化分析提供一个正确的方向和基础,通过逐步细化的分析过程,从接口开始并最终找到用例实现中的问题本质原因。

 

作者:lzy.je
出处:http://lzy.iteye.com
本文版权归作者所有,只允许以摘要和完整全文两种形式转载,不允许对文字进行裁剪。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

 

  • 大小: 38.8 KB
  • 大小: 71.5 KB
1
0
分享到:
评论

相关推荐

    JVM调优

    10. **TPTP官方教程**:TPTP(Test Performance and Profiling Tools Platform)是Eclipse基金会的一个项目,提供了一系列用于性能测试和分析的工具,可以帮助开发者深入理解应用的性能状况。 综上所述,JVM调优...

    Java性能分析20211022.rar

    在Java开发过程中,性能分析是优化应用程序的关键环节。"Java Top CPU和内存溢出分析"这一主题涵盖了两个核心概念:CPU使用率过高问题以及内存溢出(Out of Memory,OOM)错误。这两个问题都可能导致系统运行缓慢,...

    一个基于Qt Creator(qt,C++)实现中国象棋人机对战

    qt 一个基于Qt Creator(qt,C++)实现中国象棋人机对战.

    热带雨林自驾游自然奇观探索.doc

    热带雨林自驾游自然奇观探索

    冰川湖自驾游冰雪交融景象.doc

    冰川湖自驾游冰雪交融景象

    C51 单片机数码管使用 Keil项目C语言源码

    C51 单片机数码管使用 Keil项目C语言源码

    基于智能算法的无人机路径规划研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    前端分析-2023071100789s12

    前端分析-2023071100789s12

    Delphi 12.3控件之Laz-制作了一些窗体和对话框样式.7z

    Laz_制作了一些窗体和对话框样式.7z

    ocaml-docs-4.05.0-6.el7.x64-86.rpm.tar.gz

    1、文件内容:ocaml-docs-4.05.0-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ocaml-docs-4.05.0-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    学习笔记-沁恒第六讲-米醋

    学习笔记-沁恒第六讲-米醋

    工业机器人技术讲解【36页】.pptx

    工业机器人技术讲解【36页】

    基于CentOS 7和Docker环境下安装和配置Elasticsearch数据库

    内容概要:本文档详细介绍了在 CentOS 7 上利用 Docker 容器化环境来部署和配置 Elasticsearch 数据库的过程。首先概述了 Elasticsearch 的特点及其主要应用场景如全文检索、日志和数据分析等,并强调了其分布式架构带来的高性能与可扩展性。之后针对具体的安装流程进行了讲解,涉及创建所需的工作目录,准备docker-compose.yml文件以及通过docker-compose工具自动化完成镜像下载和服务启动的一系列命令;同时对可能出现的问题提供了应对策略并附带解决了分词功能出现的问题。 适合人群:从事IT运维工作的技术人员或对NoSQL数据库感兴趣的开发者。 使用场景及目标:该教程旨在帮助读者掌握如何在一个Linux系统中使用现代化的应用交付方式搭建企业级搜索引擎解决方案,特别适用于希望深入了解Elastic Stack生态体系的个人研究与团队项目实践中。 阅读建议:建议按照文中给出的具体步骤进行实验验证,尤其是要注意调整相关参数配置适配自身环境。对于初次接触此话题的朋友来说,应该提前熟悉一下Linux操作系统的基础命令行知识和Docker的相关基础知识

    基于CNN和FNN的进化神经元模型的快速响应尖峰神经网络 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    网络小说的类型创新、情节设计与角色塑造.doc

    网络小说的类型创新、情节设计与角色塑造

    毕业设计-基于springboot+vue开发的学生考勤管理系统【源码+sql+可运行】50311.zip

    毕业设计_基于springboot+vue开发的学生考勤管理系统【源码+sql+可运行】【50311】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:班级信息、学生信息、课程信息、考勤记录、假期信息、公告信息 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!

    57页-智慧办公园区智能化设计方案.pdf

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

    一种欠定盲源分离方法及其在模态识别中的应用 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    Matlab实现基于BO贝叶斯优化Transformer结合GRU门控循环单元时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文介绍了使用 Matlab 实现基于 BO(贝叶斯优化)的 Transformer 结合 GRU 门控循环单元时间序列预测的具体项目案例。文章首先介绍了时间序列预测的重要性及其现有方法存在的限制,随后深入阐述了该项目的目标、挑战与特色。重点描述了项目中采用的技术手段——结合 Transformer 和 GRU 模型的优点,通过贝叶斯优化进行超参数调整。文中给出了模型的具体实现步骤、代码示例以及完整的项目流程。同时强调了数据预处理、特征提取、窗口化分割、超参数搜索等关键技术点,并讨论了系统的设计部署细节、可视化界面制作等内容。 适合人群:具有一定机器学习基础,尤其是熟悉时间序列预测与深度学习的科研工作者或从业者。 使用场景及目标:适用于金融、医疗、能源等多个行业的高精度时间序列预测。该模型可通过捕捉长时间跨度下的复杂模式,提供更为精准的趋势预判,辅助相关机构作出合理的前瞻规划。 其他说明:此项目还涵盖了从数据采集到模型发布的全流程讲解,以及GUI图形用户界面的设计实现,有助于用户友好性提升和技术应用落地。此外,文档包含了详尽的操作指南和丰富的附录资料,包括完整的程序清单、性能评价指标等,便于读者动手实践。

    漫画与青少年教育关系.doc

    漫画与青少年教育关系

Global site tag (gtag.js) - Google Analytics