我的地盘我做主! 博客:http://tester2test.cnblogs.com/   msn:win_soft@163.com

发布新日志

  • 量体裁衣性能测试在企业中的应用

    2010-04-02 21:34:06

  • 杀死指定进程名称的小VBS

    2010-04-02 21:34:06

  • [原创]结构在Loadrunner中的应用

    2010-04-02 21:34:06

  • 《软件性能测试与LoadRunner实战》网上订购问题

    2010-04-02 21:34:06

  • 于涌为您解答测试方面的问题

    2010-04-02 21:34:06

  • LoadRunner 脚本语言认识

    2010-04-02 21:34:06

  • 一个文件重复生成的小工具[附源码和可执行文件]

    2010-04-02 21:34:06

  • 曹向志老师新书《软件测试项目实战:技术·流程·管理·实践

    2010-04-02 21:34:06

  • 我的第二本书--《精通软件性能测试与LoadRunner实战》内容介绍

    2010-04-02 21:34:06

  • LoadRunner 脚本语言认识

    2009-09-29 00:28:44

    版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
    以下内容选自本人作品:《精通软件性能测试与LoadRunner实战》,11月份即将出版,敬请关注!
     
        很多准备做性能测试工程师的朋友,经常会问我:“于老师,您说做性能测试工程师需要有编程基础吗?”。我也总是非常坚定的对问我这个问题的同志们回答道:“非常需要!”。做过几个性能测试项目的同志们,应该都清楚,很多情况下,性能测试是不能通过简单的脚本录制,回放来完成任务的。在很多种情况下,都需要性能测试工程师自行编写脚本,这时如果您没有语言基础,让您来做这样的事情是非常困难的。当然,如果由于性能测试工程师水平较差,编写出来的脚本本身就存在业务错误,存在内存泄漏等问题的时候,性能测试的过程和结果也必将是不可以信赖的,所以性能测试工程师有编程基础是非常必要的,也是必须的。
    下面这段脚本是在第3章,录制Tomcat 5.5.11自带的一个小程序numguess的脚本,该小程序主要是一个非常简易的猜数字游戏。
    #include "web_api.h"
     
    Action()
    {
           lr_rendezvous("集合点");
     
           lr_start_transaction("执行时间");
           web_url("numguess.jsp"
                  "URL=http//localhost8080/jsp-examples/num/numguess.jsp"
                  "Resource=0"
                  "RecContentType=text/html"
                  "Referer="
                  "Snapshot=t1.inf"
                  "Mode=HTML"
                  LAST);
     
           web_submit_form("numguess.jsp_2"
                  "Snapshot=t2.inf"
                  ITEMDATA
                  "Name=guess" "Value=2" ENDITEM
                  LAST);
           lr_end_transaction("执行时间" LR_AUTO);
     
           return 0;
    }
       细心的同志们,也许已经发现了一些问题,比如:“#include "web_api.h”、“{}”、“return 0;”,这些内容是不是和C语言的语法非常类似呢?
    事实上,LoadRunner 支持多种协议,您在编写脚本的时候,可以根据不同的应用,选择适合的协议。同时,您可以选择“Java Vuser”、“Javascript. Vuser”、“Microsoft .NET”、“VB Vuser”、“VB Script. Vuser”等协议进行相应语言的脚本的编写。在进行“WebHTTP/HTML)”等协议编写的时候,脚本的默认语法规则都是按照C语言的语法规则,当然您也可以选择“Java Vuser”用Java语言实现同样功能的脚本。

    本文出自 “测试者家园” 博客,转载请与作者联系!



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:纪念孔子诞辰Doodle 登上52个不同国家和地区的Google首页
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/09/20/1570609.html
  • [原创]结构在Loadrunner中的应用

    2009-09-29 00:28:44

    注:非授权,请勿转载 

     

    在实际工作中,很多情况我们需要将不同类型的数据组织起来一起应用,比如:学校在期末考试结束后,通常都要进行学生成绩的填报和查询工作。一个一年级小学生的信息通常包括:姓名、学号、性别、年龄、语文成绩、数学成绩等。姓名、性别是一个字符类型的数据,而年龄、学号为整数类型,语文成绩、数学成绩通常都为单精度浮点类型数据。我们知道不同类型的数据是不能放到同一个数组里面的,那么在C语言中是否有方法将这些不同数据类别的数据组织到一起呢?回答是:“有,可以用结构来处理这种问题。”,接下来,就让我们来了解一下,什么叫结构。“结构”是一种构造类型,它是由若干“成员”组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型。通常,一个结构的一般形式为:

    struct 结构名

       {成员表列};

    成员表列,由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

    类型说明符 成员名;

    现在,让我们一起来给学生来定义一个“结构”

    struct student

    {

        int num; //学号

        char name[20];      //姓名

        char sex[2];    //性别

           int age;        //年龄

        float chinesescore; //语文成绩

           float mathscore;     //数学成绩

    };

    上面我们定义了一个名称为“student”的结构,它包含了,学号、姓名、性别、年龄、语文成绩和数学成绩信息。

    那么如何应用结构,在LoadRunner中应用结构的示例脚本如下:

    struct student

    {

        int num; //学号

        char name[8]; //姓名

           int age;        //年龄

        char sex[2];    //性别

        float chinesescore; //语文成绩

           float mathscore;     //数学成绩

    };

     

    Action()

    {  //为结构数组赋前2个结构数组元素值

           struct student stu[3]={{101,"孙悟空",30,"",100.00,100.00},

                                                 {102,"沙和尚",28,"",99.00,99.00},};

           struct student stu1={103,"白骨精",99,""}; //为结构变量stu1赋部分数据

           int i;

     

           stu1.chinesescore=90.50;      //stu1赋语文成绩

           stu1.mathscore=89.00;         //stu1赋数学成绩

     

           stu[2]=stu1;    //stu1变量赋给数组元素stu[2]

     

           for (i=0;i<=2;i++) {

                  lr_output_message("-----------------------------");

                  lr_output_message("%d个学生信息:",i+1);

                  lr_output_message("学号=%d",stu[i].num);

                  lr_output_message("姓名=%s",stu[i].name);

                  lr_output_message("性别=%s",stu[i].sex);

                  lr_output_message("年龄=%d",stu[i].age);

                  lr_output_message("语文成绩=%.2f",stu[i].chinesescore);

                  lr_output_message("数学成绩=%.2f",stu[i].mathscore);

                  lr_output_message("-----------------------------");

           }

     

          

           return 0;

    }

    上面脚本的输出内容为:

    Running Vuser...

    Starting iteration 1.

    Starting action Action.

    Action.c(24): -----------------------------

    Action.c(25): 1个学生信息:

    Action.c(26): 学号=101

    Action.c(27): 姓名=孙悟空

    Action.c(28): 性别=

    Action.c(29): 年龄=30

    Action.c(30): 语文成绩=100.00

    Action.c(31): 数学成绩=100.00

    Action.c(32): -----------------------------

    Action.c(24): -----------------------------

    Action.c(25): 2个学生信息:

    Action.c(26): 学号=102

    Action.c(27): 姓名=沙和尚

    Action.c(28): 性别=

    Action.c(29): 年龄=28

    Action.c(30): 语文成绩=99.00

    Action.c(31): 数学成绩=99.00

    Action.c(32): -----------------------------

    Action.c(24): -----------------------------

    Action.c(25): 3个学生信息:

    Action.c(26): 学号=103

    Action.c(27): 姓名=白骨精

    Action.c(28): 性别=

    Action.c(29): 年龄=99

    Action.c(30): 语文成绩=90.50

    Action.c(31): 数学成绩=89.00

    Action.c(32): -----------------------------

    Ending action Action.

    Ending iteration 1.

    Ending Vuser...

    当然,为了我们引用结构方便,您可以应用类型定义符“typedef”将“struct student”命名成简洁的、明了的名称。C语言允许由用户自己定义类型说明符,即:类型定义符“typedef”,允许由用户为数据类型取“别名”。上面的结构脚本,我们可以用“typedef”实现同样的功能。

    typedef struct student

    {

        int num; //学号

        char name[8]; //姓名

           int age;        //年龄

        char sex[2];    //性别

        float chinesescore; //语文成绩

           float mathscore;     //数学成绩

    } STU;

     

    Action()

    {     //为结构数组赋前2个结构数组元素值

           STU stu[3]={{101,"孙悟空",30,"",100.00,100.00},

                                                 {102,"沙和尚",28,"",99.00,99.00},};

           STU stu1={103,"白骨精",99,""};//为结构变量stu1赋部分数据

           int i;

     

           stu1.chinesescore=90.50;      //stu1赋语文成绩

           stu1.mathscore=89.00;         //stu1赋数学成绩

     

           stu[2]=stu1;    //stu1变量赋给数组元素stu[2]

     

           for (i=0;i<=2;i++) {

                  lr_output_message("-----------------------------");

                  lr_output_message("%d个学生信息:",i+1);

                  lr_output_message("学号=%d",stu[i].num);

                  lr_output_message("姓名=%s",stu[i].name);

                  lr_output_message("性别=%s",stu[i].sex);

                  lr_output_message("年龄=%d",stu[i].age);

                  lr_output_message("语文成绩=%.2f",stu[i].chinesescore);

                  lr_output_message("数学成绩=%.2f",stu[i].mathscore);

                  lr_output_message("-----------------------------");

           }

     

          

           return 0;

    }

    请大家注意黑体字部分,应用“typedef”后,您会发现在定义结构变量的时候,我们省略了“struct student”而用自定义的符号“STU”来声明相应变量即可,非常方便。还有一点,不知道您注意到没有,就是我们在定义的时候书写了这样的语句“STU stu[3]”,如果您在Delphi等语言中书写,它会提示您书写错误的,原因是这些语言是不区分大小写的,而在C语言中是区分大小写的,“STU”和“stu”分别代表两个不同的内容。



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:微软免费防病毒软件将于本周二发布
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/05/21/1486695.html
  • 杀死指定进程名称的小VBS

    2009-09-29 00:28:44

    以下是一小段杀死指定进程名字的小vbs,希望对大家有帮助。
     
     
    Function KillProc(strProcName)
    On Error Resume Next
     Set bjWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
     Set arrProcesses = objWMIService.ExecQuery( "select * from win32_process where Name ='"&strProcName&"'" )
     For Each proccess In arrProcesses
      proccess.Terminate 0
     Next
    End Function


    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:中国联通计划年内推出谷歌手机
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/05/14/1457089.html
  • 面试后您该做的事情

    2009-09-29 00:28:44

      许多求职者只留意面试时的礼仪,忽略了应聘后的善后工作,可事实上,面试结束并不意味着求职过程的完结。求职者不应该袖手以待聘用通知的到来,有些事情您还必须加以注意。
     
    写信表示感谢为了加深招聘人员对您的印象,增加求职成功的可能性,面试后的两三天内,您最好给招聘人员打个电话或写信表示感谢。感谢电话要简短,最好不要超过3分钟;感谢信要简洁,最好不超过一页纸。感谢信的开头应提及您的姓名及简单情况,以及面试的时间,并对招聘人员表示感谢。感谢信的中间部分要重申您对该公司、该职位的兴趣,增加一些对求职成功有用的新内容。感谢信的结尾可以表示您对自己的信心,以及为公司的发展壮大做贡献的决心。
     
    不要过于急切的打听面试结果,在一般情况下,每次面试结束后,招聘主管人员都要进行讨论和投票,然后送人事部门汇总,最后确定录用人选,这个阶段可能多则需要几周、几个月,少则需要三五天的时间。求职者在这段时间内一定要耐心等候消息。
     
    如果您同时向几家公司求职,在一次面试结束后,则要注意调整自己的心情,准备全身心投入到第二家面试的考验当中。因为,在没有接到聘用通知之前,面试结果还是个未知数,您不应该放弃其他机会,即使同时获得几家招聘单位的录用通知,您在有所准备的情况下,也可以从优选择。
     
    一般来说,如果您在面试的两周后,或主考官许诺的时间之后还没有收到对方的答复时,就应该写信或打电话给招聘单位,询问面试结果。
     
    谁也无法保证应聘时每次都会成功,如果您在应聘时失败了,也不要气馁,这一次失败了,还有下一次,有的时候还存在因为您要工资高于企业所能够接受的范围,企业不得不忍痛舍弃选择您,这种情况您就更不能灰心失望了,就业机会不只一个。“失败是成功之母”,关键是必须总结经验教训,找出失败的真正原因,并针对这些不足重新做准备,以谋求下一次面试成功。



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:新浪分众合并大限将至
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/05/06/1450358.html
  • DDR2与DDR的区别

    2009-09-29 00:28:44

    1、延迟问题:

        从上表可以看出,在同等核心频率下,DDR2的实际工作频率是DDR的两倍。这得益于DDR2内存拥有两倍于标准DDR内存的4BIT预读取能力。换句话说,虽然DDR2和DDR一样,都采用了在时钟的上升延和下降延同时进行数据传输的基本方式,但DDR2拥有两倍于DDR的预读取系统命令数据的能力。也就是说,在同样100MHz的工作频率下,DDR的实际频率为200MHz,而DDR2则可以达到400MHz。

        这样也就出现了另一个问题:在同等工作频率的DDR和DDR2内存中,后者的内存延时要慢于前者。举例来说,DDR 200和DDR2-400具有相同的延迟,而后者具有高一倍的带宽。实际上,DDR2-400和DDR 400具有相同的带宽,它们都是3.2GB/s,但是DDR400的核心工作频率是200MHz,而DDR2-400的核心工作频率是100MHz,也就是说DDR2-400的延迟要高于DDR400。

    2、封装和发热量:
        DDR2内存技术最大的突破点其实不在于用户们所认为的两倍于DDR的传输能力,而是在采用更低发热量、更低功耗的情况下,DDR2可以获得更快的频率提升,突破标准DDR的400MHZ限制。
        DDR内存通常采用TSOP芯片封装形式,这种封装形式可以很好的工作在200MHz上,当频率更高时,它过长的管脚就会产生很高的阻抗和寄生电容,这会影响它的稳定性和频率提升的难度。这也就是DDR的核心频率很难突破275MHZ的原因。而DDR2内存均采用FBGA封装形式。不同于目前广泛应用的TSOP封装形式,FBGA封装提供了更好的电气性能与散热性,为DDR2内存的稳定工作与未来频率的发展提供了良好的保障。
        DDR2内存采用1.8V电压,相对于DDR标准的2.5V,降低了不少,从而提供了明显的更小的功耗与更小的发热量,这一点的变化是意义重大的。

    DDR2采用的新技术:

        除了以上所说的区别外,DDR2还引入了三项新的技术,它们是OCD、ODT和Post CAS。
        OCD(Off-Chip Driver):也就是所谓的离线驱动调整,DDR II通过OCD可以提高信号的完整性。DDR II通过调整上拉(pull-up)/下拉(pull-down)的电阻值使两者电压相等。使用OCD通过减少DQ-DQS的倾斜来提高信号的完整性;通过控制电压来提高信号品质。
        ODT:ODT是内建核心的终结电阻器。我们知道使用DDR SDRAM的主板上面为了防止数据线终端反射信号需要大量的终结电阻。它大大增加了主板的制造成本。实际上,不同的内存模组对终结电路的要求是不一样的,终结电阻的大小决定了数据线的信号比和反射率,终结电阻小则数据线信号反射低但是信噪比也较低;终结电阻高,则数据线的信噪比高,但是信号反射也会增加。因此主板上的终结电阻并不能非常好的匹配内存模组,还会在一定程度上影响信号品质。DDR2可以根据自已的特点内建合适的终结电阻,这样可以保证最佳的信号波形。使用DDR2不但可以降低主板成本,还得到了最佳的信号品质,这是DDR不能比拟的。

        Post CAS:它是为了提高DDR II内存的利用效率而设定的。在Post CAS操作中,CAS信号(读写/命令)能够被插到RAS信号后面的一个时钟周期,CAS命令可以在附加延迟(Additive Latency)后面保持有效。原来的tRCD(RAS到CAS和延迟)被AL(Additive Latency)所取代,AL可以在0,1,2,3,4中进行设置。由于CAS信号放在了RAS信号后面一个时钟周期,因此ACT和CAS信号永远也不会产生碰撞冲突。

        总的来说,DDR2采用了诸多的新技术,改善了DDR的诸多不足,虽然它目前有成本高、延迟慢能诸多不足,但相信随着技术的不断提高和完善,这些问题终将得到解决。
    DDR2技术规格

        DDR2内存起始频率将从DDR内存最高标准频率400Mhz开始,现已定义可以生产的频率支持到533Mhz到667Mhz,标准工作频率工作频率分别是200/266/333MHz,工作电压为1.8V。DDR2采用全新定义的240 PIN DIMM接口标准,完全不兼容于现有DDR的184PIN DIMM接口标准,这就意味着,现有所有DDR标准接口的主板,无法使用DDR2内存。这将成为DDR2内存标准普及的一大障碍,幸而INTEL下一代平台将完整支持240PIN的DDR2接口,给DDR2在2005年的普及打下了基础。

        相信大家都已经看见,市面上已经推出多款采用DDR2显存的显卡产品。然而,应用再显卡上的DDR2内存生产标准与方式是与桌面系统应用上的DDR2技术截然不同的,再次篇文章暂不作详细分辨,不过大家要清楚为什么显卡上已经可以大量应用而桌面系统还不行。

        DDR2内存技术相对于上一代标准DDR技术,用简单明了的方式来说,虽然DDR2和DDR一样,采用了在时钟的上升延和下降延同时进行数据传输的基本方式,但是最大的区别在于,DDR2内存可进行4bit预读取.两倍于标准DDR内存的2BIT预读取,这就意味着,DDR2拥有两倍于DDR的预读系统命令数据的能力,众看官时看到此处,是否已经明白了什么,认为为此,DDR2则简单的获得两倍于DDR的完整的数据传输能力。那么笔者告诉您,DDR2 400Mhz 同样命名为PC3200,请继续看下去,为什么呢?

        DDR2内存技术最大的突破点其实不在于看官们所认为的两倍于DDR的传输能力,而是,在采用更低发热量,更低功耗的情况下,反而获得更快的频率提升,突破标准DDR的400MHZ限制。看起来,这似乎更神奇,突破最高频率限制,竟然还能降低发热量和功耗?虽然DDR2技术还采用了几种全新技术配合完整以上能力,然而关键还在于4BIT的预读取能力,笔者将带大家一步步看来。

    DDR2频率与带宽

        除了已经发布的三种DDR2内存标准的频率与带宽,值得注意的是,DDR2 400Mhz与DDR400Mhz的所拥有的带宽是一样的3.2GB. 还有,在双通道内存技术的辅助下,667MHZ的DDR2将最高提供10.6GB/S的惊人带宽!

        DDR2内存起始容量为256MB,往上可支持到512MB,1G。在桌面系统上提供了充足的容量保障。理论上DDR2内存颗粒所拥有的高密度特色,可以支持最高4G以上的容量,从而广泛应用于专业领域。更也许会在未来几年内,给PC系统带来nGB级的超级容量。

        DDR2标准规定所有DDR2内存均采用FBGA封装形式。不同于目前广泛应用的TSOP, TSOP-II封装形式,FBGA封装提供了更好的电气性能与散热性,为DDR2内存的稳定工作与未来频率的发展提供了良好的保障。目前应用再显卡上的DDR2内存颗粒也全部采用的FBGA封装模式。DDR2内存采用1.8V电压,相对于DDR标准的2.5V,降低了不少,从而提供了明显的更小的功耗与更小的发热量,这一点的变化是意义重大的,同样也让DDR2内存更适应与笔记本与膝上电脑。既然能以这么低的电压工作,是如何实现频率提升的呢?

    DDR2工作原理

        大家都知道,内存基本工作步骤分为: 从系统预读数据 → 保存在内存单元队列 → 传输到内存I/O缓存 → 传输到CPU系统处理。

        DDR内存采用200MHZ的核心频率,通过两条路线同步传输到I/O缓存,实现400MHZ的是实际频率。

        DDR2采用100MHZ的核心频率,通过四条传输路线同步传输至I/O缓存,同样实现400MHZ的实际频率。

        聪明的看官已经看出来其中奥妙。正是因为DDR2可以预读4BIT数据,所以,可以采用四路传输,而由于DDR只能预读2BIT数据,则只能采用200MHZ的两条传输线路实现400MHZ。这样,DDR2就完全实现了在不降低总频率的情况下,将核心频率降低到100MHZ,从而很轻松能够实现更小散热量,更低电压要求。而且,核心频率可以进一步提升,从而实现133*4 ,166*4 ,最大200*4达到800MHZ的程度。然而,大家都知道,更低的内存延迟,能带来更高的性能,然后,在DDR2中,为了保证4路传输的稳定流畅性,避开电气干扰与数据冲突,采用了稍大于DDR的延迟设定。相信聪明的看官也能看出来,这其实是一个很有远见的设计。

    DDR2的全新特征技术

        了解了DDR II的技术原理,再来看看DDR II的三个主要新特征:它们分别是OCD、ODT和Post CAS。

        OCD(Off-Chip Driver),也就是所谓的离线驱动调整,DDR II通过OCD可以提高信号的完整性。DDR II通过调整上拉(pull-up)/下拉(pull-down)的电阻值使两者电压相等。也就是Pull-up=Pull-down。使用OCD通过减少DQ-DQS的倾斜来提高信号的完整性;通过控制电压来提高信号品质。

        ODT是内建核心的终结电阻器,我们知道使用DDR I SDRAM的主板上面需要大量的终结电阻,至少每根数据线需要一个终结电阻,这对主板来说也是不小的成本。信号线上使用终结电阻是为了防止数据线终端反射信号,因此需要一定阻值的终结电阻器。这个阻值太大或者太小都不好,阻值较大线路的信噪比较高但是信号反射较为严重,阻值小可以减小信号反射但是会造成信噪比下降。此外由于不同的内存模组对终结电阻的要求不可能完全一样,因此主板对内存模组也比较"挑剔"。

        DDR II内建了终结电阻器,在DRAM颗粒工作时把终结电阻器关掉,而对于不工作的DRAM颗粒则打开终结电阻,减少信号的反射。ODT至少为DDR II带来了两个好处,一个是去掉了主板上的终结电阻器使主板的成本降低,也使PCB板的设计更加容易。第二个好处是终结电阻器可以和内存颗粒的"特性"相符,使DRAM处于最佳状态。

        Post CAS,它是为了提高DDR II内存的利用效率而设定的。在Post CAS操作中,CAS信号(读写/命令)能够被插到RAS信号后面的一个时钟周期,CAS命令可以在附加延迟(Additive Latency)后面保持有效。原来的tRCD(RAS到CAS和延迟)被AL(Additive Latency)所取代,AL可以在0,1,2,3,4中进行设置。由于CAS信号放在了RAS信号后面一个时钟周期,因此ACT和CAS信号永远也不会产生碰撞冲突。

        在正常的操作中,此时的各项内存参数为:tRRD=2,tRCD=4,CL=4,AL=0,BL=4(BL就是突发数据长度,Burst Length)。我们看到tRRD(RAS到RAS的延迟)为两个时钟周期,tRCD(RAS到CAS的延迟)是四个时钟周期,因此在第四个时钟周期上面ACT(段激活)和CAS信号产生了碰撞,ACT向后移动一个时钟周期,因此大家可以看到后面的数据传输中间出现了一个时钟周期的BUBBLE

        再来看看Post CAS的操作,此时的各项内存参数是:tRRD=2,tRCD=4,CL=4,AL=3,BL=4。RAS被设在ACT信号后的一个时钟周期上,因此CAS和ACT不会产生冲突,tRCD被AL所取代(实际上大家可以想象到tRCD并没有减小,只是在概念上的转变,CAS向后一个时钟周期,但是AL要比tRCD短,通过调整可以取消信号命令的碰撞),在附加延迟过程中DRAM保持读命令。由于这种设计,ACT和CAS不会再有碰撞,内存读取时序中也没有BUBBLE出现。

    使用Post CAS加Additive Latency会带来三个好处:

    1、可以很容易的取消掉命令总线上的Collision(碰撞)现象
    2、提高了命令和数据总线的效率
    3、没有了Bubble,可以提高实际的内存带宽

    另 普通的DOTHAN的FSB都是533 也就是搭配DDR533的内存刚好能满足内存带宽可是现在的笔记本DDR1最多只有DDR400,一般是333无法满足DOTHAN的FSB这时候内存就成为了系统的瓶颈915平台出来后可以支持DDR2双通道DDR2从400开始,往上还有533。。。。。
    这时候 大家也许已经发现了其实单通道DDR2 533已经完全可以满足DOTHAN的FSB也就是说 DDR2 533开双通道,只有FSB=1066的CPU才能和它匹配 在INTEL1066FSB的U出来以前 DDR2 533双通道基本是浪费 所以 DDR2双通道给Sonama平台带来的性能提升是狠微小的 DOTHAN已经成为Sonama系统的瓶颈 对性能要求不是狠苛刻的朋友完全不用把钱花在双通道的DDR2上



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:文化部部长蔡武:中国动漫产业缺创意
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/02/14/1390424.html
  • CMMI中术语解释

    2009-09-29 00:28:44

    共利益者:Stakeholder

           所谓“共利益者”,指的是受到某种负责产生输入的方式影响的群体或个人。共利益者可能包括项目经理、供方、顾客以及其他人。术语“相关的共利益者”用于指某个计划中要求执行某类活动或者接受某类信息的群体和个人。

    经理:Manager

          在本标准中,“经理”一词指的是对在其负责范围内执行任务或从事活动的人们提供技术指导和行政管理的人。经理的传统只能包括策划、组织、指导和控制某个责任范围内的工作。

    项目经理:Project Manager

           在本标准中,“项目经理”一词指的是负责策划、指导、控制、构造和推动项目的人。项目经理对顾客负根本责任。

    高级经理:Senior Manager

            术语“高级经理”是指组织里高层次的管理岗位,在这个岗位上的人主要致力于使本组织拥有长期活力,而不是应付短期的项目和合同问题及压力。高级经理有权指导资源的分配或重新分配,以支持有效的组织过程改进。高级经理可以是任何满足上述说明的经理,包括本组织的头在内。“执行官”和“顶层经理”与“高级经理”是同义词。本标准中只使用“高级经理”这个词。

    组织:Organization

           组织是行政管理结构,在这个管理结构中,人们共同管理一个或作为一个整体的多个项目,这些项目共有一个高级经理并且在同样的方针下运行。在本标准中,“组织”这个词主要指软件开发和/或服务实体;它可能是一个独立实体,也可能是更大的实体的一个组成部分。

    企业:Enterprise

           本标准中,“企业”泛指那些用“组织”一词尚不足以表述的大型实体。一个大型公司里可能有许多拥有不同顾客、坐落在不同地方的组织。“企业”是这些大型公司的统称。

    开发:Develop

           本标准中提到“开发”时,不是单纯指开发活动,还包括维护活动在内。

    项目:Project

            项目指的是向顾客或最终用户交付一个或多个产品的受管理的相关资源的集合。这个资源集合有着明确的始点和终点,并且一般是按照某项计划运行。这种计划通常会形成文件并说明要交付或实现的产品、所用的资源和经费、要做的工作以及工作进度。一个项目可能由若干项目组成。

    工作产品:Work Product

          工作产品用于指由过程产生的任何人工制品。这些人工制品可能包括文卷、文档、产品的一部分、服务、过程、规范以及清册等。

    产品构件:Product Component

           产品构件是产品的组成部分。把产品构件加以集成,可以构造出产品。可能存在多个层次的产品构件。产品构件也是工作产品,但是必须经过工程化(需求确定、设计、集成式解决方案开发等)才能实现产品的预计用途。产品构件可能是将要交付给顾客的产品组成部分,也可能只是供项目内部使用或其他方面使用。

    项目开发计划:Project Development Plan

           项目开发计划是一种把项目已定义过程与项目如何推进链接起来的方案。本标准中定义了“项目已定义过程”,但是从指导项目推进的角度看,项目已定义过程还不够具体,因为其中不规定谁担当什么角色、要创建什么工作产品或者什么时候执行什么作业。项目已定义过程和项目开发计划合在一起,就可能有效的执行和管理项目。

    目标:Goal

            本标准中,为评估模型定义了“通用目标”和“特定目标”,把他们作为衡量实际的软件过程的能力的重要尺度。在涉及软件过程能力的上下文中,每个通用目标和特定目标都具有特定的含义,不要把其他背景中的目标一词与他们混淆。



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:李开复称创新工场启动资金已有一半到位
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2009/02/09/1386660.html
  • j2ee性能调优之最小化资源压力测试法则

    2009-09-29 00:28:44

    来源:中国IT实验室

      摘要:我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题。最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作。

      前面看到有人讲j2ee的性能调优,虽然这块不是自己的专长,但是猪养多了,也忍不住跳出来说几句。

      虽然几乎每本讲性能调优的书籍开篇都会提,没必要的情况下就不要做调优,但是我个人还是认为,所有系统在上线前,都应该做一次基本的压力测试并对相关的性能问题进行检测, 但是迫于资源压力,很多项目都无法做正规的压力测试,一直到系统上线出现问题,才倒回来找原因。 而正规的压力测试,往往因为需要严格模拟生产环境,需要耗费大量的资源,各类专家配合解决问题,并不是那么轻松的可以做下来的。

      而j2ee应用的特点就是以复杂性来回避传统问题,所以任意一个j2ee的部署,相对于php那样的结构都是比较复杂的。系统一旦发生性能问题,必须在程序、数据库、应用服务器、jvm、操作系统几大块中交叉进行考虑,根据实际情况问题,问题的原因可能异常复杂。我们可以想象一个项目,从来不做UT不做IT ,只做一次UAT,然后直接提交给用户上线以后,修补错误的困难度和成本。

      经常看到一些调优的最后解决方案,可以肯定,几乎80%以上都是一些低级的程序错误导致的,剩下的20%虽然可能是用硬件,os参数调整等等问题解决了,但是其中很大一块,归根到底也是程序的问题。 而在我们回顾这些错误的时候可以很惊人的发现,大部分都是一些低级错误。

      我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题。最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作。这种做法的优点如下。

      1. 环境容易搭建, 特别是不需要考虑大型硬件和网络条件等等,也回避了开发人员可能不熟悉unix和特定应用服务器等问题

      2. 不需要特别的数据库,操作系统和应用服务器专家配合,开发人员自身即可完成。

      3. 不需要特别的依赖os和应用服务器,jvm的监测工具。选择自己最熟悉的即可。

      4. 开发人员在熟悉这种过程以后,再转到正式的生产环境工作时也更有经验,更容易解决问题。

      对测试过程做一点简单介绍。

      工具准备:

      得益于开源技术的发展,大部分工具都可以免费获得,使用也比较简单。

      1. jvm 监控: 对jvm的运行状态进行分析, 可以使用jvm自身带的特性输出日志,结合hp的jmeter profile进行分析。也可以使用jrockit自带的图形化工具mession control。

      熟悉什么用什么,越简单越好,目的主要是观察内存堆的变化,线程资源变化,gc情况等。

      2. 数据库监控工具: 熟悉数据库的使用数据库自身的特性,不熟悉的可以使用第三方工具,主要目的是观察数据库的锁,连接数信息, 对于db2我比较喜欢使用quest central。 oracle使用OEM或者自身的数据字典已经可以。

      3. 应用服务器监控: 主要目的是记录方法的调用情况和执行时间 ,找出频繁调用的方法和执行时间过长的方法。使用jprobe和jprofile都可以很轻松的做到。 如果使用的应用服务器比较偏门,那么可以换一个支持这种检测工具的应用服务器。反正主要目的只是在找问题。

      4. sql执行监控:跟踪找出执行时间过长的sql。 我喜欢使用p6spy。

      5. 压力工具: jmeter+badboy , 有条件的可以用loadrunner, 和loadrunner近似的还有一个免费的开源产品。 另外web 应用的话, 也可以使用selenium这样的ff扩展来做。微软vs自带的也不错,反正是什么简单用什么。

      6. 记录表格: 对问题和资源配置的变更进行记录和对比。

      我发现有些人做压力测试,只用压力工具来跑,不肯用各类proile工具来跟踪应用和数据库使用情况,加上经验又不足,结果测来测去都是瞎猜。

      设置:

      1. 数据库: 如果未使用连接池, 则尽可能的将数据库允许连接设置成最小数字,推荐是从1开始。如果使用连接池,则设置为1.

      随着并发模拟数的增加也可以适当上调,但是一定要低于压力工具模拟的并发用户数。数据库环境尽可能接近生产环境,至少要有足够的测试数据。

      2. 应用服务器: 对jvm启动堆做最小化设置。比应用服务器要求的最低内存略高,保证应用可以正常启动即可。根据模拟用户数增加可以小步适当上调,但是以保证应用基本运行即可。千万别来大内存。

      3. 压力模拟并发数,从1开始逐步往上加。一次加1,2个,上限不要太高,5-10个足以。

      步骤

      1. 按1用户1连接的方式进行检测

      * 找出系统是否存在明显的资源泄露,比如数据库连接,如果存在泄露此种情况下服务器很容易就hold。

      * 找出执行时间过长的java方法和sql。进行分析修改。

      * 找出那些调用过多的方法和sql,对程序进行分析,看是否做了不必要的调用。 这个问题尤其在使用了第三方包的情况下要小心,我曾经监测出某人写的东西一个方法间接的调用了数据库操作近200次。

      有些人做测试喜欢从5以上的数字开始,实在不是什么好习惯,比较明显的问题都容易回避了。

      2. 适当增加并发用户,尽可能不调整应用内存,对系统进行长时间的压力测试,比如2-4个小时。 重点观察是否存在内存泄露问题。 内存泄露的问题比较复杂,有时候还依赖于jvm和os,另外有些内存泄露只能在大并发的多线程环境下才会出现。 但是这种测试可以排除掉一些明显的问题,主要是缓存和队列之类的东西。内存泄露一般jvm会有报错和相关的日志dump文件。

      3. 逐步增加并发用户和连接数,观察是否存在sql锁 和线程锁的问题。另外并发情况下也可能存在其他一些资源冲突,比如读写文件的情况等等。

      线程情况可以使用监控工具观察,比如jrockit带的mc, 也可以直接dump jvm 内存快照找工具分析。

      4. 尽可能增加并发用户数,以当前应用能承担的上线进行长时间测试,比如半天到1天,观察是否会存在内存泄露,是否会存在线程资源消耗的问题。也需要检查一下数据库的连接数情况,看是否会一直持续增加,这说明连接池实现有问题,或者设置过大,也可能是jdbc的问题。

      5. 其他: 对jvm 可以使用sun和bea的都对比跑一下, 两个实现情况大不同。 jr大并发支持好,所以可能jr上没问题,但是sun的就有问题了。

      大部分的问题应该都可以在步骤1,2能得到暴露。在完成了这样的初步测试以后,正式的测试就省心不少了,如果客户有钱,性能不好也可以直接更新硬件了,省事又创造GDP。

    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:Ubuntu 9.10全新图标、主图和壁纸
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2008/12/20/1358994.html
  • 怎么把Xitami的端口改一下Xitami的默认端口与HTTP的默认端口冲突

    2009-09-29 00:28:44

    答案:

    如果是使用Xitami作为Web和Ftp服务器的话,需要改动服务器初始化文件的配置,如
    将xitami.cfg中的portbase=0改为portbase=1000.
    在服务器程序重新启动后,可以进行测试。
    其他ftp服务器的原理基本一样,就是对ftp服务器程序的初始化文件进行修改。
    那么,使用测试方法在本机测试的指令为:
    c:\ftp 127.0.0.1:1021   (ftp)
    http://127.0.0.1:1080/   (http)

    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:可牛影像:不卖软件卖服务
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2008/12/18/1357477.html
  • loadrunner- winsock 函数总结

    2009-09-29 00:28:44

    loadrunner- winsock 函数总结
    lrs_accept_connection 接受侦听套接字连接

            lrs_close_socket 关闭打开的套接字


            lrs_create_socket 初始化套接字


            lrs_disable_socket 禁用套接字操作


            lrs_exclude_socket 重播期间排除套接字


            lrs_get_socket_attrib 获取套接字属性


            lrs_get_socket_handler 获取指定套接字的套接字处理程序


            lrs_length_receive 接收来自指定长度的缓冲区的数据


            lrs_receive 接收来自套接字的数据


            lrs_receive_ex 接收来自数据报或流套接字的数据(具有特定长度)

            lrs_send 将数据发送到数据报上或流套接字中


            lrs_set_receive_option 设置套接字接收选项


            lrs_set_socket_handler 设置特定套接字的套接字处理程序


            lrs_set_socket_options 设置套接字选项


    缓冲区函数

            lrs_free_buffer 释放分配给缓冲区的内存


            lrs_get_buffer_by_name 从数据文件中获取缓冲区及其大小


            lrs_get_last_received_buffer 获取套接字上接收到的最后的缓冲区及其大小


            lrs_get_last_received_buffer_size 获取套接字上接收到的最后一个缓冲区的大小


            lrs_get_received_buffer 获取最后接收到的缓冲区或其一部分


            lrs_get_static_buffer 获取静态缓冲区或其一部分


            lrs_get_user_buffer 获取套接字的用户数据的内容


            lrs_get_user_buffer_size 获取套接字的用户数据的大小


            lrs_set_send_buffer 指定要在套接字上发送的缓冲区


    环境函数

            lrs_cleanup 终止 Windows 套接字 DLL 的使用


            lrs_startup 初始化 Windows 套接字 DLL


    关联语句函数

            lrs_save_param 将静态或接收到的缓冲区(或缓冲区部分)保存到参数中


    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:Google 回应封杀 CyanogenMod 事件,没我们想的那么糟糕但也够呛
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2008/11/23/1339595.html
  • LoadRunner内部结构(转)

    2009-09-29 00:28:44

     

    1,             被测系统是由驱动进程mdrv.exe(多线程驱动的进程)r3vuser.exe来产生压力的,其中r3vuser.exe仿真应用程序的客户端,如IE浏览器。它执行了三个主要的操作:

           Kli> cpp (C 语言pre-processor)

           1cci C语言编译器),建立ci文件,然后使用被测系统的协议相关的驱动来执行。

     

    通过在Windows批处理脚本中启动Mdrv.exe来默默地启动运行。

    Mdrv能自动停止加载Vuser,因为他们与VuserWindows负载生成器上的CPU使用监视器之间互相通信。

    Windows机器上,对于每一个基于JavaVuser都有一个独立的JVM

    2,             虚拟用户通过在负载生成器客户端机器上使用agent3900 magentproc.exe)作为服务或者进程来按照组(在指定的负载生成器上运行相同脚本的虚拟用户的集合)启动虚拟用户。

    3,             每一个拥有代理的机器维护一个在.qtp文件中的执行日志

    4,             当日志被启用后,代理同样会在结果文件中为每一个虚拟用户(由虚拟用户组分开)建立一系列日志文件。

    5,             在执行过程中, 这些文件可以通过在Controller机器上的view > Show Output窗口中显示。

    6,             在预先设置延时上,Controller上运行的Scheduler指导代理(通过Windows 54345端口,或者Unix上的动态端口)去初始化场景会话.Controller(wlrun.exe)在请求中发送一份场景的拷贝.

    7,             代理是由每一个负载生成器上的Remote Agent Dispatcher进程(以前叫Remote Command Launcher(RCL))启动的.

    8,             每一个根据场景(.lrs)定义文件中设置的代理来决定哪一个虚拟用户组和脚本需要在主机上运行.

          ## 这就是说Controller可以从DOS的批处理文件(.batch)中启动.

      REM Start Controller:
    SET M_ROOT=C:\Program Files\Mercury Interactive\LoadRunner\bin
    cd %M_ROOT%
    wlrun.exe -TestPath D:\Dev\Dev1.lrs -port 8080 -Run -DontClose

    l       包含的-Run 参数与手动的点开始场景自动运行是一样的. 这不是一个很好的方法,因为你可能需要决定从以前的运行中收集文件或者想改变输出文件夹.

    l       这是假设系统环境变量PATH已经被更新了,包括LoadRunner的安装.

    9, Controller通过使用   Windows 操作系统文件夹里的参数值来启动.因为LoadRunner被设计成在一个机器上一次只能运行一个Controller实例,所以需要使用Windows文件夹.

     ## 为了在几个应用之间快速的切换, Controller工作之后保存LoadRunnerini文件, 然后使用记事本来制作一个批处理文件. 在执行wlrun之前拷贝应用程序的指定版本的ini文件. 下面是一个应用程序文件拷贝的例子:

    copy %WinDir%/wlrun7-XXX.ini   %WinDir%/wlrun7.ini
    copy %WinDir%/wlrun7-XXX.dft   %WinDir%/wlrun7.dft

    需要修改一些默认值:

    l       wlrun7.ini文件的output区域, MaxNumberOfOutputMessages= from 10000 to 100000, 这就限制了存储在数据库中的输出信息的数目.

    l       MaxOutputUIRowsToShow限制了在Controller的输出窗口中显示的信息/错误行总数.

    l       LoadRunner程序文件的 dat\protocols       文件夹下的QTWeb.lrp文件的[Vugen]部分, 添加一个MaxThreadPerProcess=5来限制由每个负载生成器mdrv.exe进程管理的线程数.

    l       存储在wlrun5.ini wlrun7.dft文件中的DefaultScenarioDir, DefaultscrīptDir, DefaultResultDir, [Recent File List]几个数据的值会在每次Controller改变的时候更新。

    10,             Vu scrīpts中定义的每个虚拟用户进行的操作是用LoadRunnerVuGen.exe生成的. 当这个程序启动后, 它在windows文件夹下存储了comparamui.INI文件来保存[LastTablesUsed]下面文件的历史,并且保存由Insert > New Parameter > Dates 菜单指定的[ParamDialogDates].

    VuGenWindows文件夹下存储和检索vugen.ini文件.当使用JAVA的时候,需要添加一些其他的调试选项:

    [DynaDlg]
    JavaLevel=3

    当在VuGen 8.1中使用8.0的脚本, Vugen.ini中加入信息:

    [Editor]
    OLDEDITOR = 1

    VuGenLR文件夹template/qtweb default.cfg和脚本文件里打开.

    Vu scrīpts可以使用脚本外部的参数文件来获得的变量值进行编码.

    更多关于VuGen的信息请看脚本编写的章节.

    11. 运行过程中,执行结果存储到一个结果文件夹中.

        我喜欢在场景执行中把结果设置成自动产生结果.这样,LoadRunner会在每次启动一个场景之后自动产生一个子增的结果名. 例如,结果名称Res1会自动增长到Res12或有时候是R   es11-1.

    错误被写到output.mdb微软Access数据库中。

    12. 在每一个结果文件夹中, 程序自动创建Log文件夹来包含每个组的日志文件. 运行之后,Controller中查看日志文件, , .然后在组中点右键,选择 Show Vuser Log

    13. 场景运行的时候, 监视器在本地维护每个主机的计数器.

    14. 运行完成之后, "collate"进程处理.eve.lrr结果文件, 并且在结果文件夹下创建一个临时的.mdb数据库.

    在处理大数据量的结果时, 为了防止错误发生,使用MSDE. ……

    15.分析模块(8,320K analysisu.exe)使用mdb数据库中的数据来产生分析图表和报告.

    16. 每一次场景运行后的结果文件results_name.lrr,也叫分析文档文件,由分析程序来读取并且显示百分位图表.



    作者资料:
    测试者家园
    我的主页 个人资料
    我的闪存 与我联系
    ----------------------------------------------------------------------------------------------
    推荐链接:博客园个人主页上线测试
    新闻频道:交友国际化 QQ International Beta1发布
    网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  找找看

    Link URL: http://www.cnblogs.com/tester2test/archive/2008/11/16/1334694.html
  • 李开复建言大学生:求职中不要把钱看得太重

    2008-12-23 22:45:26

Open Toolbar