发布新日志

  • 性能测试知多少:性能分析与调优的原理

    2013-03-22 13:00:19

    最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手。

      单一个中间件又分web中间件(apache 、IIS),应用中间件(tomcat 、weblogic 、webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功。但调优对于每一项的要求又不仅仅是“知道”或“会使用”这么简单。起码要达到“如何更好的使用”。

      常看到性能测试书中说,性能测试不单单是性能测试工程师一个人的事儿。需要DBA 、开发人员、运维人员的配合完成。但是在不少情况下性能测试是由性能测试人员独立完成的,退一步就算由其它人员的协助,了解系统架构的的各个模块对于自身的提高也有很大帮助,同进也更能得到别人的尊重。
     

      再说性能调优之前,我们有必要再提一下进行测试的目的,或者我们进行性能测试的初衷是什么?

    能力验证:验证某系统在一定条件具有什么样的能力。

    能力规划:如何使系统达到我们要求的性能能力。

    应用程序诊断:比如内存泄漏,通过功能测试很难发现,但通过性能测试却很容易发现。

    性能调优:满足用户需求,进一步进行系统分析找出瓶颈,优化瓶颈,提高系统整体性能。



    一般系统的瓶颈                                                                                          

     

    性能测试调优需要先发现瓶颈,那么系统一般会存在哪些瓶颈:

    硬件上的性能瓶颈:

    一般指的是CPU、内存、磁盘I/O 方面的问题,分为服务器硬件瓶颈、网络瓶颈(对局域网可以不考虑)、服务器操作系统瓶颈(参数配置)、中间件瓶颈(参数配置、数据库、web服务器等)、应用瓶颈(SQL 语句、数据库设计、业务逻辑、算法等)。

     
    应用软件上的性能瓶颈:

    一般指的是应用服务器、web 服务器等应用软件,还包括数据库系统。

    例如:中间件weblogic 平台上配置的JDBC连接池的参数设置不合理,造成的瓶颈。
     

    应用程序上的性能瓶颈:

    一般指的是开发人员新开发出来的应用程序。

    例如,程序架构规划不合理,程序本身设计有问题(串行处理、请求的处理线程不够),造成系统在大量用户方位时性能低下而造成的瓶颈。

     
    操作系统上的性能瓶颈:

    一般指的是windows、UNIX、Linux等操作系统。

    例如,在进行性能测试,出现物理内存不足时,虚拟内存设置也不合理,虚拟内存的交换效率就会大大降低,从而导致行为的响应时间大大增加,这时认为操作系统上出现性能瓶颈。

     
    网络设备上的性能瓶颈:

    一般指的是防火墙、动态负载均衡器、交换机等设备。

    例如,在动态负载均衡器上设置了动态分发负载的机制,当发现某个应用服务器上的硬件资源已经到达极限时,动态负载均衡器将后续的交易请求发送到其他负载较轻的应用服务器上。在测试时发现,动态负载均衡器没有起到相应的作用,这时可以认为网络瓶颈。

     

      性能测试出现的原因及其定位十分复杂,这里只是简单介绍常见的几种瓶颈类型和特征,而性能测试所需要做的就是根据各种情况因素综合考虑,然后协助开发人员\DBA\运维人员一起定位性能瓶颈。

      
    一般性能调优步骤                                                                                      

     
    一般性能问题调优的步骤:

    步骤一:确定问题

    应用程序代码:在通常情况下,很多程序的性能问题都是写出来的,因此对于发现瓶颈的模块,应该首先检查一下代码。

    数据库配置:经常引起整个系统运行缓慢,一些诸如oracle 的大型数据库都是需要DBA进行正确的参数调整才能投产的。

    操作系统配置:不合理就可能引起系统瓶颈。

    硬件设置:硬盘速度、内存大小等都是容易引起瓶颈的原因,因此这些都是分析的重点。

    网络:网络负载过重导致网络冲突和网络延迟。

     
    步骤二:确定问题

      当确定了问题之后,我们要明确这个问题影响的是响应时间吞吐量,还是其他问题?是多数用户还是少数用户遇到了问题?如果是少数用户,这几个用户与其它用户的操作有什么不用?系统资源监控的结果是否正常?CPU的使用是否到达极限?I/O 情况如何?问题是否集中在某一类模块中? 是客户端还是服务器出现问题? 系统硬件配置是否够用?实际负载是否超过了系统的负载能力? 是否未对系统进行优化?

    通过这些分析及一些与系统相关的问题,可以对系统瓶颈有更深入的了解,进而分析出真正的原因。

     
    步骤三: 确定调整目标和解决方案

    得高系统吞吐理,缩短响应时间,更好地支持并发。

     步骤四:测试解决方案

    对通过解决方案调优后的系统进行基准测试。(基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试)

     
    步骤五:分析调优结果

    系统调优是否达到或者超出了预定目标?系统是整体性能得到了改善,还是以系统某部分性能来解决其他问题。调优是否可以结束了。

      最后,如果达到了预期目标,调优工作就基本可以结束了。

     
    下面算是一个技巧,如面试官问到一个性能问题假设,我不知道性能问题出在哪儿时,可以按照这个思路回答^_^

       ? 查找瓶颈时按以下顺序,由易到难。
        服务器硬件瓶颈---〉网络瓶颈(对局域网,可以不考虑)---〉服务器操作系统瓶颈(参数配置)---〉中间件瓶颈(参数配置,数据库,web服务器等)---〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)
        注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。
        ? 分段排除法 很有效

     

    性能测试调优应该注意的要点:

    要点1: 在应用系统的设计开发过程中,应始终把性能放在考虑的范围内。
    要点2: 确定清晰明确的性能目标是关键。
    要点3: 必须保证调优后的程序运行正确。
    要点4: 系统的性能更大程度上取决于良好的设计,调优技巧只是一个辅助手段。
    要点5: 调优过程是迭代渐进的过程,每一次调优的结果都要反馈到后续的代码开发中去。
    要点6: 性能调优不能以牺牲代码的可读性和可维护性为代码。
     
  • 要做好性能测试,该掌握些什么?

    2013-03-22 12:59:34

    1. 精通性能测试的基本概念,过程,方法论,了解性能工程;

      2. 精通1个商业性能测试工具+1个开源性能测试工具,知道工具可以做什么,不可以做什么,以及工具使用中常见的问题和解决思路;

      3. 扎实的计算机专业基础知识,包括计算机组成原理、操作系统数据库原理、计算机网络原理;

      4. 熟悉至少1个常用的数据库产品,例如SQL Server或者 Oracle,能进行一般的数据库管理操作,熟悉SQL脚本的使用,熟悉常用的数据调优工具和常用的counter;

      5. 熟悉至少一个操作系统的原理,Windows或者Linux都可以,熟悉操作系统的体系架构、操作系统的重要基础概念,以及内存管理、存储/文件系统、驱动/硬件的管理、网络协议的实现及构成、性能的监控方法和原理,熟悉常用的counter;

      6. 熟悉至少一个web server 产品,例如apache,了解一般的配置和常用的counter;

      7. 熟悉至少一个应用服务器产品,例如tomcat,了解一般的配置,熟悉常用的服务器性能监控方法和原理,熟悉常用的counter;

      8. 至少熟悉TCP/IP协议,熟悉HTTP协议,至少见过并了解三层、四层交换或者路由器的使用和配置。了解常用的与网络性能相关的counter;9. 了解一般的大型企业应用的部署架构和应用架构;

      10. 了解知名大型web应用、高并发量、高流量、实时响应要求高的超大规模网站的架构和优化历程;

      11. 熟悉统计学的基础知识、常用分析方法以及实验设计方法,了解数学建模相关的知识;

      12. 熟悉专属行业的业务知识和用户场景,例如电信行业的OSS系统所涉及的业务知识和用户场景,证券交易系统所涉及的业务知识和用户场景;

      13. 大量的实际性能测试及优化经验;

      14. 积极的参与到各类圈子、社团的讨论和交流、分享中。

  • JAVA单元测试工具(一)

    2013-02-16 14:04:47

    一、JTEST

      1、简介:

      jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。Jtest先分析每个java类,然后自动生成junit测 试用例并执行用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常暴露出来;另外,它还可以检查以DbC(Design by Contract)规范开发的代码的正确性。用户还可以通过扩展测试用例的自动生成器来添加更多的junit用例。Jtest还能按照现有的超过350个 编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄漏、性 能问题、安全隐患这样的代码问题。

      2、优势:

       1)使预防代码错误成为可能,从而大大节约成本,提高软件质量和开发效率

       2)使单元测试——包括白盒、黑盒以及回归测试成为可能

       3)使代码规范检查和自动纠正成为可能

       4)鼓励开发团队横向协作来预防代码错误

      3、特征:

       1)通过简单的点击,自动实现代码基本错误的预防,这包括单元测试和代码规范的检查

       2)生成并执行junit单元测试用例,对代码进行即时检查

       3)提供了进行黑盒测试、模型测试和系统测试的快速途径

       4)确认并阻止代码中不可捕获的异常、函数错误、内存泄漏、性能问题、安全弱点的问题

       5)监视测试的覆盖范围

       6)自动执行回归测试

       7)支持DbC编码规范

       8)检验超过350个来自java专家的开发规范

       9)自动纠正违反超过160个编码规范的错误

       10)允许用户通过图形方式或自动创建方式来自定义编码规范

       11)支持大型团队开发中测试设置和测试文件的共享

       12)实现和IBM Websphere Studio /Eclipse IDE 的安全集成

      4、价格:昂贵

      二、JMETER

      1、简介:

       JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。使用JMeter进行性能测试

      2、特征:

       JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高

      负载情况下测试服务器/脚本/对象的行为。

      3、价格:未知
    三、JUNIT

      1、简介:

       JUnit是一个开源的 java测试框架,它是Xuint测试体系架构的一种实现。在JUnit单元测试框架的设计时,设定了三个总体目标,第一个是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写;第二个是使测试单元保持持久性;第三个则是可以利用既有的测试来编写相关的测试。

      2、优势:

       2.1)junit是完全Free的。

        2.2)使用方便。在你提升程序代码的品质时JUnit测试仍允许你更快速的撰写程序那听起来似乎不是很直觉,但那是事实。当你使用JUnit撰写测试, 你将花更少的时间除虫,同时对你程序代码的改变更俱有信心。这个信心让你更积极重整程序代码并增加新的功能。没有测试,对于重整及增加新功能你会变得没有 信心;因为你不知道有甚么东西会破坏产出的结果。采用一个综合的测试系列,你可以在改变程序代码之后快速的执行多个测试并对于你的变动并未破坏任何东西感 到有信心。在执行测试时如果发现臭虫,原始码仍然清楚的在你脑中,因此很容易找到臭虫。在JUnit中撰写的测试帮助你以一种极大(extreme)的步 伐撰写程序及快速的找出缺点。

       2.3)JUnit非常简单撰写测试应该很简单--这是重点!如果撰写测试太复杂或太耗时间,便无法要求程序设计师撰写测试。使用JUnit你可以快速的 撰写测试并检测你的程序代码并逐步随着程序代码的成长增加测试。只要你写了一些测试,你想要快速并频繁的执行测试而不至于中断建立设计及开发程序。使用 JUnit执行测试就像编译你的程序代码那么容易。事实上,你应该执行编译时也执行测试。编译是检测程序代码的语法而测试是检查程序代码的完整性 (integrity)。

       2.4)JUnit测试检验其结果并提供立即的回馈。如果你是以人工比对测试的期望与实际结果那么测试是很不好玩的,而且让你的速度慢下来。JUnit测 试可以自动执行并且检查他们自己的结果。当你执行测试,你获得简单且立即的回馈;比如测试是通过或失败。而不再需要人工检查测试结果的报告。

       2.5)JUnit测试可以合成一个测试系列的层级架构。JUnit可以把测试组织成测试系列;这个测试系列可以包含其它的测试或测试系列。JUnit测试的合成行为允许你组合多个测试并自动的回归(regression)从头到尾测试整个测试系。

      你也可以执行测试系列层级架构中任何一层的测试。

       2.6)撰写JUnit测试所费不多。使用Junit测试框架,你可以很便宜的撰写测试并享受由测试框架所提供的信心。撰写一个测试就像写一个方法一样简单;测试是检验要测试的程序代码并定义期望的结果。这个测试框架提供自动执行

      测试的背景;这个背景并成为其它测试集合的一部份。在测试少量的投资将持续让你从时间及品质中获得回收。

       2.7)JUnit测试提升软件的稳定性。你写的测试愈少;你的程序代码变的愈不稳定。测试使得软件稳定并逐步累积信心;因为任何变动不会造成涟漪效应而漫及整个软件。测试可以形成软件的完整结构的胶结。

       2.8)JUnit测试是开发者测试。JUnit测试是高度区域性(localized)测试;用以改善开发者的生产力及程序代码品质。不像功能测试 (function test)视系统为一个黑箱以确认软件整体的工作性为主,单元测试是由内而外测试系统基础的建构区块。开发者撰写并拥有JUnit测试。每当一个开发反复 (iteration)完成,这个测试便包裹成为交付软件的一部份提供一种沟通的方式,「这是我交付的软件并且是通过测试

      2.9)JUnit测试是以Java写成的。使用Java测试Java软件形成一个介于测试及程序代码间的无缝(seamless)边界。

      在测试的控制下测试变成整个软件的扩充同时程序代码可以被重整。Java编译器的单元测试静态语法检查可已帮助测试程序并且确认遵守软件接口的约定.一段测试的程序代码无法单独的执行,它需要是执行环境的一部份。

       同时,它需要自动执行的单元测试--譬如在系统中周期性的执行所有的测试以证明没有任何东西被破坏。由于单元测试需要符合特定的准则:一个成功的测试不 应该是人工检查的(那可要到天荒地老了啊),一个未通过测试的失败应可以产出文件以供诊断修改。而Junit可以提供给我们这些便利.。这样所有测试开发 者所需撰写的只是测试码本身了。跟optimizeit、Jtest那些昂贵而又超级麻烦的tool比较起来,其利昭然可见!

      3、价格:免费
  • loadrunner循环执行某个动作

    2012-05-31 16:33:45

    1action部分定义  int   i;  int   count;

    2、 打算循环的代码前代码如下:

      count=rand() % 8 +1;

     

        for(i=0;i<count;i++)

     录制的脚本;


    3、其实只需要在需要重复执行的代码前加入for循环语句即可。
  • JProfiler学习笔记(转)

    2012-04-24 19:53:55

    JProfiler学习笔记

     

    一、安装JProfiler

           http://www.ej-technologies.com/下载5.1.2并申请试用序列号

     

    二、主要功能简介

    1内存剖析 Memory profiler

    JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。

    • 所有对象 
      显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。
    • 记录对象 Record objects 
      显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。
    • 分配访问树 Allocation call tree 
      显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
    • 分配热点 Allocation hot spots 
      显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。

    2堆遍历 Heap walker

    JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:

    •  Classes 
      显示所有类和它们的实例。
    • 分配 Allocations 
      为所有记录对象显示分配树和分配热点。
    • 索引 References 
      为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
    • 数据 Data 
      为单个对象显示实例和类数据。
    • 时间 Time 
      显示一个对已记录对象的解决时间的柱状图。

    3 CPU 剖析 CPU profiler

    JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:

    • 访问树 Call tree 
      显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMSJNDI服务请求都被注释在请求树中。请求树可以根据ServletJSPURL的不同需要进行拆分。
    • 热点 Hot spots 
      显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBCJMSJNDI服务请求以及按照URL请求来进行计算。
    • 访问图 Call graph 
      显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。

    4 线程剖析 Thread profiler

    对线程剖析,JProfiler提供以下视图:

    • 线程历史 Thread history 
      显示一个与线程活动和线程状态在一起的活动时间表。
    • 线程监控 Thread monitor 
      显示一个列表,包括所有的活动线程以及它们目前的活动状况。
    • 死锁探测图表 Deadlock Detection 
      显示一个包含了所有在JVM里的死锁图表。
    • 目前使用的监测器 Current monitor useage 
      显示目前使用的监测器并且包括它们的关联线程。
    • 历史检测记录 History usage history 
      显示重大的等待事件和阻塞事件的历史记录。
    • 监测使用状态 Monitor usage statistics 
      显示分组监测,线程和监测类的统计监测数据。

    5VM 遥感勘测技术 VM telemetry

    观察JVM的内部状态,JProfiler提供了不同的遥感勘测视图,如下所示:

    •  Heap 
      显示一个堆的使用状况和堆尺寸大小活动时间表。
    • 记录的对象 Recorded objects 
      显示一张关于活动对象与数组的图表的活动时间表。
    • 垃圾回收 Garbage collector 
      显示一张关于垃圾回收活动的活动时间表。
    •  Classes 
      显示一个与已装载类的图表的活动时间表。
    • 线程 Threads 
      显示一个与动态线程图表的活动时间表

     

    三、实战

    ()任务目标

    找出项目中内存增大的原因

      (二)配置说明

               操作系统:Windows2003

                  Web容器:Tomcat5.0.23

                  JDK版本:sun1.4.2

                  监控类型:本地

                  Jprofiler安装路径:D:/jprofiler5

                  Tomcat安装路径:D:/Tomcat5

    (三)  测试项目

    1.  新建WEB项目test

    2.  建包cn.test

    3.  在该包下建类文件TestMain.java  TestBean.java

    package cn.test;

    public class TestBean {

       String name = "";

    }

     

    package cn.test;

    import java.util.ArrayList;

    public class TestMain {

    public static ArrayList list = new ArrayList(); //存放对象的容器

    public static int counter = 0;    //作统计用

         }

     

           4.建测试用的JSP文件init1.jspinit2.jsp

    Init1.jsp(每次执行都创建1万个TestBean对象)

    <%@ page language="java" import="cn.test.*" pageEncoding="ISO-8859-1"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

      <head>

        <title>init</title>

      </head>

      <body><%

        for(int i=0;i<10000;i++){

           TestBean b = new TestBean();

           TestMain.list.add(b);      

        }

        %>

        SIZE:<%=TestMain.list.size()%><br/>

        counter:<%=TestMain.counter++%>

      </body>

    </html>

    Init2.jspinit1.jsp一模一样即可(后面有用)。

     

     

    (四)     配置测试用例

    1.  点击d:/jprofiler5/bin/jprofiler.exe

    2.  执行菜单SessionàIntegration WizardsàNew ServerIntegration

     

     

     

    选择是本地测试还是远程测试:

     

    选择tomcat运行的脚本文件:

     

    选择虚拟机的类型:

     

    选择监控端口:

    用默认的即可

     

    选择Web容器是否和Jprofiler一起运行:

    默认即可

     

    配置提示:

      在“远程控制”的时侯要仔细阅读一下。

     

    然后选择立即起动,开始运行。

     

     

    点击“OK”,我们可以看到另外一个小窗口出来了:

     

    Jprofiler的窗口为:

     

    这样我们就可以进行监控了!

    (五)     开始测试

    1.  IE地址栏中输入:http://localhost/test/init1.jsp,执行一次,我们可以在内存视图中看到cn.test.TestBean对象被创建了10000次:

     

    2.标记现在的状态,然后再执行init1.jsp,init2.jsp可以让我们找到哪些类在调用后没有被释放(很重要!!!)

     

    查看哪些类被发生了变化:

    红色的变成是发生变化的对象及其数量。

    我刚才执行了4init1.jsp1init2.jsp,正好产生了50000TestBean对象,和图示显示的一样。

    3.  过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放!

    4.  找出是哪些地方使用了TestBean类,并且没有释放它们

    cn.test.TestBean对象上点击右键选择“Take Heap Snapshot for Selection”,观察它的heap

    下一步:

    点击“OK”:

     

    在该类中点击右键,在出现的菜单中选择“Use Selected Objects”:

    出现如下窗口:

    选择”Allocations”,点击“OK,然后我们要的结果就出来了

    图中显示调用此类的地方是init1.jspinit2.jsp,并且各自占用的比率都列出来了。

    既然问题的所在找出来了,接下来就该去解决问题了!

    (五)总结

    其实,我们在测试内存占用时还可以另外写一个释放内存的JSP文件来配合测试,会更清楚一些:

    Free.sjp

    <%@ page language="java" import="java.util.*,cn.test.*" pageEncoding="ISO-8859-1"%>

  • 转-使用LoadRunner测试Oracle数据库经验总结

    2011-09-07 09:35:45

    1、登录SQL*Plus的操作也录制在Action中,添加迭代运行会报错,提示如下:

      Action.c(11): Error: lrdo_server_attach: "OCIServerAttach" return-code=OCI_ERROR, error-code=24309:

      Action.c(11): Error:     ORA-24309: 已连接至服务器

      Action.c(11): server_attach: ERROR, return-code=LRDE2009.  ServerHandle=OraSrv1, ServerID="customs"

      Abort was called from an action.

      解决办法:1)将登陆SQL*Plus的操作录制在vuser_init中;2)同时录制退出SQL*Plus的操作

      2、测试压力上来以后,会有好多Vuser出现Error,具体报错如下:

      Action.c(37): Error: lrdo_ora8_exec: "OCIStmtExecute" return-code=OCI_ERROR,error-code=00054:

      解决方法:把lrd_ora8_exec(OraSvc1, OraStm<i>, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 0);

      改为:lrd_ora8_exec(OraSvc1, OraStm<i>, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 1);

      3、测试压力上来以后,会有好多Vuser出现Error,具体报错如下:

      Action.c(13): Error: lrdo_server_attach: "OCIServerAttach" return-code=OCI_ERROR, error-code=12514:

      解决办法:开启数据库服务器监听,启动数据库服务器。

      4、测试压力上来以后,会有好多Vuser出现Error,具体报错如下:

      Action.c(26): Error: C interpreter run time error: Action.c (26): Error -- Unresolved symbol : lrd_session_begin.

      解决办法:在vuser_init中添加 #include "lrd.h"

      5、测试压力上来以后,会有好多Vuser出现Error,具体报错如下:

      Starting iteration 1.

      Starting action Action.

      Action.c(13): Error: lrdo_server_attach: "OCIServerAttach" return-code=OCI_ERROR, error-code=12541:

      Action.c(13): Error: ORA-12541: TNS: 没有监听器

      Action.c(13): server_attach: ERROR, return-code=LRDE2009. ServerHandle=OraSrv1, ServerID="lr"

      解决办法:启动数据库服务器,开启listener。如果需要使用isqlplus的话,开启服务:$isqlplusctl start

      6、测试压力上来以后,会有好多Vuser出现Error,具体报错如下:

      Action.c(13): Error: lrdo_server_attach: "OCIServerAttach" return-code=OCI_ERROR, error-code=12514:

      Action.c(13): Error: ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME

      Action.c(13): server_attach: ERROR, return-code=LRDE2009. ServerHandle=OraSrv1, ServerID="lr"

      解决办法:检查压力机Oracle客户端解析文件tnsnames.ora,确保正确配置了这个文件。

      检查测试的数据库服务器,确保正确配置了监听,并已经开启。

       7、使用Controller产生负载,最后测试数据只有以下4条性能曲线:Running Vusers、Trans Response Time、Trans/Sec(Passed)、Total Trans/Sec(Passed)、其余的Throughput、HTTP Responses per Second、Connections等等性能统计项均显示为灰色,没有统计数据

      解决办法:因为sqlplus.exe是一个win32程序,那么在测试的过程中只统计上面的四项,它不会统计Throughput这些Web测试才有的性能曲线。

      所以,如果想对数据库服务器测试的更全面,这个时候就要使用isqlplus来发出查询。

      1)在DB server上启动isqlplus服务:isqlplusctl start

      2)启动VuGen,在客户端(压力机)启动isqlplus的Web页面

      3)输入用户名、密码,我这里采用scott/tiger@lr

      OK!录制完成之后,产生压力执行测试。顺利结束之后,可以看到如下曲线已经抓取出来了:

      Throughput、HTTP Responses per Second、Connections

      剩余的工作就是如何分析性能数据了。

  • 转-Linux + JIRA4.2 + MySQL安装&破解&配置攻略

    2011-08-30 12:43:17

    一、安装

     

    1.Linux & MySql & JDK安装步骤省略,我使用的是Debian5 + MySql5 + JDK6

     

    2.下载JIRA4.2,下载地址:http://www.atlassian.com/software/jira/JIRADownloadCenter.jspa

    注意:选择4.2 standalone版本

     

    3.将下载得到的atlassian-jira-enterprise-4.2-standalone.tar.gz文件解压缩到/usr/local/jira目录下面

     

    4.在MySql中专将JIRA数据库

    create database jiradb character set  utf8;

    grant all on jiradb.* to `jira`@`localhost` identified by 'jira'

     

    5. 修改JIRA配

     

    5.1创建jira.home文件夹

    mkdir -p /usr/local/jira_home

     

    5.2修改/usr/local/jira/atlassian-jira/WEB-INF/classes jira-application.properties 文件
    找到jira.home =
    修改为jira.home =/usr/local/jira_home 绝对路径

    注:jira.home文件夹不可以设置为jira根目录及其子目录,关于这个目录做什么用,我也不清楚,估计是jira程序放临时文件用的吧。

     

    5.3修改/usr/local/jira/conf/server.xml文件

    修改成如下几项

    username= "jira"  
    password="jira"  
    driverClassName="com.mysql.jdbc.Driver"  
    url="jdbc:mysql://localhost/jiradb? autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF8"

    删除以下两行

    minEvictableIdleTimeMillis= "4000"  
    timeBetweenEvictionRunsMillis="5000"

     

    5.4修改/usr/local/jira/atlassian-jira/WEB_INF/classes/entityengine.xml文件

    将其中的hsql改成mysql 数据库类型

    <datasource name= "defaultDS"  field-type-name= "hsql"  
    改为: 
    <datasource name="defaultDS"  field-type-name= "mysql"  
    删除    schema-name="PUBLIC"

     

    二、破解

     

    1. 下载破解补丁(jira_crack.zip)

    下载地址:http://download.csdn.net/source/2812878

     

    2.用破解补丁中的JiraLicenseStoreImpl.class文件覆盖/usr/local/jira/atlassian-jira /WEB_INF/classes/com/atlassian/jira/license/JiraLicenseStoreImpl.class文件

     

    3. 用破解补丁中的Version2LicenseDecoder.class文件覆盖/usr/local/jira/atlassian-jira /WEB_INF/lib/atlassian-extras-2.2.2.jar包中的atlassian-extras-2.2.2.jar/com /atlassian/extras/decoder/v2/Version2LicenseDecoder.class文件

    注:jar包可以用WinRAR打开,并可以采用拖拽的方式覆盖文件

     

    4.运行JIRA服务

    /usr/local/jira/bin/startup.sh

     

    5.WEB 配置 JIRA

    官方文档 http://www.atlassian.com/software/jira/docs/v3.13/setup.html
    视频演示 : http://www.atlassian.com/software/jira/videos/jira4-overview.jsp

     

    在注册码输入框处输入以下内容:

    #Sun Oct 25 00:50:34 CDT 2009
    Description=JIRA/: COMMERCIAL
    CreationDate=2009-10-25
    ContactName=ct@ct.ct
    jira.LicenseEdition=ENTERPRISE
    ContactEMail=ct@ct.ct
    Evaluation=false
    jira.LicenseTypeName=COMMERCIAL
    jira.active=true
    licenseVersion=2
    MaintenanceExpiryDate=2010-10-24
    rganisation=haha
    jira.NumberOfUsers=-1
    ServerID=此处替换成输入框上方的ID值
    LicenseID=LID
    LicenseExpiryDate=2010-10-24
    PurchaseDate=2009-10-25

     

    配置成功....

  • 转-配置JIRA使用外部数据库(Oracle 10g)

    2011-08-29 11:57:59

    1. 使用的是Jira Standalone版本, 安装后默认使用HSQL, 数据量有上限, 于是乎考虑将其转移至Oracle存储.  
    2.   
    3. 1. 先在Oracle中新建数据库或者表空间, 并创建个Jira使用的用户, 设置好权限.  
    4.   
    5. 2. 进入Jira管理界面, 左侧Import & Export-Backup Data to XML, 填写备份文件名, 点击Backup按钮保存当前数据库的数据.  
    6.   
    7. 3. 停止Jira服务, 进入Jira安装目录的conf子目录, 编辑server.xml, 修改Context的username, password, driverClassName和url属性段, 比如:  
    8.   
    9. username="diaoer"  
    10. password="diaoer"  
    11. driverClassName="oracle.jdbc.driver.OracleDriver"  
    12. url="jdbc:oracle:thin:diaoer/diaoer@192.168.1.194:1521:orcl" 
    13.   
    14. 同时还要删除以下两行只适用于HSQL的属性  
    15.   
    16. minEvictableIdleTimeMillis="4000"  
    17. timeBetweenEvictionRunsMillis="5000"  
    18.   
    19. 再添加上一行以存储大文本, 否则只能储存32K字节大小的文本  
    20.   
    21. connectionProperties="SetBigStringTryClob=true"  
    22.   
    23. 4. 修改Jira目录下的atlassian-jira\WEB-INF\classes\entityengine.xml文件  
    24.   
    25. 将 datasource里的field-type-name改成oracle10g并删除schema-name="PUBLIC", 因为它只适用于HSQL而不适用于Oracle  
    26.   
    27. 5. 拷贝Oracle公司发布的JDBC驱动ojdbc14.jar到Jira目录下的common\lib  
    28. 这里我把ojdbc14.jar改成了oracle.jar需要的请自行下载  
    29.   
    30. 注意: 按照官方网站说明, 选择10.1.0.5版的驱动最佳, 其它版本的可能会导致挂起或者数据恢复时异常问题. 下载页面: http://www.oracle.com /technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html, 选中 Accept点击下 载 ojdbc14.jar (1,378,346 bytes) - classes for use with JDK 1.4 这个就对了.  
    31.   
    32. 6. 最后一步, 启动Jira, 打开页面会出现配置向导, 此时选择恢复并填好之前备份好的xml文件名(注意需要填写绝对路径)和index索引目录路径, 确定就完成数据库迁移工作了, 嘿嘿.  
    33.   
    34. 附: 似乎备份的数据不包括邮件服务器的设置, 可能恢复后还得手动配置下这个, 还好工作量不大. 
  • 转-LR 分析内存泄露

    2011-08-27 11:35:30

     服务响应的时间标准

     

    参考了业内比较通行的2-5-10原则”——当然你也可以为自己的测试制定其他标准,只要得到企业内的承认就可以。所谓的“2-5-10原则,简单说,就是当用户能够在2秒以内得到响应时,会感觉系统的响应很快;当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;当用户在5-10秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;而当用户在超过10秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应,而选择离开这个Web站点,或者发起第二次请求。

     

    针对基础数据库添加企业信息:

    添加10家企业,9家成功,1家失败,失败详细信息

    Action.c(62): Error -26612: HTTP Status-Code=500 (Internal Server Error) for

    "http://202.117.99.211/basedatabasesite/PSInfo/IndustryFact/PSBaseInfoAdd.aspx?

    PSClassCode=1&%3f"

     

    Monitor name :Windows Resources. Cannot access data for measurement Processor|% Processor Time|_Total on machine 202.117.99.211.

    Details:检测出一个含有负分母值的计数器。

     

    Hint:

    Check that there is such a measurement on the machine (use the Add Machine dialog box) (entry point: CNtMeasurement::GetNewData3).[MsgId: MMSG-47295]

     

    功能名称:企业基本信息维护,添加企业基本信息

    10用户模拟并发操作

    系统响应时间:最短1.078最长4.901秒,属于可接受范围

    资源使用情况:

    内存分析

    其中:

    Handle Count(process _total)值由71030变化为71515差值485bytes

    private bytes值由2442407936变化为2469638144差值27230208bytes变化范围约3M

    committed bytes值由2625691648变化为2652794880差值27103232

     

    可用内存变化情况                                                              虚拟内存变化

    由以上2表可以看出,在系统20运行20秒时候存在较多的页交换

    此时查看error发现

    虚拟用户信息出错时间为第20

    http返回值500表示内部服务器错误。由此发现错误造成了内存泄漏。

     

  • 转-error -27792,-27796等问题

    2011-08-27 11:33:48

    error -27792,-27796等问题,都是和xp系统的tcp连接数有限制导致,默认是10,修改下这个默认值为150或者250,基本上就可以解决了。
    修改tcp连接数,网上有很多方法,我用的是最偷懒的方法,就是装一个bit精灵,里面有“tcp连接数破解补丁”,设置下就好了。

    我就是这么干的,貌似没有啥问题了。
  • 转-响应时间和吞吐量

    2011-08-27 11:28:43

    计算机系统的总体性能标准是响应时间和吞吐量。

    响应时间是提交请求和返回该请求的响应之间使用的时间。示例包括:

    • 数据库查询花费的时间
    • 将字符回显到终端上花费的时间
    • 访问 Web 页面花费的时间

    吞吐量是对单位时间内完成的工作量的量度。示例包括:

    • 每分钟的数据库事务
    • 每秒传送的文件千字节数
    • 每秒读或写的文件千字节数
    • 每分钟的 Web 服务器命中数

    这些度量之间的关系很复杂。有时可能以响应时间为代价而得到较高的吞吐量,而有时候又要以吞吐量为代价得到较好的响应时间。在其他情况下,一个单独的更改可能对两者都有提高。可接受的性能基于合理的吞吐量与合理的响应时间相结合。"

    ----摘抄于 IBM-性能目标

    http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/corr_svmon_ps_outputs.htm

    悟:曾经在实际的测试工作中遇到这种情况,某一个应用程序,用LR进行性能测试,项目组曾经把思考时间分别设为10秒和0秒,得到了两个差别较大的并发数,曾经有位资深人士说,如果思考时间够大,即使用很差的机器也能做出很大的并发数.

    在性能测试中,作为评价性能好坏的两个重要指标:吞吐量和响应时间, 是很容易让人混淆的。
    吞吐量:字面上的意思是单位时间里处理任务的能力,它的单位常常以hits/sec或者MB/sec为主,它以系统资源为对象的,因此系统性能的好坏直接影响了吞吐量的(理论)极限值。

    响应时间:这里是指从发送请求到完成响应的整个过程所经历的时间,它的单位常常以s或者ms为主。它是以某个请求为对象的,因此请求的大小以及复杂程度直接影响到响应时间的长短。

    这里提到一个概念是“排队论”(http://en.wikipedia.org/wiki/Queuing_theory), 在计算机系统中,这个概念是最常见的,了解排队理论对于我们理解吞吐量和响应时间的关系以及区别很有帮助!
    通常,平均响应时间越短,系统吞吐量越大;平均响应时间越长,系统吞吐量越小;
    但是,系统吞吐量越大, 未必平均响应时间越短;因为在某些情况(例如,不增加任何硬件配置)吞吐量的增大,有时会把平均响应时间作为牺牲,来换取一段时间处理更多的请求。
    一个例子,比如一个理发店,原先只有一个理发师,因为穷,只买的一张理发椅子,和一个长凳用来方便等待的人休息。理发师一次只能处理一个客户,其他等待的用户显得很不耐烦,外面打算进来理发的人也放弃了这家店理发的打算。。。
    有一天,理发师有钱了,他多买了2个理发椅子,这样,他可以同时给3个人理发,当其中一个人理到一定阶段需要调整或者定型的时候,他就转到另外一个客户去 修剪头发,依次类推,这样,他发现一天他可以理的人数比以前增多了,但是还会有一些后来的客户抱怨等待时间太长。
    后来,理发师打算招聘2名学徒帮助他一起干活,这样,他发现每天的理发效率增加了将近2倍,而且客户的等待时间明显也减少了许多。但是成本增多了,理发用具,洗发水,发工资,这让他觉得开个理发店也要精打细算:)
  • 转-LoadRunner中的web_submit_data和web_submit_form

    2011-08-27 11:23:23

    在LoadRunner中有两个常用函数:Web_submit_form和Web_submit_data,在群里有人问这两个函数有什么区别。为什么会有两个不同却功能相似的函数。区别在哪里。

    首先,从工具的角度来说,厂商推荐使用Web_submit_form函数,因为这个函数看起来更易用,需要关注的东西较少。但是,从个人的角度来 说,我推荐使用Web_submit_data函数。因为这个函数提供更多技术细节。在测试的过程中可控性更高。下面我就详细解释一下两个函数的工作机 制:

    首先看一下下面这段HTML代码

    Html代码
    1. <Form Action=login.asp Method=“POST”>  
    2. <input name=user value=“”>  
    3. <input name=password value=“”>  
    4. <input type=hidden name=sessionID value=15379>  
    5. </Form>  

     

     

    在录制的过程中,当打开这个页面的时候,这个页面会放在LR的Cache中,之后当我们输入了用户名、口令之后,点了一下提交。Browser会向LR Record Proxy发送一个提交请求,提交内容应该是这样的:

    Loadrunner代码
    1. POST login.asp HTTP/1.1  
    2. user=steve password=buba  
    3. sessionID=15379  

     

     

    这时候,LR会自动比较提交的内容和Cache的内容,首先它会比较提交的数据项和Cache中的数据项是否一致。页面中有三个输入域user、 password、sessionID,而提交的内容也有这三项数据,所以它认为提交数据使用了Cache中的页面,之后它会继续比较具体数据的值。它会 发现sessionID的值和Cache中的值是一样的。但是user和password的值不一样。

    这时候,Web_submit_form和Web_submit_data的区别就出现了:

    Loadrunner代码
    1. web_submit_form(”start",  
    2. ITEMDATA,  
    3. "name=user""value=steve", ENDITEM,  
    4. "name=password""value=bean", ENDITEM,  
    5. LAST);  

     

     

     

    Loadrunner代码
    1. web_submit_data(”start",  
    2. “Action=login.asp”,  
    3. “Method=POST”  
    4. ITEMDATA,  
    5. "name=user""value=steve", ENDITEM,  
    6. "name=password""value=bean", ENDITEM,  
    7. "name=sessionID""value=15379", ENDITEM,  
    8. LAST);  

     

     

    可以看到,Web_submit_form只提供了和Cache中有差别的数据,其余的数据会自动从Cache中取。而Web_submit_data则提供了所有的数据,不管Cache存在不存在Web_submit_data都是可以工作的。

    所以厂商会推荐使用Web_submit_form,因为它看起来更易用,甚至关联都不需要作,就能直接回放。但是这种情况只能对于简单系统适用。 对于一些银行或者移动的复杂系统来说,有时侯会对Cache作特殊操作,Web_submit_form有时侯就会报一些莫名其妙的错出来。而 Web_submit_data则跟Cache内容无关。稳定性和可控性都要比Web_submit_form要高很多。所以个人推荐尽量使用 Web_submit_data函数。  

        但是之前遇到过一个录制上传文件的脚本问题起初用了web_submit_data提交表单怎么都不成功(脚本回访通过,但是时间文件没有上传),改用web_submit_form后直接就成功了,到现在还没有分析出具体原因,慢慢学习吧!

  • 转-几个免费网站监测工具---有利于性能测试

    2011-08-27 11:22:21

    我租的服务器前段时间每隔一段时间总要挂一挂,所以每次出门的时候心里总是七上八下的,总挂念着服务器别在我出去的时候给挂了。于是时不时拿手机出来上一下看看是不是出问题了。累,且不及时,如果没有GPRS包月的话,那个流量费也比较可观的。

    于是我产生个想法:找个网站监测工具,然后配个移动的邮箱,这样监测发现问题后会发信给移动邮箱,然后移动通知。虽然139邮箱是否有这功能不知道,可是应该好像有的邮箱有类似功能。

    找到一些不错的网站监测工具,如果你也有类似需求,不妨试试:

    Site24×7– 这算是一个老牌的统计了,免费注册后可以体验半个月标准帐户,可以监测网站访问、DNS服务器、邮箱、网页分析等。15天后会降为免费帐户,仅能监测网站运行状态,且仅能监测2个网站、60分钟监测一次。出现问题会发电邮通知你。

    mon.itor.us– 免费工具,可以监控HTTP、HTTPS、FTP、SIP、TCP、UDP、IMAP、SMTP、POP3、PING、DNS等,你的网站出现问题会发信通知你。另外还可以在你的网页中加入统计代码,做为一个统计工具。

    SiteUptime– SiteUptime为站长们提供网站运行状态监测服务,免费用户可以监测一个网站,30或60分钟检查一次,可监测80(http)、21(ftp)、 25(smtp)、110(pop3)这4个端口,提供4台监测服务器供你选择(旧金山、芝加哥、纽约、伦敦),网站不能访问和恢复访问的时候会发送 Email通知你。

    WebPerform– WebPerform有中文版的,免费服务可监测一个网站,可选3个监测节点,当网站出现访问速度过慢或无法访问会发 Email给你警报。WebPerform自定义功能强大,你可以在查看你的网站24小时中的访问速度统计表,自己自定义发送Email警报的情况。

    有这几个工具,这样就可以放心外出了:)

  • 转-LR瓶颈

    2011-08-27 11:21:15

    下面我们来看一下

    首先我们要监视

    %processor time(processor_total):

    受的最大上限是

    %User time(processor_total):

    等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降

    低该值。

    %DPC time(processor_total):

    Processor:% Processor Time

    %Disk time(physicaldisk_total)

    的百分比。如果三个计数器都比较大,那么硬盘不是瓶颈。如果只有

    外两个都比较适中,硬盘可能会是瓶颈。在记录该计数器之前,请在

    行窗口中运行

    Availiable bytes(memory)

    则说明计算机上总的内存可能不足,或某程序没有释放内存。

    Context switch/sec(system): (

    的大小,你应该监视这三个计数器(包括上面的一个)。增加线程数可能会增加上下文切换

    次数,这样性能不会上升反而会下降。如果十个实例的上下文切换值非常高,就应该减小线

    程字节池的大小。

    %Disk reads/sec(physicaldisk_total):

    %Disk write/sec(physicaldisk_total):

    Page faults/sec:

    的影响。

    Pages per second:

    Working set:

    器有足够的空闲内存,页就会被留在工作集中,当自由内存少于一个特定的阈值时,页就会

    被清除出工作集。

    Avg.disk queue length:

    超过磁盘数的

    Average disk read/write queue length:

    Disk reads/(writes)/s:

    量。

    Average disk sec/read:

    Average disk sec/transfer:

    Bytes total/sec:

    可以用该计数器的值和目前网络的带宽比较

    Page read/sec:

    理页读取总数。由于物理

    更高效的查询或者改变数据库设计等方法,使开销减到最小。

    Page write/sec:

    1.

    如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下文切换

    (context switches/sec

    吞吐量降低并且

    下文切换次数过高

    从图的整体看

    switches/sec

    2.

    如果_______并且处理器的利用率%Processor

    time

    瓶颈

    %processor time

    经不能满足程序需要

    3.

    内存问题主要检查应用程序是否存在内存泄漏

    数器和

    应该通过一个长时间的

    图中可以看到该程序并不存在内存泄露的问题

    时候

  • 转-实际测试LR遇到问题27796 fail to connect to server 10060

    2011-08-27 11:16:48

    曾经遇到过一个问题,在一次性能测试过程中,使用http协议的多用户向服务器发送请求。设置了持续时间,出现错误 为:vuser_init.c(20): 错误 -27796: 连接服务器“localhost”失败: [10060] Connection timed out

    因为负载生成器的性能太好,发数据包特别快,服务器也响应特别快,从而导致负载生成器的机器的端口在没有 timeout之前就全部占满了。在全部占满后,就会出现上面的错误。执行netstat –na命令,可以看到打开了很多端口。所以就调整TCP的time out。即在最后一个端口还没有用到时,前面已经有端口在释放了。

    [b]官方的troubleshooting:[/b]
    查看工具的troubleshooting,如下:[code]Message Code 27796
    Failed to connect to server 'hostname';port_ld': 'reason'.
    Unable to connect to the specified server and port.
    Troubleshooting
    o      Try to address the reason provided for the connection failure.
    o      Try to access the application with a browser from the injector machine and from another machine (such as the recording machine).
    o      Check that you accurately specified the correct host name and port.
    o      Ping the host/port.
    o      Check if the server application you are trying to access is running.
    o      If you used a hostname, check if it was resolved to the correct address.
    o      Check if the server application is listening to the right port. [/code]均不是解决之道。

    [b]成功的解决方法:[/b]

    在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里,有如下两个键值:
    TcpTimedWaitDelay
    MaxUserPort
    1,这里的TcpTimedWaitDelay默认值应该中是30s,所以这里,把这个值调小为5s(按需要调整)。
    2,也可以把MaxUserPort调大(如果这个值不是最大值的话)。

    反复验证,问题解决。

    TcpTimedWaitDelay 值決定了 TCP/IP 必須經過多久,才能釋出已關閉的連線及重複使用它的資源。這個關閉和釋出的間隔稱為 TIME_WAIT 狀態,或是區段生命期限上限 (2MSL) 狀態的兩倍。在這段時間內,通往用戶端和伺服器的連線重新開啟的成本,比建立新的連線低。藉由縮減這個項目的值,TCP/IP 可以更快釋出已關閉的連線,提供更多資源給新的連線。如果執行中的應用程式需要快速釋出、建立新連線,或多個連線在 TIME_WAIT 狀態中造成通訊量太低,因而需要進行調整的話,請調整這個參數。

    預設值是 0xF0,它會將等待時間設為 240 秒(4 分鐘)。

    最小的建議值是 0x1E,它會將等待時間設為 30 秒。請利用這個程序來檢視或自訂您的值。

    啟 動 regedit 指令,瀏覽至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters 登錄次機碼,建立名稱為 TcpTimedWaitDelay 的新 REG_DWORD 值。
    將值設為十進位 30,也就是十六進位的 0x0000001e。這個值會將等待時間設為 30 秒。
    關閉登錄編輯器。
    停止並重新啟動系統。
    MaxUserPort
    MaxUserPort 值決定了當應用程式向系統要求可用的使用者埠時,TCP/IP 所能指派的最高埠號。如果您的系統報告建立 Socket 時,發生錯誤異常狀況,可能是匿名(短期)埠的數量不當所造成,當系統開啟大量的埠來建立 Web 服務、資料庫或其他遠端資源的連線時,尤其如此。

    或者:

    这事连接超时的意思,表示向服务器发出请求在规定时间内没有收到响应。是一个正常的报错,跟注册表没有关系。
    这是在runtime setting里能够设置的。在preferences里的options里有三项关于网络延时限制的设置值可以自行根据需求修改。
  • 转-使用LoadRunner 编写JAVA 测试脚本

    2011-08-27 11:14:02

    使用LoadRunner 编写JAVA 测试脚本

    发布: 2008-11-14 10:39 | 作者: chenxin9821 | 来源: 思步网

    以前在使用loadrunner 的过程中,基本很少关注过手动编写测试脚本,这也与手头工作有一定的关系,平时难以接触到这方面的测试类型。虽然这期间也看过,但是感觉当时的 Loadrunner对JAVA语言脚本的支持较弱,JDK还是1.1、1.2的版本,显然太不合时宜了,于是也就放弃了。     昨晚,在网上看了看Loadrunner8.1版本,已经支持到了JDK1.5版本,结合目前手头测试工作,觉得有必要细看一下。 要使得Loadrunner8.1版本能够支持JAVA语言脚本,以下几点需要注意: 1.JDK的版本必须是5.0(我机器上原先装的是JDK6.0,折腾了好长一段时间,总是报 ERROR loading javai.dll的错,最后没办法只能装5.0 ,Loadrunner对jdk的支持有点弱智)。设置好java 环境。 2.Loadrunner 要支持JAVA语言必须,安装一个补丁。( java_protocol_fixes_Feb_05 可以网上找一下,这儿没法上传)  打开virtual user generator ,新建java vuser,看一下run-time settings,java environment setting 设置 如下图  打开 java vuser的编辑界面 import lrapi.lr; public class Actions
    {     public int init() {
            return 0;
        }//end of init     public int action() {
            return 0;
        }//end of action     public int end() {
            return 0;
        }//end of end
    } 可以看到标准的java class 写法。 Actions 类包含三个方法:initactionend。 init       登录到服务器    Vuser 已初始化(已加载) action  客户端活动        Vuser 处于“正在运行”状态 end       注销过程          Vuser 完成或停止        这时候完全可以理解loadrunner如何执行java 测试脚本代码了,在Actions 类中调用测试java类,然后在脚本中需要的地方加上loadrunner自带的一些函数方法等(比如事务函数、命令行分析函数、信息性函数、运行时函 数),当然还能进行一些参数化的设置,最后在control上增加vuser数量(也就是增加线程)。        如果抛开Loadrunner,使用一些开源的unit工具,完全也能够实现loadrunner这些功能,只不过可能在监控方面,没有 loadrunner做的那么精致罢了。 做个小例子。
    • 写个测试java类
    public class  testjava
    {
        public static void main(String args[])
        {
            System.out.println("hello world");
        }
        public String getStr()
        {
            return "hello world";
        }
        public String getStr(String str)
        {
            return str;
        }
    }
    • 通过java Vuser调用测试java类
    /*
    * LoadRunner Java script. (Build: 754)
    *
    * Script. Description:
    *                     
    */ import lrapi.lr;
    import org.apache.log4j.*; public class Actions
    {
        static Logger logger = Logger.getLogger(Actions.class.getName());
        int i=10;     public int init() { //读取log4j属性文件
            PropertyConfigurator.configure("D:\\MyEclipse Enterprise Workbench 5.1.0 GA\\eclipse\\workspace\\testjava\\bin\\log4j.properties");
            return 0;
        }     public int action() {        lr.start_transaction("事务");
           testjava t=new testjava();//调用测试类
           lr.message( "获取返回值:"+   t.getStr("<NewParam>")); //NewParam是loadrunner参数化设置的参数            //设置集合点
               lr.rendezvous("集合点");
               //设置等待时间
               lr.think_time(2);
               lr.end_transaction("事务",lr.PASS);
               //检索运行 Vuser 的计算机的名称
               String my_host = lr.get_host_name( );
           lr.message( "计算机的名:"+  my_host+"  "+i);
               lr.log_message (lr.get_vuser_id() +" "+ t.getStr("<NewParam>"));        //lr.get_vuser_id  返回当前 Vuser 的 ID
           logger.info(lr.get_vuser_id() +" "+ t.getStr("<NewParam>"));
               lr.enable_redirection(true);            System.out.println("This is an informatory message…"); // 已重定向
              // System.err.println("This is an error message…"); // 已重定向            lr.enable_redirection(false);
               System.out.println("This is an informatory message…"); // 未重定向
              // System.err.println("This is an error message…"); // 未重定向         return 0;
        }     public int end() {
            return 0;
        }
    }
    • Vuser运行 log
    Virtual User Script. started
    Starting action vuser_init.
    Ending action vuser_init.
    Running Vuser...
    Starting iteration 1.
    Starting action Actions.
    Notify: Transaction "事务" started.
    获取返回值:1
    Rendezvous 集合点
    Notify: Transaction "事务" ended with "Pass" status (Duration: 0.0175).
    计算机的名:ms-599008241fcd  10
    -1 1
    System.out:  INFO (Actions.java:37) - -1 1
    Notify:
    System.out: This is an informatory message…                                                                                                                                                      Notify:
    Ending action Actions.
    Ending iteration 1.
    Ending Vuser...
    Starting action vuser_end.
    Ending action vuser_end.
    Vuser Terminated.
    • Control 运行 截图
    看到定义的“事务”。
    • log4j属性文件
    log4j.rootCategory=DEBUG, stdout,R
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=c:/log.txt
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=1
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n
    • 20个Vuser运行一次,查看一下log文件,可以看一下参数设置的效果
    2008 三月 02 18:06:43 INFO  Actions - 7 91
    2008 三月 02 18:06:43 INFO  Actions - 16 101
    2008 三月 02 18:06:43 INFO  Actions - 17 121
    2008 三月 02 18:06:43 INFO  Actions - 13 41
    2008 三月 02 18:06:43 INFO  Actions - 10 181
    2008 三月 02 18:06:43 INFO  Actions - 18 141
    2008 三月 02 18:06:43 INFO  Actions - 19 151
    2008 三月 02 18:06:43 INFO  Actions - 6 71
    2008 三月 02 18:06:43 INFO  Actions - 11 1
    2008 三月 02 18:06:43 INFO  Actions - 9 131
    2008 三月 02 18:06:43 INFO  Actions - 2 191
    2008 三月 02 18:06:43 INFO  Actions - 12 21
    2008 三月 02 18:06:43 INFO  Actions - 5 51
    2008 三月 02 18:06:43 INFO  Actions - 15 81
    2008 三月 02 18:06:43 INFO  Actions - 20 161
    2008 三月 02 18:06:43 INFO  Actions - 3 11
    2008 三月 02 18:06:43 INFO  Actions - 1 171
    2008 三月 02 18:06:43 INFO  Actions - 8 111
    2008 三月 02 18:06:43 INFO  Actions - 14 61
    2008 三月 02 18:06:43 INFO  Actions - 4 31
    loadrunner 提供的.NET JAVA等语言脚本支持,为测试的灵活性、多样性提供了极大的方便。
  • 浏览量、访问量

    2011-08-14 16:32:41

    浏览量:网站所有页面被点击的总次数。一个IP点击N次,按N次统计。

    • 从技术层面讲,指浏览器加载网页的次数总和。

    访问量:从来到网站到离开,算一次统计。你访问一个网站,离开后,再次重新访问,访问量按2次算。

    • 关掉浏览器,或直接关掉网站,算离开网站。(一次访问结束)
    • 如果一直没有关掉网站,访问网站的不同页面,算一次访问。
    • 一天内不同时间访问网站N次,算N次访问。

    PV:Page View 指的是以上的浏览量。很多时候,大家说的PV也指浏览量/访问量。比如本站:PV=8.7,说明平均每次访问,用户点击阅读了8.7页。

    绝对唯一访问者:(英文UV,Unique Visitor)如果你统计的是一天,那么一天内同一台只算一次。统计访问你网站的人数,而不是访问次数。

    • 从技术层面上讲,用Cookie 来确定绝对唯一访问者,而不是IP。
    • 办公室内N台电脑访问,虽然同一个IP,统计时,按N次算。
    • 同一个电脑访问,即使IP换了,但电脑没换,按一次算。

    以上统计,时间可以选择。

    比如,我统计近30天内,本站的绝对唯一访问者,不管某用户在这30天内访问了多少次,主要它用同一个电脑(保存着 Cookie),就只算一次。

  • web性能测试基本性能指标

    2011-08-14 12:51:23

    Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤:

    (1)客户发送请求

    (2)web server 接受到请求,进行处理;

    (3)web server 向DB获取数据;

    (4)web server生成用户的object(页面),返回给用户。给客户发送请求开始到最后一个字节的时间称为响应时间(第三步不包括在每次请求处理中)。

    1.事务(Transaction

    web性能测试中,一个事务表示一个从用户发送请求->web server接受到请求,进行处理-> web server DB获取数据->生成用户的object(页面),返回给用户的过程,一般的响应时间都是针对事务而言的。

    2.请求响应时间

    请求响应时间指的是从客户端发起的一个请求开始,到客户端接收到从服务器端返回的响应结束,这个过程所耗费的时间,在某些工具中,响应通常会称为“TTLB”,即"time to last byte",意思是从发起一个请求开始,到客户端接收到最后一个字节的响应所耗费的时间,响应时间的单位一般为或者毫秒。一个公式可以表示:响应时间=网络响应时间+应用程序响应时间。标准可参考国外的3/5/10原则:

    1)在3秒钟之内,页面给予用户响应并有所显示,可认为是“很不错的”;

    2)在3~5秒钟内,页面给予用户响应并有所显示,可认为是“好的”;

    3)在5~10秒钟内,页面给予用户响应并有所显示,可认为是“勉强接受的”;

    4)超过10秒就让人有点不耐烦了,用户很可能不会继续等待下去;

    3、事务响应时间

       事务可能由一系列请求组成,事务的响应时间主要是针对用户而言,属于宏观上的概念,是为了向用户说明业务响应时间而提出的.例如:跨行取款事务的响应时间就是由一系列的请求组成的.事务响应时间是直接衡量系统性能的参数.

    4.并发用户数

    并发一般分为2种情况。一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作,这种操作一般指做同一类型的业务。比如在信用卡审批业务中,一定数目的拥护在同一时刻对已经完成的审批业务进行提交;还有一种特例,即所有用户进行完全一样的 操作,例如在信用卡审批业务中,所有的用户可以一起申请业务,或者修改同一条记录。

      另外一种并发是广义范围的并发。这种并发与前一种并发的区别是,尽管多个用户对系统发出了请求或者进行了操作,但是这些请求或者操作可以是相同的,也可以是不同的。对整个系统而言,仍然是有很多用户同时对系统进行操作,因此也属于并发的范畴。

      可以看出,后一种并发是包含前一种并发的。而且后一种并发更接近用户的实际使用情况,因此对于大多数的系统,只有数量很少的用户进行严格意义上的并发。对于WEB性能测试而言,这2种并发情况一般都需要进行测试,通常做法是先进行严格意义上的并发测试。严格意义上的用户并发一般发生在使用比较频繁的模块中,尽管发生的概率不是很大,但是一旦发生性能问题,后果很可能是致命的。严格意义上的并发测试往往和功能测试关联起来,因为并发功能遇到异常通常都是程序问题,这种测试也是健壮性和稳定性测试的一部分。

    用户并发数量:关于用户并发的数量,有2种常见的错误观点。 一种错误观点是把并发用户数量理解为使用系统的全部用户的数量,理由是这些用户可能同时使用系统;还有一种比较接近正确的观点是把在线用户数量理解为并发用户数量。实际上在线用户也不一定会和其他用户发生并发,例如正在浏览网页的用户,对服务器没有任何影响,但是,在线用户数量是计算并发用户数量的主要依据之一。

    5.吞吐量

    指的是在一次性能测试过程中网络上传输的数据量的总和.吞吐量/传输时间,就是吞吐率.

    6、 TPStransaction per second

    每秒钟系统能够处理的交易或者事务的数量.它是衡量系统处理能力的重要指标.

    7、点击率

    每秒钟用户向WEB服务器提 交的HTTP请求数.这个指标是WEB应用特有的一个指标:WEB应用是"请求-响应"模式,用户发出一次申请,服务器就要处理一次,所以点击是WEB应用能够处理的交易的最小单位.如果把每次点击定义为一个交易,点击率和TPS就是一个概念.容易看出,点击率越大,对服务器的压力越大.点击率只是一个性能参考指标,重要的是分析点击时产生的影响。需要注意的是,这里的点击并非指鼠标的一次单击操作,因为在一次单击操作中,客户端可能向服务器发出多个 HTTP请求.

    8.资源利用率

    指的是对不同的系统资源的使用程度,例如服务器的CPU利用率,磁盘利用率等.资源利用率是分析系统性能指标进而改善性能的主要依据,因此是WEB性能测试工作的重点.

    资源利用率主要针对WEB服务器,操作系统,数据库服务器,网络等,是测试和分析瓶颈的主要参考.WEB性能测试中,更根据需要采集相应的参数进行分析。

    通用指标(指Web应用服务器、数据库服务器必需测试项)

    ?-g4piw*BF&@T128935

    指标51Testing软件测试网r!HA0HL|

    说明51Testing软件测试网H}1iT:j4P T

    ProcessorTime服务器CPU占用率,一般平均达到70%时,服务就接近饱和
    Memory Available Mbyte可用内存数,如果测试时发现内存有变化情况也要注意,如果是内存泄露则比较严重
    Physicsdisk Time物理磁盘读写时间情况

    lr@!GWAz|128935Web服务器指标51Testing软件测试网BHQBB'Q Sn

    指标

    'F-mOY1^128935

    说明

    +vH/Oa,_aByCW }128935
    Requests Per Second(Avg Rps)平均每秒钟响应次数=总请求时间 / 秒数
    Avg time to last byte per terstion (mstes)平均每秒业务脚本的迭代次数 ,有人会把上面那个混淆
    Successful Rounds成功的请求
    Failed Requests失败的请求
    Successful Hits成功的点击次数
    Failed Hits失败的点击次数
    Hits Per Second每秒点击次数
    Successful Hits Per Second每秒成功的点击次数
    Failed Hits Per Second每秒失败的点击次数
    Attempted Connections尝试链接数

    a0C9rn1X)Q128935数据库服务器性能指标

    RSPu9Z(O_(rn9|!w128935

    指标51Testing软件测试网K8],Ng.|9KmI

    说明51Testing软件测试网%S.?rR"^.j-R.a\

    User 0 Connections用户连接数,也就是数据库的连接数量
    Number of deadlocks数据库死锁
    Butter Cache hit数据库Cache的命中情况

    ^$]j(`6T Ro128935系统的瓶颈定义

    hf#k$t'g128935

    性能项

    m*pU5\M'c;S;|5[128935

    命令51Testing软件测试网$](jc{,\@ {|

    指标51Testing软件测试网 ^No5v4^v%@:D`

    CPU限制vmstat当%user+%sys超过80%时
    磁盘I/O限制Vmstat当%iowait超过40%(AIX4.3.3或更高版本)时
    应用磁盘限制Iostat当%tm_act超过70%时
    虚存空间少Lsps,-a当分页空间的活动率超过70%时
    换页限制Iostat, stat虚存逻辑卷%tm_act超过I/O(iostat)的30%,激活的虚存率超过CPU数量(vmstat)的10倍时
    系统失效Vmstat, sar页交换增大、CPU等待并运行队列
    51Testing软件测试网.k,g,_eo0wP

      稳定系统的资源状态51Testing软件测试网L(dGx;rQ\(B%S{ ji

    51Testing软件测试网X$Ya1Pa a+n w@f#p

    性能项51Testing软件测试网 ^ R zH0hS[O|.h

    资源51Testing软件测试网@vcLW| Yi

    评价51Testing软件测试网i5G U+t#L%g

    CPU占用率70%
    85%
    90%+很差
    磁盘I/0<30%
    <40%
    <50%+很差
    网络<30%带宽
    运行队列<2*CPU数量
    内存没有页交换
    每个CPU每秒10个页交换
    更多的页交换很差
    Y$~&pu?(z3vC128935

    /U1p+Q;w#Y2YyN(wa,\128935  通俗理解:

    3F*g{4n3KC128935

    4Y(Q}}5]U x+{ g128935  日访问量51Testing软件测试网@1\5z#`h*J.{,T1p

    51Testing软件测试网8HFx"l!fn5n1zL@+`A

      常用页面最大并发数51Testing软件测试网5^V4{M%[{

    51Testing软件测试网 l e YF?} BrvO

      同时在线人数51Testing软件测试网[4U3FoaU7P f#h!B

    51Testing软件测试网{j1AZb

      访问相应时间

    0]8vXc|K12893551Testing软件测试网8}V;L1b5Kl

      案例:51Testing软件测试网2sG+y*~yTe

    51Testing软件测试网-c7ua$bl,Ch

      最近公司一个项目,是个门户网站,需要做性能测试,根据项目特点定出了主要测试项和测试方案:

    K] X.g6S4~12893551Testing软件测试网V9?"i.s,Wv

      一种是测试几个常用页面能接受的最大并发数(用户名参数化,设置集合点策略)

    G;E3v E S12893551Testing软件测试网#Q,G X$Vj,n)F

      一种是测试服务器长时间压力下,用户能否正常操作(用户名参数化,迭代运行脚本)

    *t]nf a'e/e12893551Testing软件测试网%j ~ s+@1iN

       一种则需要测试服务器能否接受10万用户同时在线操作,如果是用IIS做应用服务器的话,单台可承受的最大并发数不可能达到10万级,那就必须要使用集 群,通过多台机器做负载均衡来实现;如果是用websphere之类的应用服务器的话,单台可承受的最大并发数可以达到10万级,但为性能考虑还是必须要 使用集群,通过多台机器做负载均衡来实现;通常有1个简单的计算方式,1个连接产生1个session,每个session在服务器上有个内存空间大小的 设置,在NT上是3M,那么10万并发就需要300G内存,当然实际使用中考虑其他程序也占用内存,所以准备的内存数量要求比这个还要多一些。还有10万个用户同时在线,跟10万个并发数是完全不同的2个概念。这个楼上已经说了。但如何做这个转换将10万个同时在线用户转换成多少个并发数呢?这就必须要有大量的历史日志信息来支撑了。系统日志需要有同时在线用户数量的日志信息,还需要有用户操作次数的日志信息,这2个数据的比例就是你同时在线用户转换到并发数的比例。另外根据经验统计,对于1个JAVA开发的WEB系 统(别的我没统计过,给不出数据),一般1台双CPU、2G内存的服务器上可支持的最大并发数不超过500个(这个状态下大部分操作都是超时报错而且服务 器很容易宕机,其实没什么实际意义),可正常使用(单步非大数据量操作等待时间不超过20秒)的最大并发数不超过300个。假设你的10万同时在线用户转 换的并发数是9000个,那么你最少需要这样的机器18台,建议不少于30台。当然,你要是买个大型服务器,里面装有200个CPU、256G的内存,千 兆光纤带宽,就算是10万个并发用户,那速度,也绝对是嗖嗖的。51Testing软件测试网DN To!Axc

    51Testing软件测试网;w kx\-IBr

      另外暴寒1下,光设置全部进入运行状态就需要接近6个小时。具体的可以拿1个系统来压一下看看,可能会出现以下情况:

    Y(mD Aj9v_12893551Testing软件测试网*{9A/f&vl{D

      1、服务器宕机;51Testing软件测试网'M J$~*P7hHK

    51Testing软件测试网kcZ6^Gqm

      2、客户端宕机;

    2Z%L,{SpZ@j128935

    Q|&Q~:H(S? zB5]128935  3、从某个时间开始服务器拒绝请求,客户端上显示的全是错误;

    aqcsn:d$]u'o128935

    1b&t+Nh e}!Q5Lp128935  4、勉强测试完成,但网络堵塞或测试结果显示时间非常长。假设客户端和服务器之间百兆带宽,百兆/10000=10K,那每个用户只能得到10K,这个速度接近1个64K的MODEM上网的速度;另外以上分析全都没考虑系统的后台,比如数据库、中间件等。

    O?m~ B%{[128935

    b8c l }Q)y$bn128935  1、服务器方面:上面说的那样的PC SERVER需要50台;51Testing软件测试网#U*Xr3C(`

    ,Wg{f:p;Gp){.r/w!]128935  2、网络方面:按每个用户50K,那至少5根百兆带宽独享,估计仅仅网络延迟就大概是秒一级的;51Testing软件测试网c,L_X"Gy)mO

    a,a fl:eE K4C Q128935  3、如果有数据库,至少是ORACLE,最好是SYSBASE,SQLSERVER是肯定顶不住的。数据库服务器至少需要10台4CPU、16G内存的机器;

    aBz3PA4FR7xX B128935

    U~C2C4m128935  4、如果有CORBA,那至少再准备10台4CPU、16G内存的机器;再加上负载均衡、防火墙、路由器和各种软件等,总之没个1000万的资金投入,肯定搞不定。51Testing软件测试网B"wN#?c

    -cC1qqy$[128935   这样的门户系统,由于有用户权限,所以并不象jackie所说大多是静态页面。但只要是多服务器的集群,那么我们就可以通过1台机器的测试结果来计算多 台机器集群后的负载能力的,最多额外考虑一下负载均衡和路由上的压力,比如带宽、速度、延迟等。但如果都是在1台机器上变化,那我们只能做一些指标上的计 算,可以从这些指标上简单判断一下是否不可行,比如10万并发用户却只有1根百兆带宽,那我们可以计算出每个用户只有1K带宽,这显然是不可行的。但实际 的结果还是需要测试了才知道,毕竟系统压力和用户数量不是线性变化的。

    0f5O-v!M X rr12893551Testing软件测试网j)t:eT!{D#c3X q

       这一类系统的普遍的成熟的使用,以及很多软件在方案设计后就能够大致估算出系统的性能特点,都导致了系统在软件性能方面调优的比例并不大(当然不完全排 除后期针对某些代码和配置进行优化后性能的进一步提高),更多的都是从硬件方面来考虑,比如增加内存、硬盘做RAID、增加带宽、甚至增加机器等。

    1d"e^V$]!b Je U/D12893551Testing软件测试网]I4IRYzy/[/Z

      网络技术中的10M 带宽指的是以位计算, 就是 10M bit /秒 ,而下载时的速度看到的是以字节(Byte)计算的,所以10M带宽换算成字节理论上最快下载速度为: 1.25 M Byte/秒!

  • 关于数据库死锁的检查方法

    2011-07-20 10:01:52

    关于数据库死锁的检查方法

    一、        数据库死锁的现象
    程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。

    二、        死锁的原理
    当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
    交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
    此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。

    三、        死锁的定位方法
    通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
    1)用dba用户执行以下语句

    select username, lockwait, status, machine, program
      from v$session
    where sid in (select session_id from v$locked_object)

    如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:

    Username:死锁语句所用的 数据库用户
    Lockwait:  死锁的 状态 ,如果 有内容表示被死锁
    Status:       状态 active表示被死锁
    Machine:   死锁语句 所在的机器
    Program:   产生死锁的语句主要 来自哪个应用程序

    2)用dba用户执行以下语句,可以查看到被死锁的语句。

    select sql_text
      from v$sql
    where hash_value in
           (select sql_hash_value
              from v$session
             where sid in (select session_id from v$locked_object))

    四、        死锁的解决方法
        一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
    能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
    经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

      1)查找死锁的进程:

    sqlplus "/as sysdba" (sys/change_on_install)
    SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
    l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
    FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

      2)kill掉这个死锁的进程:

      alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

      3)如果还不能解决:

    select pro.spid from v$session ses,
    v$process pro where ses.sid=XX and
    ses.paddr=pro.addr;

      其中sid用死锁的sid替换:

    exit
    ps -ef|grep spid

      其中spid是这个进程的进程号,kill掉这个Oracle进程。
  • 转-LoadRunner关于验证码的解决方案

    2011-07-07 20:18:23

    现在好多网站系统为了防范,恶意访问系统,在登陆口进行限制,使用验证码登陆。

      验证码是随机产生的,并且验证码在页面上显示为图片。此时想通过loadrunner直接获取服务器发送过来的参数,肯定是不可行的。

      在进行性能测试的时候,有两种办法进行此类系统的测试。

      1、将验证码暂时屏蔽,待完成性能测试后,在恢复。验证码屏蔽一定不会给性能测试带来影响,这是肯定的。

      2、如果要测试系统是在用的系统,屏蔽验证码会带来不安全因素,不能屏蔽验证码。遇到这个问题当然也有办法解决--添加一个页面将验证码的输出到页面,然后用loadrunner获取到。

      JSP为例:

      验证码页面(a.jsp

    <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
    <%!
    Color getRandColor(int fc,int bc)
    {//给定范围获得随机颜色
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
    }
    %>
    <%
    //设置页面不缓存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);

    // 在内存中创建图象
    int width=60, height=20;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // 获取图形上下文
    Graphics g = image.getGraphics();

    //生成随机类
    Random random = new Random();

    // 设定背景色
    g.setColor(getRandColor(200,250));
    g.fillRect(0, 0, width, height);

    //设定字体
    g.setFont(new Font("Times New Roman",Font.PLAIN,18));

    //画边框
    //g.setColor(new Color());
    //g.drawRect(0,0,width-1,height-1);

    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160,200));
    for (int i=0;i<300;i++)
    {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    int xl = random.nextInt(12);
    int yl = random.nextInt(12);
    g.drawLine(x,y,x+xl,y+yl);
    }

    // 取随机产生的认证码(4位数字)
    String sRand="";
    for (int i=0;i<4;i++){
    String rand=String.valueOf(random.nextInt(10));
    sRand+=rand;
    // 将认证码显示到图象中
    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    g.drawString(rand,13*i+6,16);
    }

    // 将认证码存入SESSION
    session.setAttribute("rand",sRand);
    System.out.println("---:"+sRand); //sRand就是随机数 验证码 ,把它放到session中,然后合成到图片中
    // 图象生效
    g.dispose();

    //out.clear();
    request.setAttribute("gzip", "false");

    // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());


    out.clear();
    out = pageContext.pushBody();

    %>

    将验证码jsp页面作为图片放到b.jsp页面中:

    <a href="c.jsp">c.jsp</a>

    <br>
    <br>
    <img src="a.jsp"/>

    <iframe. src="c.jsp"/>

      在iframe中放入的c.jsp页面就是 获取验证码的页面。

      这儿加了一个c.jsp 页面链接,主要是用在loadrunner录制脚本的时候,a.jsp 和c.jsp在B页面上加载的顺序不是有序的,因而C.JSP可能获取到的验证码为NULL。

      c.jsp

      Q<%=session.getAttribute("rand")%>Q

      在C.JSP页面上 在取得的验证码前后加上两个Q主要为了loadrunner能够捕获到这个验证码做的标记。

    下面我们看一下 loadrunner脚本:

    Action()
    {
        web_set_max_html_param_len("1024");
        web_url("b.jsp",
            "URL=http://10.10.129.99:8080/blank/b.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=",
            "Snapshot=t1.inf",
            "Mode=HTTP",
            LAST);

        web_concurrent_start(NULL);

        web_url("a.jsp",
            "URL=http://10.10.129.99:8080/blank/a.jsp",
            "Resource=1",
            "RecContentType=image/jpeg",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            LAST);
    /*
        web_url("c.jsp",
            "URL=http://10.10.129.99:8080/blank/c.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            "Snapshot=t2.inf",
            "Mode=HTTP",
            LAST);
    */
        web_concurrent_end(NULL);

    //获取C.JSP页面上的验证码

        web_reg_save_param("aaa",
            "LB/IC=Q",
            "RB/IC=Q",
            "Ord=1",
            "Search=body",
            LAST);

        web_url("c.jsp_2",
            "URL=http://10.10.129.99:8080/blank/c.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            "Snapshot=t3.inf",
            "Mode=HTTP",
            LAST);

    //打印出来 也可以通过loadrunner log日志设置查看 param
        lr_log_message("-------:%s", lr_eval_string("{aaa}"));
        return 0;
    }

      运行结果

      运行的时候 要把loadrunner的浏览器给关掉,否则lr的浏览器显示一下,相当于也做了一次请求。

901/512345>
Open Toolbar