发布新日志

  • LoadRunner监控AIX系统性能的BUG

    2008-05-27 16:42:22

        首先说明下如何用LoadRunner监控AIX系统的性能状况:在 IBM AIX 系统上。输入以下命令: 
    cd /etc 
    vi inetd.conf ,并将 rstatd 行的注释去掉 
    Refresh –s inetd
    这样AIX机器上的rstatd 守护程序启动成功了,LoadRunner的资源监控器就可以监控AIX系统的性能状况了。

        曾经的一次性能测试也是这么监控的,但是经常发现在AIX本机上用vmstat命令查看到的CPU idle值与loadrunner监控到的值有较大出入,不禁产生疑问:是不是loadrunner监控的值不准确?和系统管理员讨论了一下这个问题,系统管理员提供了一条线索,这台AIX机器使用了CPU超线程技术,可能是导致loadrunner监控的值不准确的原因。最后虽然没有确定这个BUG的产生的原因,但是这个BUG确实存在。

  • 如果loadrunner不能自动打开需要录制的程序,怎么办?

    2008-05-26 16:30:30

      以前经常看到有人反映loadrunner不能自动打开浏览器,所以没法进行录制工作。现在我也碰到了类似的情况,是一个C/S 程序,loadrunner录制它的时候也不能自动打开。下面介绍一种转录的方法来解决这种问题:

      首先,打开VuGen添加新脚本,这里一定要注意选择MutipleProtocol模式,添加windows sockets协议。

      然后Start Recording对话框中的Program to record项填写:C:\Program Files\Mercury\LoadRunner\bin\wplus_init_wsock.exe。这里注意,已经不是你要录制的程序的地址了。


      打开options选项下的Network PortMapping。TargetServer:填写你要录制的软件的服务器的地址,Port填写通信的端口。最下面的allow forwarding to target server from local port填写的是你要录制的软件和loadrunner之间的通信端口,可以随便填写,只要不和其他协议的重复就可以。

      好了,开始录制吧。启动loadrunner的录制功能后,在手动打开你要录制的软件。这里注意重新设置一下你的软件的服务器地址和端口。参考下图:

      这是候发现你对软件的操作已经全部录制到loadrunner中了,很好很强大啊 :)。

  • LoadRunner中获取当前时间的函数

    2008-05-26 15:42:44

      最近有一个webservice的性能测试,在录制脚本的时候发现需要获取本机的UTC时间(与GMT时间是一样的)以及比当前UTC推迟5分钟的时间,格式为2008-05-23T10:05:05Z。

    1. 查看帮助后发现有这么几个有用的函数:                                  

      time
      用法:time( time_t *t)
      功能:此函数返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t并非空指针,此函数也会将返回值存到t指针所指的内存。
      返回值:成功,返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。

       

      gmtime
      定义函数  struct tm*gmtime(const time_t*timep);
      函数说明  gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。结构tm的定义为
      #ifndef _TM_DEFINED
      struct tm
      {
              int tm_sec;     /* 秒 – 取值区间为[0,59] */
              int tm_min;     /* 分 - 取值区间为[0,59] */
              int tm_hour;    /* 时 - 取值区间为[0,23] */
              int tm_mday;    /* 一个月中的日期 - 取值区间为[1,31] */
              int tm_mon;     /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
              int tm_year;    /* 年份,其值等于实际年份减去1900 */
              int tm_wday;    /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,       以此类推 */
              int tm_yday;    /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
              int tm_isdst;   /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
      };
      #define _TM_DEFINED
      #endif

       

    2. 为了得到上面说到的2个时间,用以上函数获取的时间格式只能为2008-5-23T10:5:5Z。可以看到和需要的时间在格式上稍有出入(个位数的时间需要显示为0x),在loadrunner脚本中加入以下代码可以得到需要的时间格式:

    typedef long time_t;
    struct tm {

           int tm_sec; /* seconds after the minute - [0,59] */

           int tm_min; /* minutes after the hour - [0,59] */

           int tm_hour; /* hours since midnight - [0,23] */

           int tm_mday; /* day of the month - [1,31] */

           int tm_mon; /* months since January - [0,11] */

           int tm_year; /* years since 1900 */

           int tm_wday; /* days since Sunday - [0,6] */

           int tm_yday; /* days since January 1 - [0,365] */

           int tm_isdst; /* daylight savings time flag */

    #ifdef LINUX

           int tm_gmtoff;

           const char *tm_zone;

    #endif

    };

    vuser_init()
    {
      char time_a[21],time_b[21];
      char ql_mon[3],ql_mon_b[3],ql_day[3],ql_day_b[3],ql_hour[3],ql_hour_b[3],ql_min[3],ql_min_b[3],ql_sec[3],ql_sec_b[3];
       time_t t,l;
       struct tm *p;
       struct tm *q;
       tzset(); //UNIX时间兼容函数
       time(&t);

       p=(struct tm*)gmtime(&t);

      if((1+p->tm_mon) < 10){
       sprintf(ql_mon,"0%d",(1+p->tm_mon));
      }
      else{
       sprintf(ql_mon,"%d",(1+p->tm_mon));
      }
      if(p->tm_mday < 10){
       sprintf(ql_day,"0%d",p->tm_mday);
      }
      else{
       sprintf(ql_day,"%d",p->tm_mday);
      }
      if(p->tm_hour < 10){
       sprintf(ql_hour,"0%d",p->tm_hour);
      }
      else{
       sprintf(ql_hour,"%d",p->tm_hour);
      }
      if(p->tm_min < 10){
       sprintf(ql_min,"0%d",p->tm_min);
      }
      else{
       sprintf(ql_min,"%d",p->tm_min);
      }
      if(p->tm_sec < 10){
       sprintf(ql_sec,"0%d",p->tm_sec);
      }
      else{
       sprintf(ql_sec,"%d",p->tm_sec);
      }

      sprintf(time_a,"%d-%s-%sT%s:%s:%sZ",(1900+p->tm_year),ql_mon,ql_day,ql_hour,ql_min,ql_sec);

      lr_message("%s",time_a);


      l=t+300;

      q=(struct tm*)gmtime(&l);

      if((1+q->tm_mon) < 10){
       sprintf(ql_mon_b,"0%d",(1+q->tm_mon));
      }
      else{
       sprintf(ql_mon_b,"%d",(1+q->tm_mon));
      }
      if(q->tm_mday < 10){
       sprintf(ql_day_b,"0%d",q->tm_mday);
      }
      else{
       sprintf(ql_day_b,"%d",q->tm_mday);
      }
      if(q->tm_hour < 10){
       sprintf(ql_hour_b,"0%d",q->tm_hour);
      }
      else{
       sprintf(ql_hour_b,"%d",q->tm_hour);
      }
      if(q->tm_min < 10){
       sprintf(ql_min_b,"0%d",q->tm_min);
      }
      else{
       sprintf(ql_min_b,"%d",q->tm_min);
      }
      if(q->tm_sec < 10){
       sprintf(ql_sec_b,"0%d",q->tm_sec);
      }
      else{
       sprintf(ql_sec_b,"%d",q->tm_sec);
      }


      sprintf(time_b,"%d-%s-%sT%s:%s:%sZ",(1900+q->tm_year),ql_mon_b,ql_day_b,ql_hour_b,ql_min_b,ql_sec_b);

      lr_message("%s",time_b);
     return 0;
    }

      这样,当前UTC时间和推迟5分钟的时间分别存储在time_a和time_b这2个字符串中,在脚本的其它地方可以调用。

     

数据统计

  • 访问量: 5876
  • 日志数: 3
  • 建立时间: 2008-04-24
  • 更新时间: 2008-05-27

RSS订阅

Open Toolbar