欢迎大家来到测试人生,在你休息的时候你可以畅所欲言,空间里也许有些资料可以帮助到你,来吧,朋友,测试人生欢迎你!!!!

发布新日志

  • word非常实用的模板

    2013-05-08 16:43:00

    1      使用方法

    1.1        使用模板

    Word格类文档,特别是技术文档,应该使用统一的格式,主要格式要定义好样式,相同格式的内容要严格应用样式,不应该随意设置格式。

    WORD文档任何格式调整,都可能使文档的一段或选中的文字改变为其他样式,在样式列表中可以看到文档所有在用的样式,如果样式非常多而且杂,说明文档没有很好地应用样式。

    Word有一个最基本的模板,Office2003叫《Normal.dot》,位置一般在C:\Documents and Settings\[登陆用户名]\Application Data\Microsoft\Templates

    新建文档时默认使用的模板就是Normal.dot。当然如果需要,也可以做好其他模板,双击后以其他模板创建新文档。

    我根据写技术文档的常用规范和习惯,整体了一个模板,名字就叫Normal.dot,替换Word默认的文档就可以写什么文档都用我做的这个模板了。

    样式可以设定快捷键,方便快速应用样式。

    1.2        使用样式

    第二个工具条左边就是样式窗格按钮和样式列表,如果想方便选择样式,可以点击样式窗格按快,右边会出现样式窗格。

    选中要设置的文字,或把光标定位到一段文字的任意位置,再选择一个样式,就设置好所选文字或段落的样式了。

    1.3        旧文档应用模板

    Word文档保存时是带格式的,所以哪怕把Normal.dot替换后,旧的文档也不会应用新的模板和样式。只有快捷键是保存在Normal.dot中,只要替换后,旧文档有同名样式就可以应用快捷键。

    旧文档需要应用新的样式需要把模板中的样式复制过来。

    1、选择样式窗格下面的自定义;

    2、点击样式按钮

    3、点击管理器按钮

    4、在Normal.dot中选中要复制的样式,点击复制按钮

    1.4        样式清理

    旧文档或从其他地主复制内容过来后,文档的样式一般会乱,在样式窗格要吧清晰地看到有哪些样式了,如果发现不是原来模板定义的样式,说明就是新的格式或没用的样式了。不是模板定义的样式如果不是要特别保留,应该清理掉。

    样式清理时,样式窗格的显示应该选为“使用中的格式”

    1.4.1    清理未使用样式

    如果在样式窗格点右键,看到全选:当前未使用的,可以直接删除。

    1.4.2    应用模板的样式

    如果有不想要的临时样式,但已经应用的文档中,可以点右键,选择“选择所有 XX 实例”,Word会查找出所有用到这个样式的文字并选中。之后再点击你想应用的样式,如“正文缩进”,Word就会把选中的文字样式设为“正文缩进”。这样操作后,如果没有文字用到这个样式的话,临时样式会自动删除。如果没自动删除,也可以手动删除。

    1.4.3    类似样式合并

    如果文档复制了太多内容,导致样式非常乱之后,可以使用合并样式的功能。但这个功能有时会乱,实在不好调,可以把文字的样式先“清除格式”,再应用新样式。

    1.5        样式修改

    1、选择要修改的样式,点右键,选择修改

    2、修改字体、段落、快捷键等

    快捷键如果被系统占用了,可能就无效,无效的需要自己改设。

    2      使用技巧

    2.1        文档分节

    一般写得规范的文档需要分节,不同的节可以有自己的页眉页脚,标题和页码。

    分节方法是点击插入à分隔符,选择下一页,就会把当前位置后面的文档作为下一节。

    我删除分节的方法是选择上一节的最后面文字和下一节的最前面文字,删除掉文字也就删除了节。

    2.2        页眉页脚

    文档分节后页眉页脚是可以分别设置的,但有时不同的节想用同样的内容时,可以选中“链接到前一个”按钮,如果不同延用上一节的内容,就别取消选中。

    页眉页脚是可以分别设置是否“链接到前一个”的。

    2.3        页码

    如果文档不分节,页码就比较简单,直接插入页码,或设为第 N 页 共 M 页,都容易,其中N是域“{Page}”,表示当前页码,M是域“{NumPages}”,表示总页数。

    文档分节后,如果需要分别设页码,如目录和正文页码分开,而M要改为域“{SectionPages}”,表示节页数。另外当前页数应该在插入页码时,要选中起始页码,从1开始。

    如果想编辑域,可以点页码右键,选择切换域代码查看修改,也可以选择编辑域选择。

    2.4        插入EXCEL对象

    写文档时,有需要把Excel格表原样复制到Word中来,如果用普通的复制方式,格式会失真,可以采用插入对象的方式。点击插入à对象,选择“由文件创建”,就可以把Excel表格完整格式作为对象插进来,对象大小可以象放大缩小图片一样调整,双击对象可以打开Excel表格来修改。

     

     

    3      附录(快捷键):标题1(ALT+1)

    3.1        标题2(ALT+2)

    正文(ALT+Q)

    正文缩进(ALT+W

    正文中(ALT+E

    正文右(ALT+R

    l      正文项(ALT+T)

    1.      正文编号(ALT+G)

    2.      正文编号(ALT+G)

    3.1.1    标题3 (ALT+3)

    指南(ALT+A)

    指南缩进(ALT+S)

    l      指南项(ALT+D)

    3.1.1.1           标题4(ALT+4)

    表格(ALT+B)

    名称

    类型

     

     

     

    数据数据数据数据

     

     

     

     

     

     

     

     

     

    3.1.1.1.1            标题5(ALT+5)

    清除格式(ALT+C),这个快捷键设置要在工具à自定义à命令à键盘按钮à类别:所有命令à命令:ClearFormattingà请按新快捷键,输入你的快捷键à点指定按钮保存。

    3.1.1.1.1.1     标题6(ALT+6)

    3.1.1.1.1.1.1             标题7(ALT+7)

    3.1.1.1.1.1.1.1      标题8(ALT+8)

    3.1.1.1.1.1.1.1.1              标题9(ALT+9)

  • word复制粘贴导致表格显示不全解决方案

    2013-05-08 16:31:25

    相信大家在做需求分析以及其他日常工作中都会用到word,并且经常会在几份word相互复制粘贴,粘贴过来的表格有时候就出现显示不全、格式凌乱等现象。该文主要解决表格显示不全的问题。

    解决方法:选中目标表格->右键->表格属性->表格->文字环绕,默认应该是环绕(A),需要选择无(N),然后再看看表格效果

  • VSS备份的两种方法

    2013-01-08 10:57:45

    VSS 备份的两种方法

    曾经在论坛中发过一篇关于VSS备份的帖子,可是,写得太潦草,有的网友给我回了帖子,询问一些描述不清晰的地方。所以,我把VSS备份步骤做了整理,附上操作中的一些示意图,希望大家能更好地了解这个过程。如果谁还有看不明白的地方,请发Emailmoonmingyue@yahoo.com.cn)给我,谢谢。  
    方案一: WINDOWS自带的备份功能直接备份VSS数据库目录
    1
    、点击 开始->附件->系统工具->备份

    2
    、选择计划作业->点击添加作业->备份向导->下一步



     

    3
    、备份选定的文件,驱动器或者网络路径->下一步(选择VSS数据库路径)
    在下面这幅图中,您可以选择网络数据。也就是说,这个备份进程如果不是在VSS服务期上运行的话,可以把VSS数据库信息存放的文件夹映射成网络路径。如果在本机上,直接选择VSS数据库信息存放的文件夹就可以啦。


    4
    、在下面这幅图中,备份媒体类型是灰掉的。如果有磁带机等其它媒体格式的话,这个选项就不会是DISABLE的了。
    设定备份媒体或者文件名,并标出路径,下一步。

    5
    、选择备份操作类型,下一步

    6
    、为了安全起见,选择备份后验证数据,下一步。

    7
    、下一步

    8
    、命名备份标签。

    9
    、选择以后选项,输入本机的管理员密码

    10
    、选择设定备份计划

    设定开始备份的时间点



    11
    、给备份作业起个作业名,规定开始时间。

    下一步

    点击完成,你就会看到

    12
    、检查一下吧!开始->附件->系统工具->任务计划 中添加了新的一项。



    13
    、单击右键,选择属性,可以修改自己不满意的设置。

    14
    、设置任务步骤完成。
    15
    、当到了规定的时间,这个任务就会自动运行了 :)

    方案一的另一种解决方法:可以用压缩程序配合WINDOWS任务来实现
    11
    15步介绍的是一种定期COPY工作,如果文件太大,需要压缩,该怎么办呢? 
    例如,用WinRar配合Windoows中的任务计划来实现。
    首先,我们要了解WinRar的命令行格式。
    WinRAR <command> -<switch1> -<switchN> <archive> <files
    。。。> <@listfiles。。。> <path_to_extract\>
    举个例子,
    WinRAR a E:\baktest d:\vss
    表示,将d:\vss 下的数据 压缩到E 盘下一个叫做baktestRar的文件中。

    详细内容可以参考 WinRar提供的帮助文件。

    此方案的具体操作的方法如下:
    16
    、编辑批处理文件applegirlbak.bat 内容如下:
    cd D:\prOGRA~1\winrar30
    winrar a E:\applegirlbak D:\VSS
    保存到D:\
    17
    、打开任务计划

    18
    、选择添加任务计划

    下一步

    19
    、选择 “WinRAR”程序。

    20
    、下一步
    设定任务名称,执行周期

    设定执行时间,开始日期。

    21
    、设定启动任务的用户名,密码。

    点击完成

    这时,任务计划列表中多了一项新的任务

    22
    、单击右键,修改WinRAR属性。
     
    运行字段值为
    D:\applegirlbak.bat

    点击应用
    16
    22 步骤描述了把VSS数据库压缩到指定的路径下的方法。

    压缩后,如何恢复呢?
    举个例子,A机器上的VSS数据库 恢复到 B机器上。
    23
    、将A机器上的VSS数据库的所在的文件拷贝到B机器上。
    24
    、在B机器上的VSS Admin中,选择“OpenSourceSafeDatabase”

    25
    、选择“Browse”,找到从A机器上拷贝过来的的VSS数据库,打开“srcsafe.ini”

    这样,A机器上的VSS数据库就被恢复到B机器上了。
    23
    25讲的是在一个机器上恢复另一个机器上的VSS数据库的例子。
    在本机器上备份和恢复与异机上的原理是一样的。
    方案二、用VSSArchive功能配合bat文件来实现。
    好处:可以细化到每个尽可能小的子项目,备份具有灵活性。
    1
    、首先编写一个批处理文件applebat
    appl.bat
    的内容大致如下:

    @-----------
    SET SSDIR=D:\programfile\visualstudio\VSS
    FOR /F "tokens=1-4 delims=/ " %%i IN ('date /t') DO SET DATE=%%i-%%j-%%k
    D:\programfile\visualstudio\VSS\win32\ssarc -d- -yAdmin
    apple d:\tmp\%DATE%backup1.ssa $/呼叫中心系统

    FOR /F "tokens=1-4 delims=/ " %%i IN ('date /t') DO SET DATE=%%i-%%j-%%k
    D:\programfile\visualstudio\VSS\win32\ssarc -d- -yAdmin
    apple d:\tmp\%DATE%backup2.ssa $/计费系统
    @-----------
    保存到D盘下的BAT目录.其中 

    D:\programfile\visualstudio\VSS\win32\ssarc
    表示ssarc.exe 所在的路径
    d:\tmp\%DATE%backup2.ssa
    表示项目数据将要被备份到的文件所在的路径和文件名
    $/
    计费系统 表示项目在VSS Explorer中的 路径
    FOR
    循环语句是为了能够按照日期+项目名,将同一个项目在不同日期下的备份区别开而添加的,你可以把这个循环语句删掉。
    这个批处理文件备份了两个PROJECT
    2
    、点击开始->附件->系统工具->任务计划->添加任务计划->下一步->浏览->d:\BAT\Apple .bat
    ->
    选择每天->设定起始时间,起始日期->用户名,密码,->完成。

    3
    、以上这几步在方案一的1721步已经描述过。最终在任务计划的属性中,可以看到如下内容。

  • VSS迁移

    2013-01-08 10:54:42

    对VSS源代码库从一个服务器A上迁移到另一个服务器B上,包括修改历史、用户、以及权限。具体方法如下:

          1、在服务器B上安装vss程序后,创建一database,并设置创建后的文件夹为共享,并具有可读写的权限;

          2、运行Visual SourceSafe Administration连接服务器A上的代码库,点击Archive-Archive Projects,选中要迁移的项目,最终生成一ssa文件;

          3、运行Visual SourceSafe Administration连接刚才在服务器B上新建的代码库,点击Archive-Restore Projects,选择刚才生成的ssa文件,即可完成代码库的复制;

          下面是用户、权限的复制:

         将以下文件及文件夹从服务器A上拷贝到B上刚创建的文件夹下全部替换。

          users(目录)
          users.txt
          data\um.dat
          data\rights.dat

      完成以上工作就可以通过vss客户端用原来的用户名和密码登陆新服务器上的database了。

  • 部分客户端不能访问QC(quality center 9.0)服务器的解决方案

    2012-06-19 16:49:06

    前奏:有同事换了台别人在用的电脑,拿来重装了系统,导致不能访问了QC,原来是可以访问的。
     
    部分解决方案:
    1、换多个浏览器(包括QCExplorer专用浏览器),还ghost了一个别的系统,问题依旧,打开QC主页时,一直没发把所有的插件都下载到本地,本次主要是卡在了“下载文档生成器模版中。。。”;
     
    2、将OTAClient.dll拷到C:\Program Files\Common Files\Mercury Interactive\Quality Center\OTAClient.dll,注册使用regsvr32 "C:\Program Files\Common Files\Mercury Interactive\Quality Center\OTAClient.dll",刷新一下就成功了,该方案依旧不能解决;
     
    终极解决方案:
    找一台可以正常是用QC的电脑,找到他的注册信息:C:\Program Files\Common Files\Mercury Interactive,下面所有内容复制到不能正常是用的电脑的对应位置,然后重新打开IE,清除下缓存,应该就可以正常是用了。
     
    PS:该方案只测试成功了以下几个浏览器,别的浏览器暂为测试,不下结论,是否该方案可行:IE6,IE7,IE8,IE9,QCExplorer....360测试了下是不行的。。。
  • QC测试计划导入导出方法(excel)

    2011-05-23 16:57:48

    一、QC中测试计划导出为EXCEL格式方法:

    1.测试计划中,选择 视图/测试网格

    2.点击筛选器,设置筛选条件对用例进行过滤

    3.在筛选器的第二个tab排序,设置测试用例的排列顺序

    4.在用例列表中,点击鼠标右键,导出/全部.

    建议先将需要导出的内容以HTML格式保存,然后再更改文件后缀为.xls格式,这样就不会出现乱码现象了。

    二、将EXCEL中的测试用例导入到QC的方法:

    1.安装excel插件 QCMSExcelAddin90.exe

    2.打开需要上传的excel,第一列描述的是要导入的目录,选中第二列后点击Export To Quality Center (路径:加  载项-Export To Quality Center

    3.在弹出来的对话框中输入QC的链接,用户名、密码、域、项目名称等信息

    4.选择需要导入的类型

    5.选择需要导入的路径

    6.选择需要导入的字段

    7.NEXT,当你看到finish的时候,意味着导入成功,否则就需要对问题进行排查咯。。。

     

     

  • LoadRunner加压并发最大用户数时出现错误解决方法

    2011-05-23 15:26:27

    LoadRunner加压时出现错误:load generator is currently running the maximum number of vuser of this type.

    解决方法:

    Loadruuner默认场景并发最大用户数=1000,所以需要设置load generator->Details->Vuser limits->Other Vusers更换参数值即可,如10000;当然需要你的序列号是支持,目前最大支持6.2w的序列号。

  • 好东西:QPT 11 下载地址

    2010-12-14 11:53:03

    qtp 11:

    http://www.genilogix.com/downloads/unified-functional-testing/quicktest-professional-11.iso

  • 好东西:loadrunner 11(LR11) 下载链接及破解方法

    2010-12-14 11:49:56

    LoadRunner 11下载:
    经本人亲自测试一下链接可以下载到LR11
    http://www.genilogix.com/downloads/loadrunner/loadrunner-11.iso
     
    LoadRunner 11破解:
    破解方法和以前版本相同,我用的是LR8.0的破解文件,同样实用。就是将LR8.0中的以下两个文件替换到LR11安装目录的bin目录下:C:\Program Files\HP\LoadRunner\bin 
    需要替换的两个文件名:lm70.dll   mlr5lprg.dll
     
    LoadRunner 11的license问题:
    提供一个超级license 最高支持6.5w个并发:AEACFSJI-YJKJKJJKEJIJD-BCLBR
    如果用的着的朋友请留言并将该贴顶起来,方便那些需要的朋友,如有转帖的朋友请注明出处,谢谢。
  • Loadrunner脚本录制常见问题整理-分享好东东

    2010-12-14 11:47:37

    1.LoadRunner录制脚本时为什么不弹出IE浏览器?

      当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。

      启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题

      提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。

      2.录制Web脚本时,生成的脚本中存在乱码该如何解决?

      录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选“Support charset”,然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。

      3.HTML-based script与URL-based script的脚本有什么区别?

      使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。

      通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。

      4.为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?

      由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time Setting。

      进入“Run-time Setting”对话框,依次进入“Internet Protocol→Preferences”,勾选Checks下的“Enable Image and text check”选项即可。

      检查执行结果时推荐使用web_reg_find方法。

      5.运行时的Pacing设置主要影响什么?

      Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。

      根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。

      6.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗?

      Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。

      7.LoadRunner 8.0版本的VuGen在录制Web Services协议的脚本时一切正常,而回放时报出错误提示“Error:server returned an incorrectly formatted SOAP response”。这时说明原因引起的?

      造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web Service协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为,因此会有上面的错误提示。

      解决方法:把“LR80WebservicesFPI_setup.exe”和“lrunner_web_sevices_path_1.exe”两个补丁打上即可解决。

      8.VuGen支持Netscape的客户证书吗?

      不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。

      9.VuGen会修改录制浏览器中的代理服务器设置吗?

      会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。

      10.在LoadRunner脚本如何输出当前系统时间?

      LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。

      调用语句与返回值如下示例:

      typedef long time_t;

      Action()

      {

      time_t t;

      lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));

      lr_message(“System time and date: %s”,ctime(&t));

      }

      输出结果为:

      Time in seconds since 1/1/70: 1185329968

      System time and date:Wed Jul 25 10:19:28 2007

      11.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?

      这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。

      由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,则用户登录信息将一并清除,因此迭代时可能会发生错误。

      12.虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?

      如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。

      另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。

      13.在Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?

      这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。

      进入“Run-time Setting”对话框后,依次进入“Internet Protocol→Preference”。然后点击“Options…”按钮,进入高级设置对话框,可以修改各类超时设置的默认值。

      14.为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?

      在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。

      (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。

      (2)找到Windows关键字,Windows关键字如下所示:

      %SystemRoot%\system32\csrss.exe bjectDirectory=\Windows

      SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1

      ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2

      ProfileControl=Off MaxRequestThreads=16

      SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。

      (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。

      通过对注册表的更改,系统将允许运行更多的线程,因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。

     

      录制脚本为空
     
      LR录制是客户端与服务器的数据交互,只有在有交互的时候才可以录制到脚本。
     
      1. 交互方式不一样,通过客户端的server进行交互,在scrīpt中选择最后一个track processes created as COM local servers  [选择scrīpt里的最后一个选项]. 2. 非客户端与服务器的交互的一种操作,在页面上点前进或后退,如果页面是从缓存中取出来的,那么也就没有和服务器数据交互,所以也录制的为空脚本。   [windows注册表中禁用缓存]. 3. 协议选择错误,b/s不一定走http协议,还可能是https(http+ssl)。   [最基础的错误].录制出错。
     
      1.  选择internet里选项里的连接里的局域网设置的代理不能选,因为LR在录制的时候会动态选择。
      2.  网页里的恶意代码,检测的时候响应LR录制脚本[用工具检测恶意代码,然后卸载恶意代码,eg:Ad_Aweare].

      3. 防病毒软件和防火墙,在录制时暂时关闭。
      4. 因为LR自身原因报错或者有些脚本不能录制下来[录制是最好选用scrīpt view,此时会报错,但能写下脚本,是因为LR无法解析,可以手工修改,而tree view 就直接停止了。
     
      Loadrunner不支持默认的浏览器
     
      有时候,我们上网的时候,不小心会将某个浏览器设置为默认的浏览器,而我们不知道,这个时候,我们用loadrunner进行录制的时候,会提示loadrunner不支持系统设置的默认的浏览器,因此,需要我们重新选择浏览器,我们可以利用Reconding optiom中的Browser选项设置支持的浏览器,我们还可以利用下面的方法,将IE设置为默认的浏览器,因为loadrunner是支持IE的。设置方法如下:
     
      在IE“工具(T)”菜单→“Interner选项”→“程序”选项卡里,确保“检查Internet Explorer是否为默认的浏览器”选项打上√。然后在你启动IE时,如果IE非默认浏览器就会出现提示窗是否把IE设置为默认。

  • loadrunner参数化

    2010-06-24 17:20:07

    .        select next row(下一值取值方式)

    l        Sequential(顺序):Vuser按照顺序从数据表中取值,每次当Vuser访问数据表,都返回下一个可用的数据,如果没有足够的数据,VuGen将从数据表的第一行重新开始取值。这种方式强调虚拟用户的一致性,每个用户运行到该点取值是一致的

    l        Random(随机)

    每次Vuser访问数据表时都分配一个随机的值

    l        Unique(唯一)

    唯一的数,为每个Vuser的参数分配唯一的值。与sequential相比,Unique强调的是用户间的差异性,每个用户取到的参数都不一致

    2.        Update value on(更新方式)

    l        Each iteration:每次迭代都取一个新的值,如果在脚本的一次迭代中,该参数出现两次也只取同一个值

    l        Each occurrence:每次遇到参数都取一个新值,如果在脚本的一次迭代中,该参数出现两次,那么两次都取不同的值

    l        Once在一个Vuser中参数都取相同的值(不管几次迭代)

    3.        组合取值说明表

    参数取值和更新方式列表

    update method
    (更新方式)

    数据分配方法

    sequential(顺序)

    random(随机)

    unique(唯一)

    Each iteration
    (每次迭代)

    对于每一次迭代,Vuser都从数据表中取下一个值

    对于每一次迭代,Vuser都从数据表里取一个新的随机值

    对于每一次迭代,Vuser都会从数据表里取下一个唯一值

    Each occurrence
    (
    每次遇到)

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取下一个值

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取一个新的随机值

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取一个新的唯一值

    once
    (一次)

    对于每个Vuser,第一次迭代分配的值和接下来的迭代取相同的值

    对于每个Vuser,第一次迭代分配的随机值和接下来迭代取相同的值

    对于每个Vuser,第一次迭代分配的唯一值和接下来的迭代取相同的值

    4.        Unique参数取值说明

    Select next row = unique需要选下面两个内容

    l        When out of value(当数据表的值不够的时候所做操作)

    Abort user(中止运行):停止运行

    Continue with last value(取最后一个值):Vuser取最后一个值

    Continue in a cyclic manner(循环取值):Vuser从属于他的数据表中的第一个取值开始循环取值

    l        Allocate Vusers value in the Controller(为Vuser分配参数块)

    Automatically allocate block size(自动分块):系统自动为参数分块大小

    自动分块示意图:假设一个Vuser执行完迭代需要4个值

    A1

    A2

    A3

    A4

    A5

    A6

    A7

    A8

    An

    An+1

     

    Vuser1

    Vuser2

    Vuser n

    Vuser n+1

    1)       会按照排队的方式分配参数

    2)       块的大小为一个Vuser运行完毕所需要的参数

    3)       Vuser分到的参数不够,将在自己分的块中进行取值:例如:Vuser n只分到两个参数,Vuser n会按照when out of value的方式取值,如果是Continue with last valueVuser n的参数取值是AnAn+1An+1An+1,如果选择的是Continue in a cyclic mannerVuser n的参数取值是AnAn+1AnAn+1(块内循环)

    4)       Vuser n+1因为没有分到参数会报错

    5)       所需参数总数 块大小* Vuser个数(块大小计算,Each iteration每次迭代)则=迭代次数,Each occurrence每次遇见)则=迭代次数*一次迭代出现次数)

     

    Allocate ** values for each Vuser(分配**块给每个Vuser):手动分块

    手动分块示意图:假设一个Vuser执行完迭代需要4个值,手动分块块大小为3

    A1

    A2

    A3

    A4

    A5

    A6

    A7

    A8

    A9

    Vuser1

    Vuser2

    Vuser3

    1)       会按照分块的方式分参数

    2)       块大小为设定大小

    3)       Vuser分到的参数不够,将在自己分的块中进行取值:例如:因为每个Vuser需要四个参数,所以每个Vuser参数都不够,则Vuser2为例,如果选择的是Continue with last valueVuser 2的参数取值是A4A5A6A6,如果选择的是Continue in a cyclic mannerVuser 2的参数取值是A4A5A6A4(块内循环)

    4)       所需参数总数手动分配块大小* Vuser个数

    注:在controller设置duration的情况下,自动分块的分块方式有所变化,块大小=我们输入的参数总数/ Vuser的个数,其他处理方式和手动分配块大小一致

  • AppScan测安全性问题关注点

    2010-05-13 15:06:17

    用安全性测试工具AppScan进行安全性测试时的关注点:


  • loadrunner直接压SQL中的某些表解决方法

    2010-05-11 15:28:56

    由于开发人员懒得写页面,所以只能用loadrunner直接对SQL数据库进行加压操作...记录下来以防忘记  废话少说,入正题...

    测试前说明:将SQL和LR装在同一台机器上,据说这样做是最好的...不在同一台机器的情况暂没试过;机器上装好LR+SQL;

    1.控制面板-管理工具-数据源 (ODBC)-系统DNS-将SQL SERVER添加进去.

    2.使用generator录制脚本的时候协议选择ODBC(PS:SQL SERVER2000好象选用MS SQL SERVER协议也可以,但是有时候使用这个协议不行的话,改用ODBC就可以了,索性直接用ODBC协议).在Start Recording对话框中的各项填写如下:

    Application type:Win32 Applications

    Program to record:SQL查询分析器这个exe的路径,如:C:\Program Files\Microsoft SQL Server\80\Tools\Binn\isqlw.exe

    Program arguments:可以不用理会

    Working directory:工作目录

    其他不用多说了.

    3.开始录制脚本,重新打开一个查询分析器,连接到目标SQL SERVER服务器,因为我用的是本机,直接用'.'即可.

    4.然后就可以看到正常的录制进展了...

     

  • db2重定向恢复解决方案

    2010-04-19 12:25:17

    db2的重定向恢复

    db2的重新定向恢复是一个比较快的数据库迁移方式,它通过类似克隆的方式,在新的环境中建立和当前数据库一致的一个新数据库,这里说的

    新的环境包括:1.当前实例下;2不同实例下或者别的服务器下,今天抽了点时间做了一个重新定向恢复的例子,现在分享给大家。

    首先,重新定向恢复的大致包括如下4个步骤:
    (一)       备份数据库BACKUPDATABASEOLDDB TO XX
    (二)       恢复数据库RESTORE DATABASE,这里需要加上重新定向的参数REDIRECT,类似:RESTORE DATABASE OLDDB FROM OLDDBBACKUPDIR

    TAKEN AT XX [TO F(F代表盘符:即需要将数据库恢复到那个盘符) ] INTO NEWDB REDIRECT [WITHOUT ROLLING FORWARD]
    (三)       定义新数据库的表空间容器SET TABLESPACE CONTAINERS 0—tablesapceid USING( FILE/[PATH] “F:\ssss”----容器目录[4096

    ---对于DMS必须设置容器大小])
    (四)       再次恢复数据库,这时候需要增加一个参数:CONTINUE类似:RESTORE DATABASE OLDDB CONTINUE

    我这边用到了2个例子,其一:在当前实例下把当前的数据库DWZXT重新定向恢复为DWZ;其二:在新的实例下恢复重新定向恢复数据库DWZXT为

    DWZ


    第一个例子:当前实例下的重定向恢复

    1.       得到当前实例

    C:\>db2 get instance

    当前数据库管理器实例是:DB2

    2.       查看实例下的数据库

    C:\>db2 list db directory

    系统数据库目录


    数据库1条目:

    数据库别名                      = DWZXT
    数据库名称                      = DWZXT
    数据库驱动器                    = D:\DB2
    数据库发行版级别                = a.00
    注释                            =
    目录条目类型                    =间接
    目录数据库分区号                = 0
    备用服务器主机名                =
    备用服务器端口号                =

    3.       连接到数据库,并进行数据库备份,对应第一步骤

    C:\>db2 connect to dwzxt

       数据库连接信息

    数据库服务器         = DB2/NT 8.2.0
    SQL授权标识         = ADMINIST...
    本地数据库别名       = DWZXT


    C:\>db2 force applications all
    DB20000I FORCE APPLICATION命令成功完成。
    DB21024I 该命令为异步的,可能不会立即生效。


    C:\>db2 backup database dwzxt to e:\dbres

    备份成功。此备份映像的时间戳记是:20080223144514

    4.       恢复数据库,对应第二步骤

    C:\>db2 restore database dwzxt from e:\dbres taken at 20080223144514 into dwz r
    edirect without rolling forward
    SQL1277N 复原已检测到一个或多个表空间容器是不可访问的,或者已将它们的状态设置为

    “必须定义存储器”。
    DB20000I RESTORE DATABASE命令成功完成。

    5.       查看新数据库需要定义的表空间容器,并生成容器目录[文件](在当前命令行编辑器中)
    C:\>db2 list tablespaces

               当前数据库的表空间

    表空间标识                        = 0
    名称                              = SYSCATSPACE
    类型                              =系统管理空间
    内容                              =任何数据
    状态                              = 0x2001100
       详细解释:
         复原暂挂
         必须定义存储器
         可以定义存储器

    表空间标识                        = 1
    名称                              = TEMPSPACE1
    类型                              =系统管理空间
    内容                              =系统临时数据
    状态                              = 0x2001100
       详细解释:
         复原暂挂
         必须定义存储器
         可以定义存储器

    表空间标识                        = 2
    名称                              = USERSPACE1
    类型                              =系统管理空间
    内容                              =任何数据
    状态                              = 0x2001100
       详细解释:
         复原暂挂
         必须定义存储器
         可以定义存储器

    表空间标识                        = 3
    名称                              = USERTMPSP
    类型                              =系统管理空间
    内容                              =用户临时数据
    状态                              = 0x2001100
       详细解释:
         复原暂挂
         必须定义存储器
         可以定义存储器
    由以上可以看出我们需要定义4个系统管理表空间的容器:0:SYSCATSPACE、1:TEMPSPACE1、2:USERSPACE1、3:USERTMPSP,最终建好如下目录:
    C:\>dir E:\dwzx
    驱动器E中的卷没有标签。
    卷的序列号是0E00-006F

    E:\dwzx的目录

    2008-02-23 14:48    <DIR>          .
    2008-02-23 14:48    <DIR>          ..
    2008-02-23 14:49    <DIR>          SYSCTBS
    2008-02-23 14:49    <DIR>          SYSTMPTBS1
    2008-02-23 14:50    <DIR>          USERTMPTBS
    2008-02-23 14:50    <DIR>          USERTBS1
                   0个文件              0字节

    6.       定义新数据库的表空间容器,对应步骤3

    C:\>db2 set tablespace containers for 0 using (path "E:\dwzx\SYSCTBS")
    DB20000I SET TABLESPACE CONTAINERS命令成功完成。

    C:\>db2 set tablespace containers for 1 using (path "E:\dwzx\SYSTMPTBS1")
    DB20000I SET TABLESPACE CONTAINERS命令成功完成。

    C:\>db2 set tablespace containers for 2 using (path "E:\dwzx\USERTBS1")
    DB20000I SET TABLESPACE CONTAINERS命令成功完成。

    C:\>db2 set tablespace containers for 3 using (path "E:\dwzx\USERTMPTBS")
    DB20000I SET TABLESPACE CONTAINERS命令成功完成。

    C:\>db2 list tablespaces

               当前数据库的表空间

    表空间标识                        = 0
    名称                              = SYSCATSPACE
    类型                              =系统管理空间
    内容                              =任何数据
    状态                              = 0x2000100
       详细解释:
         复原暂挂
         可以定义存储器

    表空间标识                        = 1
    名称                              = TEMPSPACE1
    类型                              =系统管理空间
    内容                              =系统临时数据
    状态                              = 0x2000100
       详细解释:
         复原暂挂
         可以定义存储器

    表空间标识                        = 2
    名称                              = USERSPACE1
    类型                              =系统管理空间
    内容                              =任何数据
    状态                              = 0x2000100
       详细解释:
         复原暂挂
         可以定义存储器

    表空间标识                        = 3
    名称                              = USERTMPSP
    类型                              =系统管理空间
    内容                              =用户临时数据
    状态                              = 0x2000100
       详细解释:
         复原暂挂
         可以定义存储器

    7.       再次恢复数据库,对应步骤4

    C:\>db2 restore database dwzxt continue
    DB20000I RESTORE DATABASE命令成功完成。

    Ok,搞定下来看一下连接会不会出问题
    C:\>db2 list db directory

    系统数据库目录

    目录中的条目数= 2

    数据库1条目:

    数据库别名                      = DWZ
    数据库名称                      = DWZ
    数据库驱动器                    = C:\DB2
    数据库发行版级别                = a.00
    注释                            =
    目录条目类型                    =间接
    目录数据库分区号                = 0
    备用服务器主机名                =
    备用服务器端口号                =

    数据库2条目:

    数据库别名                      = DWZXT
    数据库名称                      = DWZXT
    数据库驱动器                    = D:\DB2
    数据库发行版级别                = a.00
    注释                            =
    目录条目类型                    =间接
    目录数据库分区号                = 0
    备用服务器主机名                =
    备用服务器端口号                =<SP

  • 收缩日志脚本

    2010-04-19 11:51:39

    --------------设定当前处理数据库----------------
    use [qcsiteadmin_db]
    go
    -----------------------------------------------

    --建立临时表temp0123456789
    --注意如果该表存在会被删除!!!!!!!!!!!!!!
    if exists (select * from sysobjects where id = object_id(N'[dbo].[temp0123456789]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[temp0123456789]

    GO
    -----------------------------------------------


    dbcc shrinkfile (2)

    create table temp0123456789 (char1 char(4000))

    go

    declare @i int

    declare @j int

    --------------------------------
    DECLARE @DoTimes       int          --收缩次数,建议为10次
    set @DoTimes=10
    --------------------------------

    set @j=0


    while (@j < 500)

    begin

     select @i = 0 

     while (@i < @DoTimes)

     begin

       insert into temp0123456789 values ('a')

       select @i = @i +1

     end

     truncate table temp0123456789

     backup log [qcsiteadmin_db] with truncate_only

     set @j=@j+1

     select @j

    end

    dbcc shrinkfile (2)

    go

    --------------清除临时表---------------
    if exists (select * from sysobjects where id = object_id(N'[dbo].[temp0123456789]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[temp0123456789]

    GO
    --------------------------------------

  • db2常用命令以及示例

    2010-04-19 11:44:56

    近一年来在项目开发中使用到了IBM的DB2 9.1的数据库产品,跟Oracle相比一些命令有很大的区别,而它最大的功能是支持xml存储、检索机制,通过XPath进行解析操作,使开发人员免于对xml文件在应用进行解析处理,先对其常用命令进行一下汇总,以免遗忘。

    注意:在执行如下命令时,需要首先安装db2客户端并通过在运行中输入db2cmd进行初始化

    一、基础篇

    1、db2 connect to <数据库名>    --连接到本地数据库名

           db2 connect to <数据库名> user <用户名> using <密码> --连接到远端数据库

    2、 db2 force application all      --强迫所有应用断开数据库连接

       
    3、db2 backup db db2name<数据库名称>  --备份整个数据库数据

           db2 restore db <db2name>                     --还原数据库

    4、db2 list application --查看所有连接(需要连接到具体数据库才能查看)

    5、db2start    --启动数据库
        
          db2stop --停止数据库

    6、create database <数据库名> using codeset utf-8 territory CN    --创建数据库使用utf-8编码

    7、db2 catalog 命令

    db2 catalog tcpip node <接点名称> remote <远程数据库地址> server <端口号>  --把远程数据库映射到本地接点一般为50000

    db2 catalog db <远程数据库名称> as <接点名称>  at node PUB11                       --远程数据库名称到本地接点

    db2 CONNECT TO <接点名称> user <用户名> using <密码>                               --连接本地接点访问远程数据库


    8、数据库导出

    db2look -d <数据库名> -u <用户> -e -o <脚本名称>.sql        --导出数据库的表结构,其中用户空间一般为db2admin/db2inst1

    db2look -d <数据库名> -u <用户> -t <表1> <表2>  -e -o <脚本名称>.sql   --导出数据库中表1和表2的表结构

    db2move <数据库名> export              --导出数据库数据

    db2move <数据库名> export -tn <表1>,<表2>       --导出数据库中表和表数据

    9、数据库导入

    db2 -tvf  <脚本名称>.sql       --把上述导出的表结构导入到数据库表结构

    db2move <数据库名> load -lo replace   --把上述“db2move <数据库名> export “导出的数据导入到数据库中并把相同的数据替换掉 


    在实际使用过程中,如果用到db2自增主键,需要使用by default, 而不是always,功能是一样的,但这样在数据移植时候会很方便!

    10、db2 connect reset 或 db2 terminate    --断开与数据库的连接

    11、db2set db2codepage=1208        --修改页编码为1208

    12、db2 describe table <表名>       --查看表结构

    13、db2 list tables                            --查看数据库中所有表结构

            list tables for system                  --列出所有系统表

    14、db2 list tablespaces                  --列出表空间

    二、高级篇


    15、fetch first 10 rows  only   --列出表中前10条数据

    例如:select * from <表名> fetch first 10 rows only

    16、coalesce(字段名,转换后的值)       --对是null的字段进行值转换

    例如:select coalesce(id,1)  from <表名>    --对表中id如果为null转换成1

    17、dayofweek(日期)     --计算出日期中是周几(1是周日,2是周一.......7是周六)

           dayofweek_iso    --计算出日期中是周几(1是周一.......7是周日)
          
     例如:dayofweek(date(2008-01-16))   --它会返回是4,代表星期三
               
                 dayofweek_iso(date(2008-01-16))   --它会返回是3,代表星期三

    18、dayofyear(日期)   --一年中的第几天,范围在1-366范围之内

    注意:参数中日期的格式是YYYY-MM-DD的形式,如果不是需要进行转换,否则函数不能使用

    例如:日期是20080116必须要进行转换

    dayofweek(concat(concat(concat(substr(openDate,1,4),'-'),concat(substr(openDate,5,2),'-')),substr(openDate,7,2))) as week)

    这样格式正确的。

    19、concatt(参数1,连接值)       --把参数1加上连接值组成一个新值。

      例如: concat('aa','b')    --返回是aab


    把oracle表导入到db2数据库中,有些字段类型需要进行转换,具体看:oracle与db2数据类型转换


          以上是自己经常用到一些db2命令,db2命令很多,不常用的没有在上面记录,以后如使用新命令会继续进行更新!
  • jprofile配置

    2010-04-14 17:08:29

    我装的是6.0,安装过程非常简单,一路next即可搞定.安装完后申请个临时license(10天),前面找对应的was及jdk版本,有点烦琐的记录配置文件路径(按照设计顺序进行),第1个:D:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\xlcs-qaNode01Cell\nodes\xlcs-qaNode01\servers\server1\server.xml;

    第2个:D:\Program Files\IBM\WebSphere\AppServer\bin\startServer.bat 

    PS:有时候链接不上(网络因素)重新链接即可.

    申请临时license的链接:

    http://www.ej-technologies.com/download/jprofiler/trial 输入一个邮箱就可以收到一个临时license了(10天).

  • loadRunner监控windows resources提示“拒绝访问”解决办法

    2010-03-10 11:47:28

    loadRunner监控windows resources提示“拒绝访问”的解决方法:
    1.在loadrunner所在机子上启动服务:Remote Procedure Call(RPC)和Remote Registry Service

    2.开始>运行>\\192.168.200.211 (你要监控的机子的ip),输入管理员用户名和密码,可以访问到被监控机子的一些资源。

    3.完成1,2操作后仍检测不到数据,不妨试试:windows resources统计图>右键>add measurement>delete再重新add;

    4.如果仍旧检测不到数据,则点击windows resources统计图>右键>configure..>点击ok。 


    5.有的人可能是因为不小心点击了“统计图>右键>freeze”才看不到数据的。这个操作的意思是:把这个统计图给冻结了,所以你当然就看不到后来的数据了。怎么办呢?再次点击“统计图>右键>freeze”就可以取消冻结了。过几秒后,数据就出来了。
  • IE7或IE8下不能访问quality center(QC)的解决方法

    2009-08-05 12:00:11

    在安装QC的服务器上找到C:\Program Files\Mercury\Quality Center\jboss\server\default\deploy 20qcbin.war打开找到start_a.htm,对它进行编辑:

    var fMSIE3456 = (ua.lastIndexOf('MSIE 3.0') != -1) || (ua.lastIndexOf('MSIE 4.0') != -1) || (ua.lastIndexOf('MSIE 5.0') != -1) || (ua.lastIndexOf('MSIE 5.5') != -1) || (ua.lastIndexOf('MSIE 6.0') != -1)|| (ua.lastIndexOf('MSIE 7.0') != -1)|| (ua.lastIndexOf('MSIE 8.0') != -1);

    保存即可.

  • 日志 [2013年01月08日]

    2009-06-04 11:31:23

    昨天项目上线测试发生了Out of Memory的JVM错误,导致系统down掉并且服务器文件系统撑爆。检查原因是出现过多内存泄漏,系统的可用内存和性能持续下降;最终将导致内存不足(OutOfMemory)。我们开发用的是IBM WebSphere平台,在websphere/AppServer下生成大量javacore*、heapdump*之类的文件,致使websphere的垃圾回收功能失败而导致。其中,javacore文件是关于cpu的,heapdump文件是关于内存的。

    生产环境是ibm小型机,按照手册修改了:应用程序服务器 > server1 > 进程定义 > Java 虚拟机,将"最大堆大小(默认为256)"改为768或1024以上。删除文件系统中的javacore*,heapdump*后基本恢复正常。分析原因,一是JVM设置问题,二(最终原因)程序不够健壮,很多资源没有即时释放导致资源撑爆。尤其是数据库连接资源。以前也遇到过进程挂起的情况,与此次不同,进程挂起主要原因是SQL查询不能及时返回结果导致页面一直等待资源返回而挂起(suspend)。三是产生大数据量的结果集返回结果。一直怀疑我们用的数据结构不够合理,但是也没有尝试修改。

    总结一下:

    关于架构应该使用健全的模式,使用资源后要及时释放和回收垃圾;

    尽量采用分布式的结构,类似MVC模式;

    努力从程序上解决根本问题。

    附:转载

    WebSphere应用服务器内存泄漏探测与诊断工具

    级别: 中级 李 学朝 (lixuec@cn.ibm.com), 高级软件工程师,IBM中国软件开发中心

    2006 年 11 月 21 日

    本文介绍了如何在WebSphere应用服务器中实现应用程序内存泄漏的探测,并且针对IBM所提供的系列分析与诊断工具,给出了具体的配置步骤和使用最佳实践。
    引言

    内存泄漏是比较常见的一种应用程序性能问题,一旦发生,则系统的可用内存和性能持续下降;最终将导致内存不足(OutOfMemory),系统彻底宕掉,不能响应任何请求,其危害相当严重。同时,Java堆(Heap)中大量的对象以及对象间之复杂关系,导致内存泄漏问题的探测和分析均比较困难,采用相应的辅助工具是很必要的。

    WebSphere应用服务器提供了系列针对内存问题的探测和分析诊断工具,这些工具可以帮助用户进行内存问题的及时探测,保证系统在发生OOM之前,用户可以在无须进行复杂分析的条件下,预知在其部署的应用中是否存在内存泄漏的问题。如果确有内存泄漏现象发生,WebSphere还提供了相应的工具,可以帮助用户进行分析诊断,从而找到内存泄漏的真正原因。

    1. 内存泄漏探测和诊断步骤

    实践中,我们可以采用以下的步骤来处理内存泄漏的问题:

    (1) 首先,在WebSphere中我们启用实时探测内存泄漏工具, WebSphere性能诊断顾问会对内存泄漏提前发出警告信息。

    (2) 启用WebSphere自带的Tivoli性能查看器监视系统的JVM使用状况,确定内存泄漏是否正在发生。

    (3) 根据需要,生成详细内存回收日志,使用PMAT工具分析并确定泄漏的时间,周期等。

    (4) 生成单个或者多个Heapdump文件,选用MDD4J进行分析诊断,找到内存泄漏的真正原因。

    (5) 提交开发部门进行代码修复,然后重新部署到WebSphere应用服务器。

    接下来的部分,我们针对每个环节的配置和工具使用进行阐述。

    2.WebSphere应用服务器中内存泄漏的探测工具

    2.1 性能诊断顾问介绍

    性能诊断顾问(Performance and Diagnostic Advisor),在WebSphere应用服务器6.0.2版本之前称为运行时性能顾问(Runtime Performance Advisor)。该工具可以周期性的检查WebSphere的设置,并给出调整的推荐值。自WebSphere应用服务器6.0.2版本开始,该工具实现了一种轻量级的内存探测机制,可以非常容易的帮助用户探测是否在系统中存在内存泄漏问题,并提前通过日志和管理控制台进行通知。这样就给用户以足够的时间采取必要的措施防止系统宕掉,同时可以收集或生成相关的文件以进行离线的分析,来查找泄漏的根本原因。

    2.2配置

    可以在WebSphere应用服务器的管理控制台中启用性能诊断顾问

    (1) 访问管理控制台 ->服务器-> 应用程序服务器。

    (2) 选择所要配置的服务器。

    (3) 在性能区域,选择性能和诊断顾问程序配置。

    (4) 如图所示,有两个Tab, 运行时和配置。区别在于,运行时里面的内容无须重启服务器就可以生效,但下次重启服务器的时候,这些配置也会丢失。配置Tab里面的内容只有在服务器重启后才生效,而且配置的内容也会一直存在,除非再次登陆并去掉所选项。

    (5)在其他属性区域,点击性能和诊断建议配置,确保内存泄漏规则处于运行状态(绿色箭头)。

    2.3 查看泄漏警告信息

    WebSphere性能诊断顾问输出信息可以显示在WebSphere的管理控制台,并记录在WebSphere应用服务器的SystemOut.log日志文件里面。

    (1) SystemOut.log日志

     [8/31/06 13:21:43:545 CST] 00000010 TraceResponse W   TUNE9001W:  Heap
     utilization patterns indicate that you may have a memory leak
    Additional explanatory data follows.
    Data values for free memory between 8/31/06 1:20 PM and 8/31/06 1:21 PM were
    consistently below minimum required percentage.

    (2) 管理控制台

    -登陆管理控制台->故障诊断 ->运行时消息 ->点击运行时警告

    3. Java 虚拟机概要分析和详细垃圾回收

    进一步检测是否有内存泄漏的发生,以及泄漏发生的时间,周期和速度,我们可以启用Java虚拟机中的详细垃圾回收,然后分析相应的日志。 WebSphere应用服务器6.1使用了Java SDK5.0, 在Window, Linux, AIX, i5/OS,z/Linux 和z/OS上使用了IBM的JAVA虚拟机, 在Solaris和HP-UX上使用Sun的JVM。Java 虚拟机概要分析工具接口(Java Virtual Machine Tool Interface,JVMTI)支持从运行应用程序服务器的 Java 虚拟机(JVM)收集信息(如,关于垃圾回收的数据、对象利用和线程状态)并且支持更全面的性能分析。一旦启用了 JVMTI,可以使用 PMI 定制选项来启用所选统计信息以收集特定数据。

    3.1启用 Java 虚拟机概要分析和详细垃圾回收配置步骤

    配置步骤:

    1. 在控制台导航树中单击服务器 > 应用程序服务器

    2. 单击选择所需应用程序服务器。

    3. 在"服务器基础结构"下,单击 Java 和进程管理-> 进程定义。

    4. 在"其他属性"下,单击 Java 虚拟机。

    5. 选中配置Tab的详细垃圾回收选项。

    6. 在通用 JVM 参数字段中输入 -agentlib:pmiJvmtiProfiler。

    注: WebSphere6.1中,JVM概要分析接口改为Java Virtual Machine Tool Interface (JVMTI)。之前版本是JVMPI。如果需要JVMPI的时候,也可以此处输入-XrunpmiJvmpiProfiler。另外,启用JVMTI接口对性能影响较大,尽量避免在生产环境中使用。

    7.点击应用或者确定。

    8. 单击保存按钮。

    9.重启WebSphere应用服务器。

    3.2 GC数据分析工具PMAT

    在WebSphere应用服务器的日志目录下,native_stderr.log文件就是我们需要的内存回收分析文件。我们推荐使用IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 工具,简称PMAT。 PMAT工具解析JAVA SDK的详细内存回收(GC)日志,并提供统计信息,图表,分析并推荐Java堆配置。PMAT提供了丰富的图形界面来显示Java堆的使用状况,从而更轻松地判断是否有内存问题发生。该工具可以从IBM的alphaWorks网站下载,只有英文版。

    我们可以把GC文件从服务器上下载到PMAT所在机器,然后根据WebSphere的平台选择打开相应的GC文件进行分析。下面是一个GC日志片断,手动分析是比较费劲,而且需要深入了解JVM相关知识。

    PMAT在分析GC日志后,给出一个总结。下图为例,我们可以看出GC对系统性能的影响,以及完成的垃圾回收次数等,并且我们可以看出工具给出的推荐(Recommendations)显示系统的Java堆使用情况是持续增加的。

    进一步,我们可以查看GC的详情,点击Analysis菜单,然后选择Graph View All,我们就可以根据需要选择所要查看的曲线。如图所示,红色曲线代表已使用内存,蓝色曲线代表每次垃圾回收后可用的内存。已使用内存逐渐增加,可用内存的持续降低表明系统可能存在内存泄漏。

    4. TPV监视JVM的状况

    另外一种方法是借助TPV和PMI来实时监视JVM,分析性能曲线来判断是否有内存泄漏的状况发生。 WebSphere性能监控基础结构(PMI)和Java虚拟机概要分析工具接口(JVMTI)可以帮助我们收集系统的性能状况数据,使用Tivoli性能查看器(TPV)以图形的方式显示这些数据(性能计数器),可以进一步证实是否系统正在发生内存泄漏。

    4.1 PMI与TPV

    PMI 提供WebSphere运行时和应用程序资源行为的一组全面的数据,。例如,PMI 提供数据库连接池大小、servlet 响应时间、 Enterprise JavaBeans(EJB)方法响应时间、Java 虚拟机(JVM)垃圾回收时间以及 CPU 使用量等等。使用 PMI 数据,可以识别并修正应用程序服务器中的性能瓶颈, 还可使用 PMI 数据来监控应用程序服务器的运行状况。PMI 数据可以由 Tivoli Performance Viewer(TPV)、其他 Tivoli 工具、您自己的应用程序或第三方工具来监控和分析。TPV 是随 WebSphere Application Server 一起提供的 PMI 数据图形查看器。

    Tivoli Performance Viewer(TPV)使得我们可以通过查看图表或表格,从而解读WebSphere的性能监控基础结构(PMI)数据。

    4.2 PMI的配置方法

    默认情况下,PMI已经开启,级别是默认(Default)。配置步骤:

    1. 在控制台导航树中单击监视&调整-> 性能监视基础结构(PMI)。

    2. 选择所要配置的服务器名字。

    3.单击配置选项卡,这里可以根据监控内容的需要,来选择PMI的任一种统计信息集(无,基本,扩展,全部,定制)。我们这里选择"定制"。

    注:如果在配置选项卡中,则当重新启动服务器时应用设置。如果在运行时选项卡中,则立即应用设置。

    4.点击定制 -> 在定制监视级别的树中,选择配置选项卡,然后点开JVM运行时,可以根据需要,启用或禁用相应的计数器。

    5.保存并重启WebSphere服务器。

    4.3 TPV的使用方法

    实时查看 TPV 性能模块的步骤:

    (1) 在控制台导航树中,单击监控和调整 -> 性能查看器 -> 当前活动 -> 服务器名字)-> 性能模块。

    (2) 选中要查看的每个性能模块,例如JVM运行时。

    (3) 单击查看模块按钮。 在页面的右侧会显示所选性能数据的图形或切换成表格。注:每个模块有与其关联的多个计数器。这些计数器会显示在数据图形或表格下面的表中。您可以通过选择或取消选择计数器旁的复选框,将计数器添加到图表或表中,或从中除去。

    TPV显示的已使用内存的图形理想情况下应该是锯齿状,图形中每个坡(下降)对应着一次内存的垃圾回收(Garbage collection),如下图已使用内存的曲线,显示的是没有发生内存泄漏的状况。

    如果测试过程中出现如下情况,则有可能发生了内存泄漏:

    -每次垃圾回收后的已使用内存的数值骤增。

    -TPV对应的已使用内存图形更接近于阶梯(staircase),或者锯齿形状严重不规则。

    -也可以查看分配的对象数与释放的对象数之差值,如果这个数值越来越大,则有内存泄漏(如果需要查看对象数,需要启用JVMTI接口并在PMI中启用相应的JVM计数器)。

    上图,红色曲线代表已使用的内存,从整体趋势,我们可以看出已使用内存一直在增长。 TPV可以帮助发现内存泄漏,为了得到最优结果,我们可以重复试验,而且每次可以增加测试的时间,例如测试1000,3000或5000个页面请求。

    5. 生成Heap dump文件

    WAS6.1中,在使用IBM JDK的平台上,可以直接使用以下的方法,随时生成所需的heapdump文件。如果在性能诊断顾问程序配置里面选中了"启用自动堆转储收集,则可以自动在WebSphere profile所在的路径下(例如/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01)生成heapdump文件,备用户进行分析。

    在使用IBM SDK的平台上,例如AIX, Linux和Windows,在启用了性能诊断顾问工具后,如果探测到有内存泄漏发生,WebSphere会自动生成两个heapdump文件,供后续分析使用。

    我们在任何时候,可以随时手动生成所需的heap dump文件。在WAS6.1 profile的bin目录下,首先运行wsadmin 脚本客户端,然后可以调用generateHeapDump操作来完成。

    关键步骤:

    1. 找到JVM对象名字。

    set objectName
    WebSphere:type=JVM,process=,node=<节点名字>,*]
    2. 对JVM MBean调用generateHeapDump操作。

    $AdminControl invoke $objectName generateHeapDump
    例如:

    [root@csspvm bin]# pwd
    /opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/bin
    [root@csspvm bin]# ./wsadmin.sh -username root -password demo4you
    WASX7209I: Connected to process "server1" on node csspvmNode02 using SOAP
    connector;  The type of process is: UnManagedProcess
    WASX8011W: AdminTask object is not available.
    WASX7029I: For help, enter: "$Help help"
    wsadmin>set objectName [$AdminControl queryNames
    WebSphere:type=JVM,process=server1, node=csspvmNode02,*]
    WebSphere:name=JVM,process=server1,platform=proxy,node=csspvmNode02,
    j2eeType=JVM,J2EEServer=server1,
    version=6.1.0.0,type=JVM,mbeanIdentifier=JVM,cell=csspvmNode02Cell,spec=1.0
    wsadmin>$AdminControl invoke $ objectName generateHeapDump
    /opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/./heapdump.20060904.075650.3576.phd
    wsadmin>quit
     

    理想情况下,在探测到问题时,尽快生成一个初始的heap dump,然后密切监控内存使用情况,等到泄漏了足够的内存的时候,再生成另外一个heap dump,这样可以对比分析以更准确地找到泄漏的原因。

    注: 生成HeapDump文件的过程是比较耗资源的,所以请只在必须的时候做这样的操作。

    6内存泄漏的分析诊断工具-MDD4J

    一旦确定了系统中有内存泄漏,并且为此生成了heap dump。接下来,我们可以把这些文件从WebSphere应用服务器转移到离线的分析工具所在的机器,进行离线分析诊断。

    6.1 工具介绍

    MDD4J(Memory Dump Diagnostic for Java)是一个内存泄漏分析工具,用于对运行 WebSphere Application Server 的虚拟机(JVM)所生成的常用内存转储(堆转储)格式进行分析。进行内存转储(Memory dump)分析的目的,是为了确定 Java 堆中真正导致内存泄漏的类和包(classes and packages),这样可以缩小内存泄漏的范围并找到真正的原因,此分析还确定应用程序 Java 堆占用量的主要组成部分以及它们之间的拥有关系。

    此工具支持下列格式的内存转储格式有:

    -IBM 的PHD格式(heapdump.phd)

    -IBM 文本堆转储(heapdump.txt)

    -HPROF 堆转储格式(hprof.txt,主要针对Solaris和HP-UX平台)

    -SVC 转储(dump.bin,IBM z-Series上的WebSphere)

    该工具提供了两种分析机制:单转储分析以及对两个转储进行的比较分析。

    单转储分析最常用于在发生 OutOfMemoryException 时自动触发的内存转储。此类分析查找可疑的数据结构,能够相对快速地提供可疑泄漏对象的分析结果。

    比较分析用于对运行内存泄漏应用程序期间(即可用 Java 堆内存流失时)获取的两个内存转储进行分析。在运行泄漏应用程序的早期触发的内存转储被称为基线内存转储,发生泄漏的应用程序运行一段时间(以允许泄漏程度加大)后触发的内存转储被称为主内存转储。在发生了内存泄漏的情况下,主内存转储可能包含大量对象,而这些对象占用的 Java 堆空间量会比基线内存转储大很多。

    为了获得更好的分析结果,建议使主内存转储的触发点与基线内存转储的触发点在时间上拉开一定距离,从而使总耗用堆大小在两个触发点之间大幅增长。

    MDD4J的分析结果显示是基于WEB界面的,具有下列特征:

    - 列示分析结果、堆内容、大小和增长幅度的总结

    - 列示可疑的数据结构、数据类型和包,它们是造成堆使用量增加(对于比较分析)和堆大小较大(对于单转储分析)的主要原因。

    - 拥有关系上下文视图显示了占用量主要组成部分之间的关系,以及一组汇总的主要占用量组成部分所包含的重要数据类型。

    - 在堆转储内容的交互式树形视图中,浏览功能能够显示堆中任何对象的所有进入引用(在树中只显示一个引用,其余引用单独显示)和外出引用,而子对象按到达大小排序。

    - 导航功能使您能够从可疑对象列表转到所有关系上下文,以及从内容视图转到浏览视图。

    - 提供了内存转储中所有对象和数据类型的表视图,视图中具有过滤器和经过排序的列。

    6.2工具的使用

    WebSphere 应用服务器v6.1的附带光盘里面有IBM Support Assistant工具的安装文件,运行相应的安装文件,MDD4J作为插件同时被安装了。

    另外,也可以从IBM 技术支持站点http://www-306.ibm.com/software/support/isa/ 下载Support Assistant工具,然后选择更新程序,独立安装MDD4J插件。

    启动步骤:

    (1) 程序->IBM Support Assitant ->IBM Support Assistant v3

    (2) 在Support Assistant窗口中,选择工具 -> 选择WebSphere版本号。

    点击MDD4J的链接,就可以开启MDD4J工具。在该界面中,我们可以提交单个heap dump文件进行单转储分析,或同时提交两个文件进行比较分析。也可以从内存转储分析结果的下拉选项中选择以前的分析结果,从而查看以前的分析内容。

    查看分析进度

    单击"上载并分析"按钮后,MDD4J开始分析heap dump文件。在分析执行过程中,登录页面将自动刷新,以反映当前正在执行的分析步骤以及整体分析进度。如果该页面由于某种原因而不刷新,您可以单击"刷新"按钮以了解当前分析状态。如果您希望停止分析,可以单击"停止"按钮,这将在当前正在执行的模块完成后终止分析。

    在提交了heap dump文件,MDD4J显示分析状态。

    查看分析结果

    分析完成后,Mdd4J页面将重定向到"分析结果"页面。"分析结果"页面包含 4 个选项卡:

    "分析总结"选项卡:显示分析结果总结,并列示下一组用于查看分析结果的步骤。

    "可疑对象"选项卡:它显示四类可疑对象,即对增长幅度影响最大的数据结构、到达大小显著流失的数据结构、有大量实例的对象类型以及有大量对象实例的 Java 包。

    "察看上下文和内容"选项卡:显示主内存转储中 Java 堆占用量的主要组成部分的拥有关系上下文图,以及图中所选节点的内容。

    "浏览"选项卡:根据对对象引用图执行的深度优先遍历,用树形视图显示主内存转储的所有内容。

    其他内容,请参照MDD4J工具附带的Help文档,该帮助文档有详细的使用说明,在此不再赘述。

    7.小结

    IBM提供了一系列的工具辅助用户进行内存问题的监控和分析,在合适的阶段选择合理的工具可以帮助我们轻松搞定内存泄漏。这里介绍的工具都是WebSphere附带或者免费的,IBM Tivoli工具还提供了更强大的监控和诊断功能,例如ITCAM (IBM Tivoli Composite Application Management),可以根据实际情况选用。

731/41234>
Open Toolbar