Be A Final Tester

发布新日志

  • 如何避开积分浏览,阅读

    2011-12-30 13:57:39

    android 应用程序来了,目前基本都是免费的
    但是带来的问题是
    很多应用,你必须先下载一些软件,或者点击一些广告才能继续后面的操作
    怎么办呢?
     
    很简单~~~
     
    图片类的,直接把APK放到电脑上,然后重命名为RAR 解压,在\res\drawable-hdpi
    里面,就有这个应用的全部图片~
  • AutomationTest Framework

    2011-12-29 11:17:47

     
    ******************************
      非原创,纯粹是喜欢
    ******************************
    I am trying to do 2 things with monkey
    1. Execute a script. with a command like
    adb shell monkey -p MY_PACKAGE --setup scriptfile -f /sdcard/ mon_script1.txt 1
    where mon_script.txt contains a few touch commands. After I execute this, I see nothing happening on the screen. It even does not give me the "Number of events injected message". I have verified that my touch co-ordinates fall over actual UI elements.
    This is the script. file I am using
    tap 79 29 tap 100 100 tap 200 200 tap 300 300 quit
    2. Execute Monkey Network control to type commands individually. I start up monkey to listen to a port and use PuTTY to send commands. I get "OK" return messages, but nothing happens on the screen.
    Whenever I use monkey in the random mode, I see interaction on the screen. But I need to get one of the above 2 methods to work. I have seen the sources of monkey and nothing seems to be wrong. Has anyone used monkey in the above described way? If so, please tell me what I am doing wrong.
     
  • MonkeryRunner图片对比代码

    2011-11-21 10:56:24

    个人原创,转帖请注明出处,使用说明和注释都在代码中涵盖
     
    ************** picCompare.py
    from __future__ import division
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
    log=open("F:\\demo\\demo.txt","w")
    #this function used for pic compare
    #the variables is base-pic,compare-pic,pic-width,pic-high,pic similarity
    def picCompare(imageA,imageB,width,high,factor):
        i=0
        Rc=Gc=Bc=0
        Total=255*width*high/4
        while i<width:
            j=0
            while j<high:
                cc=imageA.getRawPixel(i,j)
                dd=imageB.getRawPixel(i,j)
                Rc=Rc+abs(cc[1]-dd[1])
                Gc=Gc+abs(cc[2]-dd[2])
                Bc=Bc+abs(cc[3]-dd[3])
                j=j+2
            i=i+2
        Rsub=Rc/Total
        Gsub=Gc/Total
        Bsub=Bc/Total
        picSame=1-(Rsub+Gsub+Bsub)/3
        if picSame>factor:
            return 1
        else:
            return 0
    **********测试脚本
    import sys
    sys.path.append("E:\\android-sdk-windows\\tools")
    import picCompare as COM
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
    log=open("F:\\demo\\demo.txt","w")
    imageA=MonkeyRunner.loadImageFromFile("F:\\demo\\sougou.png")
    #judge connection
    device = MonkeyRunner.waitForConnection()
    #
    imageB=device.takeSnapshot()
    imageB=imageB.getSubImage((20,320,60,60))
    if COM.picCompare(imageA,imageB,60,60,0.8):
        log.write("OK,the will do action Click\n")
        device.touch(20,320,"DOWN_AND_UP")
    else:
        imageB.writeToFile("F:\\demo\\errorSogou.png","png")
        log.write("couldn't find sogou item,please check")
    log.close()
     
     
    ******************************
    使用说明,andorid手机自动化测试过程中,如果UE能提前确定,则使用MonkeyRunner Recorder捕获全部的测试控件,
    然后通过图像对比,执行对应的Activity。
    这个是基于SeeTest基础上个人改编的,欢迎讨论~~
  • Google! why you update so slowly?

    2011-11-14 15:30:13

    最近一直在做android手机自动化,使用的是 SDK包里面带的工具,叫MonkeyRunner
     
    开始接触时候,很多人说这个工具只能做一点,入门很低,自己编译下api,也就30个,并且大部分还不知道杂用,慢慢的,深入一点,发现这只是一个框架的思想,终于,Google更新了,我们等来了LoadImageFromFile 和SameAs 以及easy.by.id初步一看,哇塞,齐了,结果这三个API中2个不能用 sameAs 用来比较两张图片是否一致,不知道Google为啥又办透明了,把思想很明显透漏给了我们,但是把实现给隐藏起来了 ,easy.by.id就更不能用了。其实用过Robotuim的都知道,这其实就是android开发的 R.java.id吗,也就是APK的全部控件ID,但是不能用,依然犹抱琵琶半遮面。
     
    再说GUI,android UI是基于ant的,没有所谓的GUI界面,神仙,这东西和苹果一个时代的产品吧,为啥苹果有interfaceBuilder,而我们却要开发者使用 draw9来适配呢?
    好歹产品做了三四年了吧,居然到现在没见那个牛人给出个好用的GUI开发工具!!!
     
    google,please tell me why?
  • 蛋疼的技术,蛋疼的测试

    2011-09-29 17:07:48

    蛋疼的技术,蛋疼的测试
                 ——学习的浅尝则止
     
        出于个人兴趣,最近一直在研究关于android手机的自动化测试,撇开技术不说,咱今天就说说那些蛋疼的微博
     
       1.google走了,没办法咱用百度,搜个android 自动化测试,刷刷刷的,哇靠,那么多成熟的模型,那么多实战例子,搞个试试
       2.出于对 QTP兄弟的认识,这次换个角度,了解下Monkey 和MonkeyRunner以及一直很高调的Robotium,过滤了那么多工具后,咱看看结果
       3.Monkey 生成系统伪随机事件,主要用来测性能和稳定性的,网上看帖某些仁兄说的是他们公司的测试需求要求跑5天不出crash. 我感觉这人都是神仙,伪随机事件,你跑5天,咋跑的,这次还真出了我的意料, 原本以为会像一套测试流程一样的组织出脚本,然后给个循环,最起码咱大概能知道点啥,结果呢,这东西就是最笨的Monkey,看过的最长的 一个脚本命令,也没超过500个字符。也就是
    adb shell monkey -p your.package.name -v 500
    神仙,靠这给你的APK安装包发500个事件?? 
       
      4.Monkeyrunner ,这东西关于介绍和对人家原话的翻译,网上大把大把的,真正的例子就一个 对计算器的测试,还有一个自称菜鸟写的那么一点总结,,其它的,你抄我,我转你,有个球意思
     
    对于Robotium 个人还在学,目前暂不评论
     
     
     
    说说这群鸟人,技术还真不咋么滴,会的那点别人上网也能搜到,这东西还贴自己脸上,当金子呢。。MD
    真正的出问题了,一个个都还是和QQ好友里面的隐身死人一样,偶尔出来诈尸,对你挑衅一下,然后抛个媚眼说,小子,你TM又上当了。
     
     
  • objective-C 中使用@Class和 #import区别

    2011-03-08 11:07:30

    We can import class declaration with #import:

    #import "SomeClass.h" 
    

    or declare with @class:

    @class SomeClass; 
    

    What's the difference and when we should use each of them?

     

    Answer

    "Import" links the header file it contains. Everything in the header, including property definitions, method declarations and any imports in the header are made available. Import provides the actual definitions to the linker.

    @class by contrast just tells the linker not to complain it has no definition for a class. It is a "contract" that you will provide a definition for the class at another point.

    Most often you use @class to prevent a circular import i.e. ClassA refers to ClassB so it imports ClassB.h in its own ClassA.h but ClassB also refers to ClassA so it imports ClassA.h in ClassB.h. Since the import statement imports the imports of a header, this causes the linker to enter an infinite loop.

    Moving the import to the implementation file (ClassA.m) prevents this but then the linker won't recognize ClassB when it occurs in ClassA.h. The @class ClassB; directive tells the linker that you will provide the header for ClassB later before it is actually used in code.

    当有两个类A,类B。在类A.h中#import类B.h。然后当我们写类B的时候,我们又需要用到类A的时候。使用类A.h包含在类B.h中,这样当在编译的时候,编译器就会重复、循环地在A.h 和B.h中来回的加载。此时,我们可以使用这样来避免出现这种情况。

    在类A.h中,我们可以包含类B.h,但在类B.h中当我们需要使用类A时,我们可以使用@class A,这只是告诉编译器,你为类B提供了一个类A的定义,其他的都没做。这样就不会存在重复循环调用了。

    其实,在类A.h中如果不会用到类B时,只是在A.m中用到类B时,你可以在A.m中#import B.h,只有当需要在类A.h中要用到类B时,才使用@class B.

    /****************/http://heidianfeng.blog.163.com/blog/static/618434562010710102435778/

    /*****/

    二者的区别在于:

    1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

    2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

    3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

    4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

    所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

    google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);

     

  • iphone上传图片到 web服务器代码实例

    2010-10-26 09:50:15

    googleCode:
    http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/


    flyBlog:
    http://www.flyblog.info/catprogramming/392.html
  • 从 SQL数据库导入到 SQLITE

    2010-10-22 12:11:33

    使用sqliteDev从 SQL数据库导入到 SQLITE的注意事项:
    数据类型,SQLITE针对中文仅有 TEXT类型,而SQL里面有 char nchar varchar nvachar....等一系列,测试发现,

    所有的变长字符类型,导入SQLITE数据库后出现乱码。而使用char()导入后,中文会增补一系列空格,使用数据库时候,还需在 SQLITE下调用replace去除空格

  • 搜索的困惑

    2010-08-09 11:09:47

    最近再搞iphone
    后台使用的是sqlite3,开发过程中发现sqlite3没有日期这种数据类型,然后就打算google下,看别人如何处理的
    哎!漫天的 sqlite3日期函数,打开看看,都是一个作者的,并且该作者使用过程中故意屏蔽了一个bug
    内容如下


    select datetime('2010-8-5')
    发现sqlite查询结果为空,
    但是你使用
    select datetime('2010-08-05')
    查询结果为  2010-08-05

    作为便捷的轻量级数据库,目前还存在这么简陋的bug。。。。。哎。。。

    可悲的原创sqlite3日期函数作者,可悲的路人。。。。可悲的我的项目 

    使用于我项目的 sqlite sql
    第一个给只有一位的月份加'0'
    第二个给只有一位的日期加'0'

    update airdailyreport set reportdate=(substr(reportdate,1,5) )||'0'||( substr(reportdate,6,8) )

    where  like((select substr(reportdate,7,1)),'-')=1


    update airdailyreport set reportdate=(substr(reportdate,1,8) )||'0'||( substr(reportdate,9,2) )

    where like(substr(reportdate,10,1),'')=1

  • 快速去掉导入sql某字段的空格

    2010-08-09 10:51:09

    使用replace函数去掉字段内容包含的空格,例子如下: 
    update [表名] set [字段名]=replace([字段名],' ','') where 条件
  • uitableView加载自定义单元格及指定高度

    2010-07-21 16:50:07

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 71;

    }

    71为自定义的cell高度

  • core-plot使用指南

    2010-06-22 11:13:05

    *********

    *********

    iphone chart 开源框架core plot使用指南

    参考网址

    http://www.switchonthecode.com/tutorials/using-core-plot-in-an-iphone-application


    1。首先下载core plot源码

    2。给新建项目添加coreplot框架,从core-plot源码中得framework文件夹中,拖拽CorePlot-CocoaTouch.xcodeproj 到新项目中,系统给出添加提示,使用默认,直接点击add按钮

    3。打开新添加的框架,找到libCorePlot-CocoaTouch.a,将其放置在Targets-->Link Binary With Libraries目录下

    4。识别框架,Targets下面,选择新建的项目文件,右键选择“Get Info”,进入“General”选项卡,添加CorePlot-CocoaTouch as a direct dependency

    5。进入“Build”选项卡,,使用搜索,找到 "Header Search Paths" ,这里给出core-plot源码-->framework目录的绝对位置,找到"Other Linker Flags",设置为-ObjC

    6。添加QuartzCore框架,Xcode中选择framework,右键点击Add-->Existing Frameworks…,选择 QuartzCore

    7。添加#import "CorePlot-CocoaTouch.h"头文件。

  • iphone开发真机调试免99$办法,适用3。1。3

    2010-06-22 09:52:14

    **********
    以下内容,经本人测试 越狱3.1.3通过
    **********


    Xcode环境配置


    1。修改SDKSettings.Plist文件,

    打开 目录Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk

    (备份SDKSettings.Plist文件  )

    打开 SDKSettings.Plist文件 找到<key>CODE_SIGNING_REQUIRED</key><string>YES</string><key>ENTITLEMENTS_REQUIRED</key><string>YES</string>修改其值YES为NO.


    2。修改platform. Info.plist文件

    打开目录/Developer/Platforms/iPhoneOS.platform/

    (备份 info.plist文件)

    找到<key>CODE_SIGN_CONTEXT_CLASS</key><string>XCiPhoneOSCodeSignContext</string>

    修改<string>XCiPhoneOSCodeSignContext</string><string>XCCodeSignContext</string>

    注意:一共需要3处修改,实际中我得xcode仅修改了2处


    3。打开终端控制器,输入以下命令

    cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
    dd if=iPhoneOS\ Build\ System\ Support f=working bs=500 count=255
    printf "\xc3\x26\x00\x00" >> working
    dd if=iPhoneOS\ Build\ System\ Support f=working bs=1 skip=127504 seek=127504
    /bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
    /bin/mv working iPhoneOS\ Build\ System\ Support
    chmod a+x iPhoneOS\ Build\ System\ Support


    注意命令过程中得提示、覆盖等操作(建议逐行输入 )

    4。打开xcode,修改menu-->Project-->Edit Project Settings找到 “Code Signing Identity”和子菜单,

    修改其键值为 "don't code sign"


    5。打开终端控制器,逐行输入一下命令

    mkdir /Developer/iphoneentitlements312
    cd /Developer/iphoneentitlements312
    curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
    mv gen_entitlements.txt gen_entitlements.py
    chmod 777 gen_entitlements.py


    6。对于每一个新建项目都需要这个操作,打开menu-->Project-->NewBuildPhase -->New Run Script. Buid Phase

    拷贝以下代码进去

    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
    /Developer/iphoneentitlements312/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
    codesign -f -s "iPhone developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
    fi

    7。打开xcode选择编译环境,使用 device--debug编译,出现提示请插入设备,则已经编译生成所需app


    参考资料:http://www.alexwhittemore.com/?p=354



  • QTP内容汇总

    2009-10-14 18:46:13

    使用工具搞定B/S系统,琢磨了一个多礼拜,几乎问题都是对象识别引起的,顺手写了点笔记

    QTP几个常用方法:

    方法1:调用FireEvent"ondblclick",界面操作为点击界面一个图标,然后弹出选择框,针对选中对象双击以完成选择操作。脚本录制过程中,仅抛出一个Image("Distract_2").Click,而针对弹出的选择窗体及鼠标双击选中事件均未触发。实现方法:捕获弹出对象,调用该对应的FireEvent"ondblclick"完成脚本录制

    方法2:使用drag,drop完成webedit属性修改,测试过程中需要验证非法输入给程序造成的影响,如果某步骤无法完成,需重复验证,调用Webedit.dragWebedit.drop和适当循环来完成针对某个字段的失败测试

    方法3:获取参数化列表行数和当前参数行数

    rowcount = DataTable.GetSheet("Global").GetRowCount

    datatable.SetCurrentRow(curent_line) 跳转取参行数

    方法4:结果中生成对应信息,针对非法结果的打印,而不是QTP报错后异常退出

    Reporter.ReportEvent 2, "There are " &rowcount, "rows in the data sheet."其中 &rowcount为要输出到报表中的参数

    方法5:针对Jquery模块,QTP无法识别抛出一个webelement,我们系统中这块是一个树状目录的字典表,QTP录制过程仅记录一个图标,脚本编辑过程中,解决最下一级的目录使用问题才是这个模块自动化的前提,同样是手动添加对象到对象仓库,然后考虑如果展开树形目录,.Click就可以,然后继续添加下级对象,继续.click

    是否可以遍历说有子节点,然后递归调用是个待解决问题

    方法6:添加调用对象,使用对象仓库寻找要添加的对应对象

    方法7:参数化对应实例

    方法8:完成对下拉列表框的参数化

    测试过程中下拉列表框不可能是唯一值,测试过程中如何使其不断的变化满足测试需求,想到使用随机函数

    随机函数里面取值情况取决于下拉列表框的长度

    Browser("Browser").Page("Page").Frame("Frame").WebList("WebList").Click

    itemlenth=browser("").Page("").Frame(" ").WebList("").GetROProperty("items count")

    UnitNum=randomnumber(0, itemlenth-1)

    Msgbox unitNum

    Browser("Browser").Page("Page").Frame("Frame").WebList("WebList").Select"#"&UnitNum

    Wait 1

    方法9

    Browser("Browser").Page("Page").Frame("TB_iframeContent413").WebRadioGroup("display").Select "OptionA"

    Select 属性包含默认值:defaultA-Z

    方法10:获取下拉列表框的长度

    itemlenth=browser("").Page("").Frame(" ").WebList("").GetROProperty("items count")

    random=randomnumber(0,itemlenth)

    方法11:如果10中调用了ITEMS count 则需要在对象识别中加入,否则对象无法唯一

    Items count 给出的是个数,而取值时候从零开始,所以调用时候应减1

    方法12:对象与赋值

    这是对异常的一种处理方法,异常要求,1固定长度,如果长度不够给出提示

    2.判断重复,如果数据重复也要给出提示

    这里给出一种重复的解决方法

    num=11111110000002********变量赋一个初始值

    For i=0 to 5********循环次数

    Browser("").Page("").Frame("").WebButton("添加").Click

    flag=true

    Browser("").Page("").Frame("").WebEdit("").Set  num

    While flag

    If Browser("").Page("").Frame("").WebElement("重复").Exist Then

           num =num+1

           Browser("").Page("").Frame("").WebEdit("").Set num

           else

           flag=false

    End If

    Wend

    Next

    方法13:变长下拉列表的对象识别

    测试过程中下拉列表每取一次值,就自动去掉你所取的值,针对这种下拉列表的识别,应该在对应定义里面去掉ITEMS COUNT属性

     

  • 浅谈WEB测试

    2009-09-14 12:27:51

    针对基于WEB应用测试,如何做到全面覆盖,根据个人经验,总结如下几点
    1.流程测试,基于C/S架构下更强调为功能测试,但是针对B/S架构的系统,一般完成特定的功能,是通过一系列的流程来完成的。针对流程,主要测试方向分为通过测试和失败测试,失败测试用来验证工作流程的规范化,比如执行某个流程的前提是上一个流程操作完毕,如果没有完毕给出对应提示,或者禁灰。失败测试还包括完成某个业务流过程中后而通过测试,就必须熟悉业务流程,整个业务功能流程如何实现,这里需要具备的技能就是考虑绘制流程图,在流程图清晰的情况下,对比开发设计根据测试大纲法快速设计测试用例。
    2.链接测试,这主要是考虑页面链接指向的问题,比较常用的工具有testlink、linkbot等,快速的查找出页面的无效链接,链接测试里面需要考虑一个问题就是业务流程的测试覆盖,针对GIS的应用往往存在该问题。多系统环境下,经纬度的设计及链接提示就属于该测试范围
    3.数据库测试,主要是后台数据,基于web应用的数据,最明显的特点就是频繁的数据操作,及数据流向。而就个人经验来看,针对数据库的操作和Web页面应用之间的关系只要有以下几种,1.打开页面针对对应数据表插入数据,这些数据可以是操作数据,也可以是系统使用数据,操作数据包括增删改查,而默认数据包括读取对应信息列表,获取相关信息等。2.打开页面后,未执行任何操作,离开页面,查看对应系统表是否插入数据3.对于有时间戳维护的表,执行更新操作如何维护,维护后数据流走向问题4.锁测试,将在并发测试时候考虑
    4.cookie测试,这个东西需要根据系统特点来考虑是否执行,cookie测试包含的主要是不同权限用户登录后关闭或者退出系统,系统响应情况,cookie失效设置是否有效。举个例子说明下,某系统区分管理员和用户权限,使用管理员用户登录系统后退出,此时使用用户登录,执行特定功能点,页面自动跳转为管理员。这种问题的产生一般都和cookie有关。
    5.并发测试,引用于涌书里面的例子,多用户购物,当该商品仅有一件时候,并发操作,查看系统的反应情况?这个方面的在基于B/S系统里面有很多,这时候你必须明白数据库是如何处理的,才能把问题弄清楚,比如同一台测试机打开2个IE,前后定位在同一页面,然后执行特定操作,比如删除已删除的数据,系统是给出找不到对象呢?还是友好提示或者直接报错呢 ?
    6.测试用例设计,针对测试用例的设计,也是B/S比较繁琐的,你必须考虑局部和整体的关系,关注单个功能实现的前提,更多的情况要考虑某功能失效后对后面的影响,因此我推荐基于流程的大纲法,如果某个操作包含对数据库的操作,最好是用例后面涵盖对数据库的操作,某表,执行了什么操作。
    7.config文件测试,config文件包含什么信息,更改设置后是否完成对应应用。尤其是针对权限分配及错误登录次数配置的测试
    8.关于禁用脚本调试的问题,IE高级设置里面有功能项--禁用脚本调试(IE),及显示有好HTTP信息,这个问题是否属于考虑范围也是根据公司实际的,但是作为测试人员,最好测试时候把这2个选项给取消掉,另外针对FLEX或者SILVERLIGHT的应用,最好安装DEBUG版本的FLASH插件
    9.用户体验测试(猴子测试)针对迭代开发,大部分测试人员完成多个版本测试后,对系统的业务功能就非常了解,工作重点随之转移为业务功能中可能的情况,系统如何更好的实现。而针对非基于工作流的测试就耗时较小,甚至于漏测。而从研发人员角度考虑,这些他们也不怎么关心,此时就很需要用户体验测试。
    10.安全测试,SQL或者JS注入,这些东西目前尚未涉及,就不介绍了。
  • 跟我学调优------浅谈瓶颈定位

    2009-08-05 18:11:13

      搜遍大部分论坛 关于结果分析 都是IT163那点文章,或者是 段老师 那副经典的图 ,但是结果分析里面能显示什么,通过分析能给项目的开发(调优)提供多少帮助,怎么优化用户体验,这个问题能深入多细

     领导要的是 给研发写一份有指导意义的调优报告。。。里面要包含 系统问题,服务器资源使用问题,越细越好

    结合段老师那张图 ,就是 LR测试结果里面 事务的响应时间包括了 网络时间和服务器时间 可以肯定的告诉你们,这个是可以实现的

    目前我的理解就是  firstbuffertime里面的网络时间 就是 段老师图里面的网络时间,服务器响应时间与之对应就是A1+A2+A3(+N1+N2),

    为什么我要强调 段老师的图,当我们区分出来了各个时间,就马上 知道系统目前的瓶颈在那里。。。。

    而怎么去实现 每个具体的时间点 综合了N多好友的意见,主要在以下几点

    结果分析中 ,我们要关注 页面下载时间细分图---(pagedownloadbreakdown)从这里 很清除的关注 2个时间

    firstbuffertime 和receivetime

    针对firstbuffertime 和receivetime我里面有文章详细介绍 这里就不啰嗦了

    分析 : 1.fristbuffertime占页面时间比较长,receivetime却很少 ,经常遇到这个情况 这时候 打开第一次缓冲细分图,查看里面的网络时间和 服务器时间  ,一般都是服务器时间较长,如果网络时间长,直接定位网络问题

    服务器时间长,也就是 A1+A2+A3比较长,初步判定服务器有问题 ,然后细化,查看页面组件大小图-----细分你关注的事务

    此时查看页面组件大小,针对组件,很容易知道 静态组件和数据组件,页面组件比较大,考虑页面压缩,数据组件比较大,继续返回查看该数据组件的下载时间细分,如果接收时间比较短 ,就可以初步定位问题不是在数据库服务器,而是在应用服务器处理上 。

    而如果数据组件的下载时间比较大该情况目前没有遇到----******不做分析

    2.firstbuffertime 占页面比较少 ,receivetime比较大, 有2种可能,一种是返回的数据量比较大(一般都是这样),另外一种网络问题。这种问题也最好定位,通过页面细分图一般就能快速找到

    3。关于A2, 这个我问过ZEE,他说可以监控,并且给了我关于orancle的监控SQL

    但是我们用的MS SQL, 我使用的是 profile,别人说有相关计数器(偶不知道,你要知道告诉我 ) 测试结果分析

    是重新跟踪对应的功能,获取 A2

     

    ******************今天就到这。。

     

  • [论坛] 结果分析的困惑,孰来回答?

    2009-08-04 13:05:19

    结果分析-------疑惑


    某本书里面介绍了 一个 限于3层架构的DB服务器和web服务器不在同一台机子上的响应时间分析

    a.JPG

    时间划分的很细 ,我不否认这张图宏观上带给大家的意义,这里只说下几点困惑

    后面测试结果 里面有first buffertime 和receive time,从定义上看
    Firstbuffertime 显示从客户端发出请求到 客户端收到来自服务器的第一次缓冲为止
      其中又包含了 网络时间和服务器时间,
    Receivetime  显示客户端从服务器收到最后一个字节并完成下载所用的时间

    困惑一 : firstbuffertime+receivetime==图
    中介绍的响应时间  ?

    困惑二: 结果分析图表中 具体的那张图或者那类图 能分析 出 A1,A2,A3?以及 N2,N3,
    如果不能,或者说 N2,N3很小,我们 结果分析只能获得的是 A1+A2+A3+N2+N3?
    困惑三: firstbuffertime  中的网络时间 和  上图中 那段时间对应 ?或者是压根没关系
                                                            服务器时间和 上图中那段时间对应 ?…..
    困惑四:如果 LR结果分析 ,我们只能知道的是 firstbuffertime  ,和receiveTime,对于应用程序的问题是定位 web服务器还是 DB服务器我们要看的又是结果分析里面的那几个图呢?   
    这些东西一直没理的很细,但是 实践起来发现如果这些不理细,对于我的性能调优 几乎没一点用处 ,还望 大家多讨论。。。。。。。

    [ 本帖最后由 love_yebin 于 2009-8-4 10:54 编辑 ]
  • 详解firstBuffertime

    2009-07-17 08:47:47

    详解第一次缓冲时间

    测试结果分析过程中,经常遇到第一次缓冲时间FirstBufferTime,并且发现大部分系统的响应时间也都浪费在了这里,再给研发解释这个问题时候,又不能拿FirstBufferTime直接给研发说,抽时间整理了下,希望对大家有用

    以下资料来自 LR帮助手册:

    定义:第一次缓冲时间细分图显示成功从Web服务器返回的第一次缓冲之前的这一段时间内,每个网页组件的相关服务器/网络时间(以秒为单位)

    网络时间:从发送第一个http请求那一刻直到收到确认为止,所经过的平均时间

    服务器时间:从收到初始http请求确认(通常为get)直到成功收到来自Web服务器的第一次缓冲为止,所经过的平均时间。

    注意:要从客户端测定服务器时间,因此发送初始HTTP请求到发送第一次缓冲这一段时间内网络性能发生变化,则网络时间可能会影响此度量,因此所显示的服务器时间是一个估计值,可能不太精确

     

     

    如果细心看了后面的注意,很多人就明白了,所有关于FirstBufferTime时间的度量都是来自客户端的。至于帮助手册里面的不太精确,还有这个网络时间和服务器时间如何计算,我分析了下,个人观点如下:

    首先要了解http传输,这个大叔以前发过相关资料,这里推荐个网址http://www.cnpaf.net/Class/HTTP/200408/83.html

    里面有个形象的举例,就是电话订货,到送货上门,

    这里拿图讲例子;

     

     上图类似于http链接 请求响应模式,其中 很明显

    网络时间=N1+N2+N3

    响应时间=R1+R2

    而根据 LR 结果分析定义发现

    网络时间=N1+R1+N2

    响应时间=R2+R3

    O(_)O

    怎么解释呢 N1过程为建立链接过程,就是客户端给服务器端发送请求说,我要取什么东西,R1为服务器响应时间,响应结果只是收到,然后经过N2传输给客户端,OK 链接建立,但是服务器响应还没结束,要准备客户端所索取的数据,所以继续响应,(此时对http来说,客户端处于等待接收状态),然后把结果传输给客户端,这就是N3时间

     

    LR在计算结果时候 R1 N3进行了抵消,所以给出来的只是近似值

     

     

     

     

  • web服务器和应用服务器的区别

    2009-07-06 13:21:31

    这个是 kernel给的资料

    .区别:
    web
    服务器可以解析(handles)http协议。当web服务器接收到一个http请求(request),会返回一个http响应 (response),例如送回一个html页面。为了处理一个请求(request)web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如cgi脚本,jsp(javaserver pages)脚本,servletsasp(active server pages)脚本,服务器端(server-side)javascript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个html的响应(response)来让浏览器可以浏览。
      要知道,web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求 (request)的程序(译者注:服务器端脚本)web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing)数据库连接(database connectivity)和消息(messaging)等功能。

      虽然web服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability),例如负载平衡(load balancing),缓冲(caching)。集群特征(clusteringfeatures)经常被误认为仅仅是应用程序服务器专有的特征。

      应用程序服务器(the application server)

      根据我们的定义,作为应用程序服务器,它通过各种协议,可以包括http,把商业逻辑暴露给(expose)客户端应用程序。web服务器主要是处理向浏览器发送html以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法 (或过程语言中的一个函数)一样。

      应用程序服务器的客户端(包含有图形用户界面(gui))可能会运行在一台pc、一个web服务器或者甚至是其它的应用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻辑(program logic)。正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态html,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。

      在大多数情形下,应用程序服务器是通过组件(component)的应用程序接口(api)把商业逻辑暴露(expose)(给客户端应用程序)的,例如基于j2ee(java 2 platform enterprise edition)应用程序服务器的ejb(enterprise javabean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括安全(security),事务处理(transaction processing),资源池(resource pooling),和消息(messaging)。就象web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。

      一个例子

      例如,设想一个在线商店(网站)提供实时定价(real-time pricing)和有效性(availability)信息。这个站点(site)很可能会提供一个表单(form)让你来选择产品。当你提交查询 (query)后,网站会进行查找(lookup)并把结果内嵌在html页面中返回。网站可以有很多种方式来实现这种功能。我要介绍一个不使用应用程序服务器的情景和一个使用应用程序服务器的情景。观察一下这两中情景的不同会有助于你了解应用程序服务器的功能。

      情景1:不带应用程序服务器的web服务器

      在此种情景下,一个web服务器独立提供在线商店的功能。web服务器获得你的请求(request),然后发送给服务器端(server- side)可以处理请求(request)的程序。此程序从数据库或文本文件(flat file,译者注:flat file是指没有特殊格式的非二进制的文件,如propertiesxml文件等)中查找定价信息。一旦找到,服务器端(server-side)程序把结果信息表示成(formulate)html形式,最后web服务器把会它发送到你的web浏览器。

      简而言之,web服务器只是简单的通过响应(response)html页面来处理http请求(request)

      情景2:带应用程序服务器的web服务器

      情景2和情景1相同的是web服务器还是把响应(response)的产生委托(delegates)给脚本(译者注:服务器端(server -side)程序)。然而,你可以把查找定价的商业逻辑(business logic)放到应用程序服务器上。由于这种变化,此脚本只是简单的调用应用程序服务器的查找服务(lookup service),而不是已经知道如何查找数据然后表示为(formulate)一个响应(response)。这时当该脚本程序产生html响应(response)时就可以使用该服务的返回结果了。

      在此情景中,应用程序服务器提供(serves)了用于查询产品的定价信息的商业逻辑。(服务器的)这种功能(functionality)没有指出有关显示和客户端如何使用此信息的细节,相反客户端和应用程序服务器只是来回传送数据。当有客户端调用应用程序服务器的查找服务(lookup service)时,此服务只是简单的查找并返回结果给客户端。

      通过从响应产生(response-generating)html的代码中分离出来,在应用程序之中该定价(查找)逻辑的可重用性更强了。其他的客户端,例如收款机,也可以调用同样的服务(service)来作为一个店员给客户结帐。相反,在情景1中的定价查找服务是不可重用的因为信息内嵌在 查看(616) 评论(1) 收藏 分享 管理

  • 性能测试的一些基本概念

    2009-07-06 13:15:52


    ZEE 总结的

    ********************************

    性能指标的基本概念

    吞吐量/处理能力处理能力又叫吞吐量,指的是单位时间内处理的客户端请求数量。通常情况下,吞吐量用请求数/秒 Or 页面数/秒来衡量。从业务角度看,吞吐量也可以用访问人数/天Or页面访问量/天来衡量。
     
       负载:负载分为客户端负载和端负载客户端。负载的通俗解释就是有多少个用户在同时使用系统。负载的通俗解释就是有多少个请求同时到达了服务器端,要求服务器 进行处理。例如,某个网站当前有10000个人在线访问,从他们的客户端层面看过去,这个负载就是客户端负载,为10000.若某个网站当前有10000 个人在线访问,某一时刻,从他们的客户端同时发出了1000个页面的请求到服务器,从服务器端层面看过去,这个负载就是服务器端负载,为1000.响应时 间响应时间是可以判断一个被测应用系统是否存在性能瓶颈的最直观的要素。例如,在执行完性能后,发现某个交易的“平均响应时间”为8秒,超过了预先确定下 来的性能指标“该交易的性能指标为平均响应时间要小于等于3秒”。此时,就可以认为被测应用系统存在性能瓶颈了,要利用一定的手段去探查被测应用系统中哪 个地方引起了系统的处理效率低以及低的原因了。响应时间一般包括最大响应时间和平均响应时间,响应时间包括网络上的传输时间,WEB服务器上处理时间、 APP服务器上的处理时间、DB服务器上的处理时间,响应时间不包括浏览器上的内容显示时间。

     
       同时在线用户对于一个网站来讲,当一个用户登录到该网站的首页后,开始在该网站上进行各种操作,包括浏览网页、检索内容、提交表单等,这个过程中的用户 称为在线用户。若同一时间点或同一个时间段内,有很多这样的用户在访问该网站,这些用户统称为该网站的同时在线用户。同时在线用户的另一层理解是,将应用 系统整体看作是一个黑盒子,从用户的客户端层面看向系统,总共有多少个人在使用它。当进行性能测试时,如果你使用的是同时在线用户,则可以称之为同时在线 负载。
     
      超级并发用户对于一个网站来讲,可能存在WEB服务器、应用服务器、数据库服务器三个层次,而用户所使用的浏览器是在最外面 的客户端层面。如果某个时间点或时间段内,共有1000个用户同时在线,他们进行着各种各样的操作,而某个时间点上可能存在10个左右的用户同时进行了一 个或多个操作,导致WEB服务器同时接收到了10个左右的交易请求,我们称这个10个左右的用户为超级并发用户。当进行性能测试时,如果你使用的是超级并 发用户,则可以称之为超级并发负载。
     
      性能测试脚本脚本是用负载模拟工具开发出来的。脚本是一些代码的组合体,它用代码来实现用户对 应用系统的操作。例如,你在一个网站上访问首页、输入用户名和密码后点击登录按钮进行登录,这是用户对应用系统的两步操作内容,在脚本中则包含了实现这两 个操作步骤的代码。如果你要模拟10000个用户的负载,这10000个用户中50%进行首页的访问、20%进行注册、20%进行查询、10%进行某个页 面的浏览,则你需要制作5个脚本,分别是首页访问脚本、注册脚本、查询脚本、页面浏览脚本。
    信息来源"岁月联盟"

     
       事务事务是脚本的一个特性,每个事务都包含开始事务和结束事务。事务用来衡量脚本中一行代码或多行代码的执行所耗费的时间。你可以将开始事务放置在脚本 中某行代码的前面,将结束事务放置在该行代码的后面,在该脚本的虚拟用户运行时,这个事务将衡量该行代码的执行花费了多长时间。
     
      交 易交易分为业务层面和技术层面两种定义。业务层面交易是指完成一次完整的业务操作,例如进行一次取款、查询操作。技术层面的交易是指进行一次应用程序至应 用程序、或者应用程序至数据库的系统操作。一般的一笔业务交易由多笔技术交易组成,根据业务交易的复杂度和系统应用架构的不同,其比例大致为 1:2-1:10. TPS与HPS TPS (Transactions Per Second)是估算应用系统性能的重要依据。其意义是应用系统每秒钟处理完成的交易数量,尤其是交易类系统。一般的,评价系统性能均以每秒钟完成的技术 交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。依据经验,应用系统的处理能力一般要求在10-100左右。不同应用系统的TPS 有着十分大的差别,一般需要通过性能测试进行准确估算。当系统没有达到性能瓶颈时,TPS随着负载的增加呈近似线性增长,当接近性能瓶颈时出现拐点;如果 系统健壮性较好,在到达性能瓶颈后,TPS基本保持水平,不会再随着负载的增加而有显著增长;而如果系统存在比较严重的性能问题,当到达性能瓶颈 后,TPS会出现明显的下降趋势。HPS:(Hits per Second)每秒点击次数,是指在一秒钟的时间内用户对Web页面的链接、提交按钮等点击总和它一般和TPS成正比关系,是B/S系统中非常重要的性能 指标之一。 [内容来自"岁月联盟"]
     
      TPS可以有多种衡量单位, 在进行性能测试的业务模型分析时使用,例如:(1)在税务系统中,可以用“系统每个月要处理10万用户的业务操作”,这里的TPS用企业数/月来衡量; (2)在税务系统中,也可以用“系统在第七天的8个小时内要处理4万用户的业务操作”,这里的TPS用企业数/天来衡量;(3)在税务系统中,也可以用“ 系统在第七天的10点到11点之间要处理1.2万用户的3种缴税交易操作,即3.6万次缴税交易操作”,这里的TPS用交易数/小时来衡量;(4)在税务 系统中,也可以用“系统在第七天的10点到11点之间要处理1.2万用户的3种缴税交易操作,即3.6万次缴税交易操作,每次缴税交易要从客户端向服务器 发送平均10次HTTP请求,即36万次HTTP请求操作”,这里的TPS用请求数/小时来衡量。
     
      HPS是用来衡量很多用户使用客户端进行操作,向服务器发送请求的效率。我们认为HPS表现的是最终用户的整体行为,是衡量在线负载程度的一个指标。而TPS表现的是服务器端的程序行为,是衡量服务器处理能力高低的一个主要指标。
     
      例如:HPS=“点击次数/秒”;TPS=“处理事务数/秒”,HPS与TPS没有绝对的关系。
     
       性能测试实现的准确性在进行了正确的性能测试分析后,获得了正确的性能测试需求,从而使用性能测试工具开发相应的性能测试脚本、开发相应的性能测试场 景、在性能测试脚本中利用性能测试数据、在性能测试脚本中设置相应的思考时间、在性能测试场景中设置运行的参数等,以期能利用自动化的性能测试工具模拟现 实中大量用户同时访问被测系统的情形。即,如果性能测试工具操作不当,将会导致无法准确的实现“模拟实际情况”的目标。例如,某些性能测试工程师在使用性 能测试工具时不懂得利用“检查点”这个功能,从而无法发现在性能测试执行过程中大量虚拟用户甚至没有登陆到系统中的严重问题,仍然认为性能测试执行效果良 好,被测系统性能没有问题。 [信息来源"岁月联盟"]
     
      Web服务 器和APP服务器通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方 法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多来为应用程序提供 (serves)商业逻辑(business logic)。Web服务器(Web Server)Web服务器可以解析(handles)HTTP。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应 (response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片, 进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(Server Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)scrīpt,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本) 的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。要知道,Web服务器的 代理模型(delegation model)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求 (request)的程序(译者注:服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响 应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing),数据库连接(database connectivity)和消息(messaging)等功能。虽然Web服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略 (strategies)来实现容错性(fault tolerance)和可扩展性(scalability),例如负载平衡(load balancing),缓冲(caching)。集群特征(clustering—features)经常被误认为仅仅是应用程序服务器专有的特征。
    信息来源"岁月联盟"

     
       应用程序服务器(The Application Server)根据我们的定义,作为应用程序服务器,它通过各种,可以包括HTTP,把商业逻辑暴露给(expose)客户端应用程序。Web服务器主要 是处理向浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法 (或过程语言中的一个函数)一样。应用程序服务器的客户端(包含有图形用户界面(GUI)的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应 用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻辑 (program logic)。 正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态HTML,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。在 大多数情形下,应用程序服务器是通过组件(component)的应用程序接口(API)把商业逻辑暴露(expose)(给客户端应用程序)的,例如基 于J2EE(Java 2 Platform, Enterprise Edition)应用程序服务器的EJB(Enterprise JavaBean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括(security),事务处理(transaction processing),资源池(resource pooling), 和消息(messaging)。就象Web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。 例如,设想一个在线商店(网站)提供实时定价(real-time pricing)和有效性(availability)信息。这个站点(site)很可能会提供一个表单(form)让你来选择产品。当你提交查询 (query)后,网站会进行查找(lookup)并把结果内嵌在HTML页面中返回。网站可以有很多种方式来实现这种功能。我要介绍一个不使用应用程序 服务器的情景和一个使用应用程序服务器的情景。观察一下这两中情景的不同会有助于你了解应用程序服务器的功能。 [本文来自"岁月联盟"]
     
       情景1:不带应用程序服务器的Web服务器在此种情景下,一个Web服务器独立提供在线商店的功能。Web服务器获得你的请求(request),然后 发送给服务器端(server-side)可以处理请求(request)的程序。此程序从数据库或文本文件(flat file,译者注:flat file是指没有特殊格式的非二进制的文件,如properties和XML文件等)中查找定价信息。一旦找到,服务器端(server-side)程序 把结果信息表示成(formulate)HTML形式,最后Web服务器把会它发送到你的Web浏览器。简而言之,Web服务器只是简单的通过响应 (response)HTML页面来处理HTTP请求(request)。
     
      情景2:带应用程序服务器的Web服务器情景2和情景1 相同的是Web服务器还是把响应(response)的产生委托(delegates)给脚本(译者注:服务器端(server-side)程序)。然 而,你可以把查找定价的商业逻辑(business logic)放到应用程序服务器上。由于这种变化,此脚本只是简单的调用应用程序服务器的查找服务(lookup service),而不是已经知道如何查找数据然后表示为(formulate)一个响应(response)。 这时当该脚本程序产生HTML响应(response)时就可以使用该服务的返回结果了。在此情景中,应用程序服务器提供(serves)了用于查询产品 的定价信息的商业逻辑。(服务器的)这种功能(functionality)没有指出有关显示和客户端如何使用此信息的细节,相反客户端和应用程序服务器 只是来回传送数据。当有客户端调用应用程序服务器的查找服务(lookup service)时,此服务只是简单的查找并返回结果给客户端。通过从响应产生(response-generating)HTML的代码中分离出来,在 应用程序之中该定价(查找)逻辑的可重用性更强了。其他的客户端,例如收款机,也可以调用同样的服务(service)来作为一个店员给客户结帐。相反, 在情景1中的定价查找服务是不可重用的因为信息内嵌在HTML页中了。总而言之,在情景2的模型中,在Web服务器通过回应HTML页面来处理HTTP请 求(request),而应用程序服务器则是通过处理定价和有效性(availability)请求(request)来提供应用程序逻辑的。
    资源来自"岁月联盟"

     
       警告(Caveats) 现在,XML Web Services已经使应用程序服务器和Web服务器的界线混淆了。通过传送一个XML有效载荷(payload)给服务器,Web服务器现在可以处理数 据和响应(response)的能力与以前的应用程序服务器同样多了。另外,现在大多数应用程序服务器也包含了Web服务器,这就意味着可以把Web服务 器当作是应用程序服务器的一个子集(subset)。虽然应用程序服务器包含了Web服务器的功能,但是开发者很少把应用程序服务器部署(deploy) 成这种功能(capacity)(译者注:这种功能是指既有应用程序服务器的功能又有Web服务器的功能)。相反,如果需要,他们通常会把Web服务器独 立配置,和应用程序服务器一前一后。这种功能的分离有助于提高性能(简单的Web请求(request)就不会影响应用程序服务器了),分开配置(专门的 Web服务器,集群(clustering)等等),而且给最佳产品的选取留有余地。
     
      性能瓶颈性能瓶颈实际上就是一个软件的性能缺陷,最通俗的理解“性能瓶颈”。
     
      (1)硬件上的性能瓶颈主要指的是CPU、RAM方面的问题。例如,在进行软件需求分析、概要设计时,确定了在数据库服务器上需要6个CPU、12G内存,但是在测试时,发现CPU的持续利用率超过95%,这时可以认为在硬件上出现了性能瓶颈。 本文来自"岁月联盟"
     
       (2)应用软件上的性能瓶颈一般指的是应用服务器、WEB服务器等应用软件,还包括数据库系统。例如,在WEBLogic平台上配置了JDBC连接池的 参数,最大连接数为50,最小连接数为5,增加量为10.在测试时发现,当负载增加时,现有的连接数不足,系统会动态生成10个新的连接数,这样导致了交 易处理的响应时间大大的增加。这时可以认为在应用软件上出现了性能瓶颈。
     
      (3)应用程序上的性能瓶颈,一般指的是开发人员新开发出 来的应用程序。例如,用Java或者C开发出来的部署在应用服务器上用于用户交易请求处理的应用程序。例如,某个开发员开发了一个缴费处理程序,在测试时 发现,这个缴费处理程序在处理用户发过来的并发缴费请求时,只能串行处理,无法并行处理,导致缴费交易的处理响应时间非常长,这时可以认为在应用程序上出 现了性能瓶颈。
     
      (4)操作系统上的性能瓶颈,一般指的是、Unix、Linux这些操作系统。例如,在windows系统中,虚拟 内存设置的不合理,都指定为C驱提供虚拟内存,在测试时发现当出现物理内存不足时,虚拟内存的效果非常不理想,导致交易的响应时间大大增加。这时可以认为 在操作系统上出现了性能瓶颈。
     
      (5)上的性能瓶颈,一般指的是、动态负载均衡器、机等设备。例如,在动态负载均衡器上设置了动态分 发负载的机制,当发现某个应用服务器上的硬件资源已经到达极限时,动态负载均衡器将后续的交易请求发送到其它负载较轻的应用服务器上。在测试时发现,动态 负载均衡机制没有起到相应的作用,这时可以认为在上出现了性能瓶颈。
271/212>
Open Toolbar