友善交流技术...

发布新日志

  • TUXEDO 监控

    2008-09-20 09:00:08

      什么是TUXEDO 可能大家都知道的,但是它重要的功能是什么呢?有什么指标要我们去监控,获取到的数据怎么样来分析呢?
      我在银行做中间件的监控工作,但是只知道监控,当我想知道TUXEDO什么时候是个瓶颈的时候,没有人能告诉,我也查询过许多的资源,结束是一无所获... 我一直在想一个问题,有一个不知道怎么分析,不知道什么时候瓶颈的数据,意义何在? 我们的分析师也不知道,应该要什么数据.怎么分析? 可怜啊...现在做性能测试难道就是这样的吗?多大的一个银行项目啊... 费了多少钱在上面?让我们做性能测试? 当然包括结果的整理!
      我感觉很可怜啊...自己和银行
      不管怎么说,还是知道来监控的,下面是我写的监控TUXEDO方面的东东..希望给不了解的人一点帮助
      #!/bin/sh
    #tuxedo.sh 
    num=1
    loopnum=10000
    sleep_time=60

    Tday=$(date +%y%m%d)
    file_path="/home/ap/perfmon/$Tday/"
    file_ser="tux"
    #file_ser="mq"
    file_ip=`netstat -in|awk '{print $4}'|grep 128|grep -v 128.199|sort|head -1`
    file_time=$(date +%Y%m%d%H%M)
    file_format=".txt"
    path_log=$file_path$file_ser-$file_ip-$file_time$file_format

    if [ ! -d $file_path ]
    then
       mkdir $file_path
       chmod 777 $file_path
    fi

    while [ $num -lt $loopnum ]
    do
    date_time=$(date +%y-%m-%d-%H-%M-%S)
    echo $date_time >>$path_log
    #消信队列的实现长度
    echo pq | tmadmin -r|grep -v  GWTDOMAIN|awk '($6!="0.0")&&($6!="-") {print ;a=a+$6;} END {print "pq Ave. Len is :"a}' >>$path_log
    #实际的请示数,每一个时刻的.
    echo pq | tmadmin -r |grep -v  GWTDOMAIN|awk '$5!="0" {print ;b=b+$5;} END {print "pq # Queued is :"b}' >>$path_log

    echo "----PCLT INFO----" >>$path_log
    #每一个时间,服务处理的事务数
    echo pclt |tmadmin -r | grep -v "0/0/0"| awk '$6!="0/0/0" {print ;c=c+$6;} END {print "pclt Bgn/Cmmt/Abrt total is :"c}' >>$path_log

    echo "----PSR INFO-----" >>$path_log 
    #客户端实际的连接数,每一个时刻的数值
    echo psr |tmadmin -r |awk '$8 ~/IDLE/ {h=h+1} END {print "IDLE TOTAL IS "h}' >>$path_log

    echo "-----PSC INFO-----" >>$path_log
    #service的运行情况和处理的交易数。 
    echo psc |tmadmin -r |awk '$8!="AVAIL" {print ;g=g+1} END {print "PSC NO avail total is "g-5}' >>$path_log

    num=$(($num + 1))
    sleep $sleep_time
    done 
    exit 
  • LoadRunner JAVA协议 来测试SQL性能

    2008-09-20 08:46:35

      大家可能都知道 ODBC 协议是可以录制下来,SQL SERVER 2000 但是这个协议是底层的协议,所以好多东西是我们不想要的,也有好多东西,是我们不知道的.所以参数化,及维护脚本太难度了..由于这样的原因,所以本要用JAVA代码来写了一个测试SQL的程序.
       /*
     * LoadRunner Java scrīpt. (Build: 873)
     * Writer fangtiesui
     * scrīpt Descrīption: sql 查询性能测试脚本 
     * DATE : 2008-09-19                    
     */
    import java.io.*;
    import lrapi.lr;
    import java.sql.*;
    public class Actions
    {
            int sum = 0; 
    public int init() throws Throwable {
    return 0;
    }//end of init        
    public int action() throws Throwable {
             try{    

    String sqldriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
    Class.forName(sqldriver);
    System.out.println("数据库驱动程序注册成功!");
    String url ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=school";
    String user = "sa";
    String password = "sa";
    String sel = "select * from student where id >950";
    Connection conn = DriverManager.getConnection(url,user,password);
           System.out.println("数据库连接成功");
    lr.start_transaction("查询学生表");
           Statement sta = conn.createStatement();
           ResultSet rs = sta.executeQuery(sel);
           System.out.print("\t"+"id"+"\t"+"name" + "\t"+"addr"+"\t"+"tel"+"\n");
         while(rs.next())
         {
          System.out.print("\t"+rs.getInt(1));
          System.out.print("\t"+rs.getString(2));
          System.out.print("\t"+rs.getString(3));
          System.out.println("\t"+rs.getString(4));
          sum = sum + 1 ;
         }
          rs.close();
          sta.close();
          conn.close();
     }catch(Exception e){
    e.printStackTrace(); 
    System.out.println("Test Failed");
       }
          
             lr.message("Sum = "+sum);
    lr.end_transaction("查询学生表", lr.AUTO);
    return 0;
    }//end of action
    public int end() throws Throwable {
    return 0;
    }//end of end
    }

  • 用VBS实现Loadrunner多场景的执行(转)

    2008-09-09 11:03:46

    '用VBS实现Loadrunner多场景的执行


    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    WshShell.Run "cmd.exe /C c:\\db.lrs",1,true
    '指定位置,打开场景,

    Wscrīpt.Sleep 3000
    WshShell.AppActivate "Mercury LoadRunner 控制器 - db.lrs - [*]"
    '把Loadrunner置为激活状态

    Wscrīpt.Sleep 1200
    WshShell.Sendkeys "%{S}"
    '执行行Alt+s 开始场景

    Wscrīpt.Sleep 1000
    WshShell.Sendkeys "{ENTER}"
    '如果提示覆盖执行回车

    Wscrīpt.Sleep 2000
    WshShell.Run "cmd.exe /C tskill wlrun"
    '运行2S(可设定)后 结束进程Wlrun

    Wscrīpt.Sleep 2000
    WshShell.Run "cmd.exe /C c:\\db1.lrs",1,true
    '指定位置,打开第二个场景,

    Wscrīpt.Sleep 3000
    WshShell.AppActivate "Mercury LoadRunner 控制器 - db.lrs - [*]"
    '把Loadrunner置为激活状态

    Wscrīpt.Sleep 1200
    WshShell.Sendkeys "%{S}"
    '执行行Alt+s 开始场景

    Wscrīpt.Sleep 1000
    WshShell.Sendkeys "{ENTER}"
    '如果提示覆盖执行回车

    Wscrīpt.Sleep 2000
    WshShell.Run "cmd.exe /C tskill wlrun"
    '运行2S(可设定)后 结束进程Wlrun

    把上述代码Copy到记事本中,重新保存为*.VBS

    执行就可以实现

    用VBS实现Loadrunner多场景的执行

    用Bat也可以:

    类如下东东:

    SET M_ROOT="D:\Program Files\Mercury\LoadRunner\bin\"
    %M_ROOT%\wlrun.exe -TestPath "c:\db.lrs" -Run

  • loadrunner 测试内存泄露

    2008-09-09 10:28:17

      近来无事,想看看什么情况下是内存的泄露,所以就写了一个小代码来看看...
          char *p =(char *)malloc(1024 * sizeof(char)) ;
          char *str = "memory overflow is never happen in my program!";
          memcpy(p,str,strlen(str)+1);

          lr_error_message("%s",p);

      这个 *P 不停的获取内存.只到内存没有可以分配的资源为止, 这部分内存完全可以回收再用的,但是这个代码却没有将内存回收,只是一味的分配内存,所以说这样的话,无管是多大的内存都会吃光的...当时候程序运行就 会比较慢的... 如果是在本机,小心点,如果用controller  来压你的机器会快就会很慢的.. 
  • LoadRunner内部结构(转)

    2008-09-08 11:20:41

    LoadRunner内部结构(转)

    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,也叫分析文档文件,由分析程序来读取并且显示百分位图表.

  • c语言冒泡排序法

    2008-07-20 02:17:07

       char array[5]={'2','3','4','1','6'};
        int i;
        int j;
        char temp;
        int k;
       
            for(i=0;i<5;i++)
            {

              for(j=0;j<4-i;j++)
                {
                  if(array[j]>array[j+1])
                              {
                                 temp=array[j];
                                 array[j]=array[j+1];
                                 array[j+1]=temp;
                              }
                  }

              }
        for(k=0;k<5;k++)
       lr_error_message("%c ",array[k]);
    }
  • LR中响应该时间的理解?

    2008-07-11 00:15:49

        开始做性能测试的时候,感觉特别是结果分析这一部分是很难的,但是实际上,也却是这样的.
    我个人理解的响应时间由下面几个方面组成:
       all time = dns time + connection time  + first buffer time + received time
                  + ssl time + error time + client time + ftp authrioze time
       first buffer time = server time  + network time
    在web 协议中,我们最关心的时间: 
        first buffer time , received time ,client time , connection time
     1.当 first buffer time 时间很长时,我们要考虑了,是不是因为network time 时间比较长呢? 是不是网络的原因呢?可以参考下: received time 的时间, 如果这个时间很长的话,你的网络很有可能是个瓶颈的.这个时候也可以看下, web page breakdown 页面细分图,可以查看每一个事务中的,每个组件,用的时间,进而可以定位是那个组件引起的问题.让研发进入相关的修改.
     2.其实最难定位的就是: server time 时间过长的问题:
        web application time + server deal time + database time
     这三个时间很难弄清楚,是谁的出问题了, 当然,这种情况我们要借助工具来实现对他们的监控.追踪日志,查看是参数返回的时间太长了,还是数据库,查询数据返回的时间太长了呢? 这样就可以定位是那个地主方,费时太长了.

  • LR9.0的使用感受

    2008-05-31 21:32:46

    LR9.0用了一个时间,感觉还是比较爽的.
     1.比较找的 post 数据请求,只要你敲下回车。就可以自动的加上“”,很爽的。以前想让换行的时候,都是自己增加的“ 号。。
     2.可以设置多个组,现在可以设置出来更复杂的场景来.
     3.增加了ajax协议,这样可以录制许多8.1录制不到的JAVAscrīptE 代码写的东东..
     
      用一个时间,很喜欢LR9.0 ...
  • LR 8.0 卸载后装LR8.1出现lience 报错的解决办法

    2008-04-01 16:31:29

     其实很简单的. LR有自带的LIENCE :
       TEMPORARY 你只要输入这个就可以顺利的安装上的. 只不过只可以用25天的. 你要破解的,至于破解的方法,网上很多的.

     
  • 响应时间与页面下载时间的关系

    2008-04-01 16:21:35

    1. 场景: 我设置个事务:事务1, 事务2
    2. 事务1:事务响应时间为: 1.114s  
        但是:分面下载时间细分中: client time + server time + network time + receive time + first buffer time + dns time +connection time
                              0.003+0.007+0.163+0.003+0.17+0.269+0.166=0.781s
       这为什么这个时间会小于事务的时间呢? 真是弄不明白这个是为什么?

       欢迎大家一起来谈论下?
  • 关于时间与事务时间的问题

    2008-02-03 14:47:01

    //下面是一个用LR来写的时间函数,自己感觉可以当事务时间的统计来使用.

    double E_time;

    merc_timer_handle_t S_time;
    double Avg_time=0;
    double Sum_time=0;
    int i=0;
    Action()
    {
      
     for(i=1;i<=10;i++)
      { 
      S_time=lr_start_timer();

          web_url("url","url=http://www.baidu.com",LAST);
     
          E_time=lr_end_timer(S_time);
          Sum_time=Sum_time+E_time;
       }
          Avg_time=Sum_time/10;
      lr_error_message("%lf",Avg_time);
     
      return 0;
    }
    //这个时间我们可以自己设定,自己感觉10就可以的,求出平均值便是一个很好的办法.

  • 关于LR中分隔字符串的操作

    2008-02-03 14:34:52

    好久以前为了找这个代码自己可是费尽了心思..但是现在终于找了,真的很高兴..与大家一起共享

     
         char path[] = "i love you ";
         char separators[] = " ";
         char *token;

         token = (char *)strtok(path, separators); /* Get the first token */

         if(!token) {

              lr_output_message("No tokens found in string!");
              return( -1 );
               }

         while( token != NULL ) { /* While valid tokens are returned */

             lr_error_message(token);
              token = (char *)strtok(NULL, separators); /* Get the next token */
             
     
                }
     // 本来想做工具测试,可是现在没有机会啊... 但愿有伯乐....

  • WEB页面的二级链接遍历

    2008-02-03 14:30:19

    //这个是二层所有的链接,遍历的代码...
    Action()
    {


       int i;
       int rc=0;
       int k=0;
       //  int sum=0;
       int sum1;
       int rc_new=0;
       int HttpRetCode=0;
       char temp[100];
       char child_temp[100];
       char New_url[100];
       char New_url2[100];

     

        lr_start_transaction("Big_datuu");
            web_reg_save_param("Datuu","LB=href=\"","RB=\"","ord=all");

      
             lr_start_sub_transaction("Child_datuu_1","Big_datuu");
             web_url("datuu","url=http://59.151.23.58/wapnew/info.do",LAST);
              lr_end_sub_transaction("Child_datuu_1",LR_AUTO);
       lr_end_transaction("Big_datuu",LR_AUTO);

       for(i=1;i<=atoi(lr_eval_string("{Datuu_count}"));i++)
          {
             sprintf(temp,"{Datuu_%d}",i);
             lr_save_string(lr_eval_string(temp),"stemp");
         
            
            rc=strstr(lr_eval_string("{stemp}"),"http");
              strcpy(New_url2,"");
     
               if(rc!=0)
                {
                  
                    web_reg_save_param("NewDa","LB=href=\"","RB=\"","ord=all");
                    web_url("Datuu_child","url={stemp}",LAST);
                                

                       HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);    //url 状态的判定。
               
                                   if(HttpRetCode==200)
                                          lr_message("ok this is the right url");
                                   else
                                          lr_error_message("sorry");  
                  
                  // lr_error_message("%s",lr_eval_string("{stemp}"));
                    for(k=1;k<=atoi(lr_eval_string("{NewDa_count}"));k++) 
                        {
                             sprintf(child_temp,"{Datuu_%d}",k);
                             lr_save_string(lr_eval_string(child_temp),"Nstemp");
                             rc_new=strstr(lr_eval_string("{Nstemp}"),"http");
                              strcpy(New_url,"");
                                   sum1=sum1+1;

                                if(rc_new!=0)
                                    {
                                      web_url("Datuu_child","url={Nstemp}",LAST);
                                   //   lr_error_message("%s",lr_eval_string("{Nstemp}"))
                                       sum1=sum1+1;
                                     }
                                else
                                    {
                                      strcat(New_url,"http:\/\/59.151.23.58");
                                      strcat(New_url,lr_eval_string("{Nstemp}"));

                                //     lr_error_message("%s",New_url);
                                     lr_save_string(New_url,"New_temp");
                                     web_url("New_url","url={New_temp}",LAST);
                                       sum1=sum1+1;
                                   
                                     
                                     }
                          }
                               
                    
                 }
                
                else
                 {
                //  lr_error_message("url is wrong");
              //     lr_error_message("%s",lr_eval_string("{stemp}"));
                     strcat(New_url2,"http:\/\/59.151.23.58");
                     strcat(New_url2,lr_eval_string("{stemp}"));

                    lr_save_string(New_url2,"New_temp2");
                     web_url("New_url","url={New_temp2}",LAST);
                        sum1=sum1+1;
                   
                  }          

                 }
       
         lr_error_message("%d",sum1);

     return 0;
     }
    //但是我想说明下,我用的WAP与WEB混合协议做的..

  • lr 中我用 endtime-starttime=sumtime ?

    2008-01-04 15:11:12

    我突然想到了一个获时间的方法?!不知道可行不!?

       #include "web_api.h"


       typedef long time_t;

    Action()
    {
        
     
           time_t NtimeS;
        time_t NtimeE;
           time_t NNow;

     web_url("www.baidu.com",
      "URL=http://www.baidu.com/",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t2.inf",
      "Mode=HTML",
      LAST);

     
        NtimeS=time(&NtimeS);
     //  lr_output_message("%d",time(&NtimeS));

     lr_start_transaction("搜索字符");

      
      web_submit_form("s",
      "Snapshot=t3.inf",
      ITEMDATA,
      "Name=wd", "Value=love", ENDITEM,
      LAST);

     

     web_url("s_2",
      "URL=http://www.baidu.com/s?wd=love&cl=3&tn=jkanh_pg",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t4.inf",
      "Mode=HTML",
      LAST);
         NtimeE=time(&NtimeE);

     web_url("getadv.php",
      "URL=http://client.webbrowser.smartpv.cn:1207/getadv.php?fid=7054&kid=3006&cnt=1&mac=00-1D-60-20-63-B4&kw=love&version=3.1.5",
      "Resource=0",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t5.inf",
      "Mode=HTML",
      LAST);
       

     lr_end_transaction("搜索字符", LR_AUTO);

       
             NNow=NtimeE-NtimeS;

         // lr_output_message("%d",time(&NtimeS));
              lr_message("Formatted time and date: %d", NNow);
              lr_message("Formatted time and date: %s", ctime(&NtimeS));
              lr_message("Formatted time and date: %s", ctime(&NtimeE));     
          
      
      return 0;
    }

      这样和加入事务应该没有什么不同的,如果运行时间长的话,再求下平均值也不会差很多的!不知道我的想法对不?如果能从服务器那获取响应时间会更好的!

       

     

342/2<12
Open Toolbar