<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_技术归档|测试文章|测试工具|开发文档|开发工具|IT幽默|样式设计</title><subtitle type="text">好技术、好文章、好点子、测试文章、测试工具、开发文档、开发工具</subtitle><id>http://feed.cnblogs.com/blog/u/39541/rss</id><updated>2011-10-18T10:14:28Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/39541/rss"/><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178290.html</id><title type="text">如何防止 PHP SQL 注入攻击</title><summary type="text">如何防止 php sql 注入攻击？我认为最重要的一点，就是要对数据类型进行检查和转义。总结的几点规则如下： php.ini 中的 display_errors 选项，应该设为display_errors = off。这样 php 脚本出错之后，不会在 web 页面输出错误，以免让攻击者分析出有作的信息。调用 mysql_query 等 mysql 函数时，前面应该加上 @，即 @mysql_query(...)，这样 mysql 错误不会被输出。同理以免让攻击者分析出有用的信息。另外，有些程序员在做开发时，当 mysql_query出错时，习惯输出错误以及 sql 语句，例如： $t_st</summary><published>2011-09-16T01:35:00Z</published><updated>2011-09-16T01:35:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178290.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178290.html"/><content type="html">如何防止 php sql 注入攻击？我认为最重要的一点，就是要对数据类型进行检查和转义。总结的几点规则如下： &lt;ol&gt;&lt;li&gt;&lt;strong&gt;php.ini 中的 display_errors 选项，应该设为　display_errors = off&lt;/strong&gt;。这样 php 脚本出错之后，不会在 web 页面输出错误，以免让攻击者分析出有作的信息。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;调用 mysql_query 等 mysql 函数时，前面应该加上 @，即 @mysql_query(...)，这样 mysql 错误不会被输出&lt;/strong&gt;。同理以免让攻击者分析出有用的信息。另外，有些程序员在做开发时，当 mysql_query出错时，习惯输出错误以及 sql 语句，例如： &lt;tt&gt;$t_strSQL = "SELECT a from b....";&lt;br/&gt;if ( mysql_query($t_strSQL) )&lt;br/&gt;{&lt;br/&gt;  // 正确的处理&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;  echo "错误! SQL 语句：$t_strSQL \r\n错误信息".mysql_query();&lt;br/&gt;  exit;&lt;br/&gt;}&lt;br/&gt;&lt;/tt&gt;&lt;p&gt;这种做法是相当危险和愚蠢的。如果一定要这么做，最好在网站的配置文件中，设一个全局变量或定义一个宏，设一下 debug 标志：&lt;/p&gt;&lt;tt&gt;全局配置文件中：&lt;br/&gt;define("DEBUG_MODE",0);// 1: DEBUG MODE; 0: RELEASE MODE&lt;br/&gt;&lt;br/&gt;//调用脚本中：&lt;br/&gt;$t_strSQL = "SELECT a from b....";&lt;br/&gt;if ( mysql_query($t_strSQL) )&lt;br/&gt;{&lt;br/&gt;  // 正确的处理&lt;br/&gt;}&lt;br/&gt;else &lt;br/&gt;{&lt;br/&gt;  if (DEBUG_MODE)&lt;br/&gt;    echo "错误! SQL 语句：$t_strSQL \r\n错误信息".mysql_query();&lt;br/&gt;  exit;&lt;br/&gt;}&lt;br/&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;对提交的 sql 语句，进行转义和类型检查&lt;/strong&gt;。 &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;　四. 我写的一个安全参数获取函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了防止用户的错误数据和 php + mysql 注入 ，我写了一个函数 PAPI_GetSafeParam()，用来获取安全的参数值：&lt;/p&gt;&lt;tt&gt;define("XH_PARAM_INT",0);&lt;br/&gt;define("XH_PARAM_TXT",1);&lt;br/&gt;function PAPI_GetSafeParam($pi_strName, $pi_Def = "", $pi_iType = XH_PARAM_TXT)&lt;br/&gt;{&lt;br/&gt;  if ( isset($_GET[$pi_strName]) ) &lt;br/&gt;    $t_Val = trim($_GET[$pi_strName]);&lt;br/&gt;  else if ( isset($_POST[$pi_strName]))&lt;br/&gt;    $t_Val = trim($_POST[$pi_strName]);&lt;br/&gt;  else &lt;br/&gt;    return $pi_Def;&lt;br/&gt;&lt;br/&gt;  // INT&lt;br/&gt;  if ( XH_PARAM_INT == $pi_iType)&lt;br/&gt;  {&lt;br/&gt;    if (is_numeric($t_Val))&lt;br/&gt;      return $t_Val;&lt;br/&gt;    else&lt;br/&gt;      return $pi_Def;&lt;br/&gt;  }&lt;br/&gt;  &lt;br/&gt;  // String&lt;br/&gt;  $t_Val = str_replace("&amp;amp;", "&amp;amp;amp;",$t_Val); &lt;br/&gt;  $t_Val = str_replace("&amp;lt;", "&amp;amp;lt;",$t_Val);&lt;br/&gt;  $t_Val = str_replace("&amp;gt;", "&amp;amp;gt;",$t_Val);&lt;br/&gt;  if ( get_magic_quotes_gpc() )&lt;br/&gt;  {&lt;br/&gt;    $t_Val = str_replace("\\\"", "&amp;amp;quot;",$t_Val);&lt;br/&gt;    $t_Val = str_replace("\\''", "&amp;amp;#039;",$t_Val);&lt;br/&gt;  }&lt;br/&gt;  else&lt;br/&gt;  {&lt;br/&gt;    $t_Val = str_replace("\"", "&amp;amp;quot;",$t_Val);&lt;br/&gt;    $t_Val = str_replace("'", "&amp;amp;#039;",$t_Val);&lt;br/&gt;  }&lt;br/&gt;  return $t_Val;&lt;br/&gt;}&lt;br/&gt;&lt;/tt&gt;&lt;p&gt;在这个函数中，有三个参数：&lt;/p&gt;&lt;tt&gt;$pi_strName: 变量名&lt;br/&gt;$pi_Def: 默认值&lt;br/&gt;$pi_iType: 数据类型。取值为 XH_PARAM_INT, XH_PARAM_TXT, 分别表示数值型和文本型。&lt;/tt&gt;&lt;p&gt;如果请求是数值型，那么调用 is_numeric() 判断是否为数值。如果不是，则返回程序指定的默认值。 &lt;/p&gt;&lt;p&gt;简单起见，对于文本串，我将用户输入的所有危险字符（包括HTML代码），全部转义。由于 php 函数 addslashes()存在漏洞，我用 str_replace()直接替换。get_magic_quotes_gpc() 函数是 php 的函数，用来判断 magic_quotes_gpc 选项是否打开。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;刚才第二节的示例，代码可以这样调用： &lt;/p&gt;&lt;tt&gt;&amp;lt;?&lt;br/&gt;if ( isset($_POST["f_login"] ) )&lt;br/&gt;{&lt;br/&gt;  // 连接数据库...&lt;br/&gt;  // ...代码略...&lt;br/&gt; &lt;br/&gt;  // 检查用户是否存在&lt;br/&gt;  $t_strUid = PAPI_GetSafeParam("f_uid", 0, XH_PARAM_INT);&lt;br/&gt;  $t_strPwd = PAPI_GetSafeParam("f_pwd", "", XH_PARAM_TXT);&lt;br/&gt;  $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1";&lt;br/&gt;  if ( $t_hRes = mysql_query($t_strSQL) )&lt;br/&gt;  {&lt;br/&gt;    // 成功查询之后的处理. 略...&lt;br/&gt;  } &lt;br/&gt;}&lt;br/&gt;?&amp;gt;&lt;br/&gt;&lt;/tt&gt;&lt;p&gt;这样的话，就已经相当安全了。PAPI_GetSafeParam的代码有点长，但牺牲这点效率，对保证安全，是值得的。希望大家多批评指正。：）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/2178290.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178290.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178277.html</id><title type="text">PHP防止SQL注入方法</title><summary type="text">安全，PHP代码编写是一方面，PHP的配置更是非常关键。 我们php手手工安装的，php的默认配置文件在 /usr/local/apache2/conf/php.ini，我们最主要就是要配置php.ini中的内容，让我们执行 php能够更安全。整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击，一下我们慢慢探讨。我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini，如果你是采用其他方式安装，配置文件可能不在该目录。 (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制，能够控制一些php...</summary><published>2011-09-16T01:24:00Z</published><updated>2011-09-16T01:24:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178277.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178277.html"/><content type="html">安全，PHP代码编写是一方面，PHP的配置更是非常关键。&lt;br /&gt;我们php手手工安装的，php的默认配置文件在 /usr/local/apache2/conf/php.ini，我们最主要就是要配置php.ini中的内容，让我们执行php能够更安全。整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击，一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini，如果你是采用其他方式安装，配置文件可能不在该目录。 &lt;p&gt;&lt;span class="style2"&gt;(1) 打开php的安全模式&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;php的安全模式是个非常重要的内嵌的安全机制，能够控制一些php中的函数，比如system()，&lt;br /&gt;同时把很多文件操作函数进行了权限控制，也不允许对某些关键文件的文件，比如/etc/passwd，&lt;br /&gt;但是默认的php.ini是没有打开安全模式的，我们把它打开：&lt;br /&gt;&lt;span class="style2"&gt;safe_mode = on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(2) 用户组安全&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;当safe_mode打开时，safe_mode_gid被关闭，那么php脚本能够对文件进行访问，而且相同&lt;br /&gt;组的用户也能够对文件进行访问。&lt;br /&gt;建议设置为：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;safe_mode_gid = off&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果不进行设置，可能我们无法对我们服务器网站目录下的文件进行操作了，比如我们需要&lt;br /&gt;对文件进行操作的时候。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(3) 安全模式下执行程序主目录&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;如果安全模式打开了，但是却是要执行某些程序的时候，可以指定要执行程序的主目录：&lt;br /&gt;&lt;br /&gt;safe_mode_exec_dir = D:/usr/bin&lt;br /&gt;&lt;br /&gt;一般情况下是不需要执行什么程序的，所以推荐不要执行系统程序目录，可以指向一个目录，&lt;br /&gt;然后把需要执行的程序拷贝过去，比如：&lt;br /&gt;&lt;br /&gt;safe_mode_exec_dir = D:/tmp/cmd&lt;br /&gt;&lt;br /&gt;但是，我更推荐不要执行任何程序，那么就可以指向我们网页目录：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;safe_mode_exec_dir = D:/usr/www&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(4) 安全模式下包含文件&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;如果要在安全模式下包含某些公共文件，那么就修改一下选项：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;safe_mode_include_dir = D:/usr/www/include/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;其实一般php脚本中包含文件都是在程序自己已经写好了，这个可以根据具体需要设置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(5) 控制php脚本能访问的目录&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;使用open_basedir选项能够控制PHP脚本只能访问指定的目录，这样能够避免PHP脚本访问&lt;br /&gt;不应该访问的文件，一定程度上限制了phpshell的危害，我们一般可以设置为只能访问网站目录：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;open_basedir = D:/usr/www&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(6) 关闭危险函数&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;如果打开了安全模式，那么函数禁止是可以不需要的，但是我们为了安全还是考虑进去。比如，&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;我们觉得不希望执行包括system()等在那的能够执行命令的php函数，或者能够查看php信息的&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;phpinfo()等函数，那么我们就可以禁止它们：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;disable_functions = system,passthru,exec,shell_exec,popen,phpinfo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;如果你要禁止任何文件和目录的操作，那么可以关闭很多文件操作&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, &lt;span class="style2"&gt;&lt;/span&gt;rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;以上只是列了部分不叫常用的文件处理函数，你也可以把上面执行命令函数和这个函数结合，&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;就能够抵制大部分的phpshell了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(7) 关闭PHP版本信息在http头中的泄漏&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;我们为了防止黑客获取服务器中php版本的信息，可以关闭该信息斜路在http头中：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;expose_php = Off&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;比如黑客在 telnet www.12345.com 80 的时候，那么将无法看到PHP的信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(8) 关闭注册全局变量&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;在PHP中提交的变量，包括使用POST或者GET提交的变量，都将自动注册为全局变量，能够直接访问，&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;这是对服务器非常不安全的，所以我们不能让它注册为全局变量，就把注册全局变量选项关闭：&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;register_globals = Off&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;当然，如果这样设置了，那么获取对应变量的时候就要采用合理方式，比如获取GET提交的变量var，&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;那么就要用$_GET['var']来进行获取，这个php程序员要注意。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(9) 打开magic_quotes_gpc来防止SQL注入&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;SQL注入是非常危险的问题，小则网站后台被入侵，重则整个服务器沦陷，&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;所以一定要小心。php.ini中有一个设置：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;magic_quotes_gpc = Off&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;这个默认是关闭的，如果它打开后将自动把用户提交对sql的查询进行转换，&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;比如把 ' 转为 \'等，这对防止sql注射有重大作用。所以我们推荐设置为：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;magic_quotes_gpc = On&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(10) 错误信息控制&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;一般php在没有连接到数据库或者其他情况下会有提示错误，一般错误信息中会包含php脚本当&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;前的路径信息或者查询的SQL语句等信息，这类信息提供给黑客后，是不安全的，所以一般服务器建议禁止错误提示：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;display_errors = Off&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;如果你却是是要显示错误信息，一定要设置显示错误的级别，比如只显示警告以上的信息：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;error_reporting = E_WARNING &amp;amp; E_ERROR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;当然，我还是建议关闭错误提示。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;(11) 错误日志&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;建议在关闭display_errors后能够把错误信息记录下来，便于查找服务器运行的原因：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;log_errors = On&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;同时也要设置错误日志存放的目录，建议根apache的日志存在一起：&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;error_log = D:/usr/local/apache2/logs/php_error.log&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"&gt;&lt;/span&gt;注意：给文件必须允许apache用户的和组具有写的权限。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;MYSQL的降权运行&lt;/p&gt;&lt;p&gt;新建立一个用户比如&lt;span class="style2"&gt;mysqlstart&lt;/span&gt;&lt;/p&gt;&lt;p&gt;net user mysqlstart fuckmicrosoft /add &lt;/p&gt;&lt;p&gt;net localgroup users mysqlstart /del &lt;/p&gt;&lt;p&gt;不属于任何组&lt;/p&gt;&lt;p&gt;如果MYSQL装在d:\mysql ，那么，给 mysqlstart 完全控制 的权限&lt;/p&gt;&lt;p&gt;然后在系统服务中设置，MYSQL的服务属性，在登录属性当中，选择此用户 mysqlstart 然后输入密码，确定。&lt;/p&gt;&lt;p&gt;重新启动 MYSQL服务，然后MYSQL就运行在低权限下了。&lt;/p&gt;&lt;p&gt;如果是在windos平台下搭建的apache我们还需要注意一点，apache默认运行是system权限，&lt;br /&gt;这很恐怖，这让人感觉很不爽.那我们就给apache降降权限吧。 &lt;/p&gt;&lt;p&gt;net user apache fuckmicrosoft /add &lt;/p&gt;&lt;p&gt;net localgroup users apache /del &lt;/p&gt;&lt;p&gt;ok.我们建立了一个不属于任何组的用户apche。 &lt;/p&gt;&lt;p&gt;我们打开计算机管理器，选服务，点apache服务的属性，我们选择log on，选择this account，我们填入上面所建立的账户和密码，&lt;br /&gt;重启apache服务，ok，apache运行在低权限下了。 &lt;/p&gt;&lt;p&gt;实际上我们还可以通过设置各个文件夹的权限，来让apache用户只能执行我们想让它能干的事情，给每一个目录建立一个单独能读写的用户。&lt;br /&gt;这也是当前很多虚拟主机提供商的流行配置方法哦，不过这种方法用于防止这里就显的有点大材小用了。&lt;/p&gt;&lt;!--google_ad_section_end--&gt;&lt;/!--google_ad_section_end--&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/2178277.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178277.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178274.html</id><title type="text">php防SQL注入</title><summary type="text">在 SQL 注入攻击 中，用户通过操纵表单或 GET 查询字符串，将信息添加到数据库查询中。例如，假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单，让用户能够登录。清单 5. 简单的登录表单&lt;html&gt;&lt;head&gt;&lt;title&gt;Login&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;form action="verify.php" method="post"&gt;&lt;p&gt;&lt;label for='user</summary><published>2011-09-16T01:22:00Z</published><updated>2011-09-16T01:22:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178274.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178274.html"/><content type="html">&lt;div id="app-share-content"&gt;&lt;p&gt;在 SQL 注入攻击 中，用户通过操纵表单或 &lt;code&gt;&lt;font face="新宋体"&gt;GET&lt;/font&gt;&lt;/code&gt; 查询字符串，将信息添加到数据库查询中。例如，假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单，让用户能够登录。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;清单 5. 简单的登录表单&lt;/strong&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="5" width="45%" bgcolor="#eeeeee" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;&lt;font face="新宋体"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form action="verify.php" method="post"&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;label for='user'&amp;gt;Username&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;input type='text' name='user' id='user'/&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;label for='pw'&amp;gt;Password&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;input type='password' name='pw' id='pw'/&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;input type='submit' value='login'/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个表单接受用户输入的用户名和密码，并将用户输入提交给名为 verify.php 的文件。在这个文件中，PHP 处理来自登录表单的数据，如下所示：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;清单 6. 不安全的 PHP 表单处理代码&lt;/strong&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;&lt;font face="新宋体"&gt;&amp;lt;?php&lt;br /&gt;$okay = 0;&lt;br /&gt;$username = $_POST['user'];&lt;br /&gt;$pw = $_POST['pw'];&lt;br /&gt;&lt;br /&gt;$sql = "select count(*) as ctr from users where &lt;br /&gt;username='".$username."' and password='". $pw."' limit 1";&lt;br /&gt;&lt;br /&gt;$result = mysql_query($sql);&lt;br /&gt;&lt;br /&gt;while ($data = mysql_fetch_object($result)){&lt;br /&gt;if ($data-&amp;gt;ctr == 1){&lt;br /&gt;//they're okay to enter the application!&lt;br /&gt;$okay = 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ($okay){&lt;br /&gt;$_SESSION['loginokay'] = true;&lt;br /&gt;header("index.php");&lt;br /&gt;}else{&lt;br /&gt;header("login.php");&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这段代码看起来没问题，对吗？世 界各地成百（甚至成千）的 PHP/MySQL 站点都在使用这样的代码。它错在哪里？好，记住 &amp;#8220;不能信任用户输入&amp;#8221;。这里没有对来自用户的任何信息进行转义，因此使应用程序容易受到攻击。具体来说，可能会出现任何类型的 SQL 注入攻击。&lt;/p&gt;&lt;p&gt;例如，如果用户输入 &lt;code&gt;&lt;font face="新宋体"&gt;foo&lt;/font&gt;&lt;/code&gt; 作为用户名，输入 &lt;code&gt;&lt;font face="新宋体"&gt;' or '1'='1&lt;/font&gt;&lt;/code&gt; 作为密码，那么实际上会将以下字符串传递给 PHP，然后将查询传递给 MySQL：&lt;/p&gt;&lt;table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;$sql = "select count(*) as ctr  from users where &lt;br /&gt;  username='foo' and password='' or '1'='1' limit 1";&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个查询总是返回计数值 1，因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL，黑客就能装扮成合法的用户。&lt;/p&gt;&lt;p&gt;解决这个问题的办法是，将 PHP 的内置 &lt;code&gt;&lt;font face="新宋体"&gt;mysql_real_escape_string()&lt;/font&gt;&lt;/code&gt; 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义，使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。清单 7 展示了带转义处理的代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;清单 7. 安全的 PHP 表单处理代码&lt;/strong&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;&lt;font face="新宋体"&gt;&amp;lt;?php&lt;br /&gt;$okay = 0;&lt;br /&gt;$username = $_POST['user'];&lt;br /&gt;$pw = $_POST['pw'];&lt;br /&gt;&lt;br /&gt;$sql = "select count(*) as ctr from users where &lt;br /&gt;username='".mysql_real_escape_string($username)."' &lt;br /&gt;and password='". mysql_real_escape_string($pw)."' limit 1"; &lt;br /&gt;&lt;br /&gt;$result = mysql_query($sql);&lt;br /&gt;&lt;br /&gt;while ($data = mysql_fetch_object($result)){&lt;br /&gt;if ($data-&amp;gt;ctr == 1){&lt;br /&gt;//they're okay to enter the application!&lt;br /&gt;$okay = 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ($okay){&lt;br /&gt;$_SESSION['loginokay'] = true;&lt;br /&gt;header("index.php");&lt;br /&gt;}else{&lt;br /&gt;header("login.php");&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;使用 &lt;code&gt;&lt;font face="新宋体"&gt;mysql_real_escape_string()&lt;/font&gt;&lt;/code&gt; 作为用户输入的包装器，就可以避免用户输入中的任何恶意 SQL 注入。如果用户尝试通过 SQL 注入传递畸形的密码，那么会将以下查询传递给数据库：&lt;/p&gt;&lt;table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;select count(*) as ctr from users where \&lt;br /&gt;username='foo' and password='\' or \'1\'=\'1' limit 1"&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;数据库中没有任何东西与这样的密码匹配。仅仅采用一个简单的步骤，就堵住了 Web 应用程序中的一个大漏洞。这里得出的经验是，总是应该对 SQL 查询的用户输入进行转义。&lt;/p&gt;&lt;/div&gt;&lt;div id="appShareUrl" style="clear: both"&gt;&lt;div id="appShareSafeLinkTip" style="display: none"&gt;&lt;div class="appShareErrorIcon"&gt;&lt;/div&gt;为了您的安全，请只打开来源可靠的网址 &lt;/div&gt;来自: &lt;a href="http://hi.baidu.com/luzheng22/blog/item/af49aca48ea018f19052eeea.html" target="_blank"&gt;&lt;font color="#9a9a9a"&gt;http://hi.baidu.com/luzheng22/blog/item/af49aca48ea018f19052eeea.html&lt;/font&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/2178274.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/09/16/2178274.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/09/14/2176232.html</id><title type="text">http错误码整理</title><summary type="text">一、HTTP码应码响应码由三位十进制数字组成，它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型，由它们的第一位数字表示：1.1xx：信息，请求收到，继续处理2.2xx：成功，行为被成功地接受、理解和采纳3.3xx：重定向，为了完成请求，必须进一步执行的动作4.4xx：客户端错误，请求包含语法错误或者请求无法实现5.5xx：服务器错误，服务器不能实现一种明显无效的请求下表显示每个响应码及其含义：所有HTTP状态代码及其定义。代码指示2xx成功200正常；请求已完成。201正常；紧接POST命令。202正常；已接受用于处理，但处理尚未完成。203正常；部分信息—返回的信息只是一部分</summary><published>2011-09-14T07:14:00Z</published><updated>2011-09-14T07:14:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/14/2176232.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/09/14/2176232.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&lt;span&gt;一、&lt;/span&gt;&lt;span&gt;HTTP&lt;/span&gt;&lt;span&gt;码应码&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;响应码由三位十进制数字组成，它们出现在由&lt;span style="font-family: 'Comic Sans MS'"&gt;HTTP&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器发送的响应的第一行。&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;响应码分五种类型，由它们的第一位数字表示：&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;1.1xx&lt;/span&gt;&lt;span&gt;：信息，请求收到，继续处理&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;2.2xx&lt;/span&gt;&lt;span&gt;：成功，行为被成功地接受、理解和采纳&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;3.3xx&lt;/span&gt;&lt;span&gt;：重定向，为了完成请求，必须进一步执行的动作&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;4.4xx&lt;/span&gt;&lt;span&gt;：客户端错误，请求包含语法错误或者请求无法实现&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;5.5xx&lt;/span&gt;&lt;span&gt;：服务器错误，服务器不能实现一种明显无效的请求&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;下表显示每个响应码及其含义：&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span&gt;所有&amp;nbsp;&lt;span style="font-family: 'Comic Sans MS'"&gt;HTTP&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;状态代码及其定义。&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;　代码&amp;nbsp;&amp;nbsp;指示&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2xx&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;成功&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;200&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;正常；请求已完成。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;201&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;正常；紧接&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;POST&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;命令。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;202&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;正常；已接受用于处理，但处理尚未完成。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;203&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;正常；部分信息&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;返回的信息只是一部分。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;204&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;正常；无响应&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;已接收请求，但不存在要回送的信息。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;3xx&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;重定向&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;301&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;已移动&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;请求的数据具有新的位置且更改是永久的。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;302&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;已找到&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;请求的数据临时具有不同&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;URI&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;303&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;请参阅其它&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;可在另一&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;URI&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;下找到对请求的响应，且应使用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;GET&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;方法检索此响应。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;304&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未修改&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;未按预期修改文档。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;305&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;使用代理&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;必须通过位置字段中提供的代理来访问请求的资源。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;306&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未使用&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不再使用；保留此代码以便将来使用。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;4xx&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;客户机中出现的错误&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;400&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;错误请求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;请求中有语法问题，或不能满足请求。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;401&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未授权&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;未授权客户机访问数据。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;402&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;需要付款&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示计费系统已有效。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;403&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;即使有授权也不需要访问。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;404&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;找不到&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器找不到给定的资源；文档不存在。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;407&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;代理认证请求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;客户机首先必须使用代理认证自身。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;415&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;介质类型不受支持&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器拒绝服务请求，因为不支持请求实体的格式。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;5xx&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;服务器中出现的错误&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;500&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;内部错误&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;因为意外情况，服务器不能完成请求。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;501&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未执行&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器不支持请求的工具。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;502&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;错误网关&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器接收到来自上游服务器的无效响应。&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;503&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;无法获得服务&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;&amp;#8212;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;由于临时过载或维护，服务器无法处理请求。&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;400&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;请求无效&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;401.1&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未授权：登录失败&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;401.2&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未授权：服务器配置问题导致登录失败&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;401.3&amp;nbsp;-&amp;nbsp;ACL&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问资源&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;401.4&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未授权：授权被筛选器拒绝&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;401.5&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未授权：&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;ISAPI&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;或&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;CGI&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;授权失败&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;对&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;Internet&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务管理器&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;(HTML)&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的访问仅限于&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;Localhost&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.1&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：禁止可执行访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.2&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：禁止读访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.3&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：禁止写访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.4&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：要求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;SSL&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.5&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：要求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;SSL&amp;nbsp;128&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.6&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;IP&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;地址被拒绝&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.7&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：要求客户证书&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.8&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：禁止站点访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.9&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：连接的用户过多&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.10&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：配置无效&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.11&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：密码更改&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.12&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：映射器拒绝访问&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.13&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：客户证书已被吊销&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.15&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：客户访问许可过多&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.16&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：客户证书不可信或者无效&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;403.17&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;禁止访问：客户证书已经到期或者尚未生效&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;404.1&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;无法找到&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;Web&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;站点&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;404&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;无法找到文件&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;405&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;资源被禁止&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;406&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;无法接受&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;407&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;要求代理身份验证&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;410&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;永远不可用&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;412&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;先决条件失败&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;414&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;请求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;-&amp;nbsp;URI&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;太长&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;内部服务器错误&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500.100&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;内部服务器错误&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;-&amp;nbsp;ASP&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;错误&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500-11&amp;nbsp;&lt;span style="font-family: 宋体"&gt;服务器关闭&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500-12&amp;nbsp;&lt;span style="font-family: 宋体"&gt;应用程序重新启动&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500-13&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;服务器太忙&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500-14&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;应用程序无效&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;500-15&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;不允许请求&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Comic Sans MS'"&gt;global.asa&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Error&amp;nbsp;501&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;未实现&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;HTTP&amp;nbsp;502&amp;nbsp;-&amp;nbsp;&lt;span style="font-family: 宋体"&gt;网关错误&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;转载：&lt;a href="http://www.cnblogs.com/fuhaidasheng/archive/2011/05/30/2063141.html"&gt;http://www.cnblogs.com/fuhaidasheng/archive/2011/05/30/2063141.html&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/2176232.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/09/14/2176232.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954908.html</id><title type="text">LOADRUNNER 登陆功能测试实例（转）</title><summary type="text">原文从http://blog.163.com/venus-yhj/blog/static/95688270200962991842582/转来。正在学习LR录制web登录脚本，十分有用，故转之。或许对其他初学者有些用处。本文中我将介绍LOADRUNNER对事务操作的几个函数，并通过一个例子，说明LOADRUNNER中事务是否成功是如何判断的，同时也介绍如何判断在脚本执行过程中脚本是否真实的执行成功。1.先问个问题，我们带着问题继续 录制一个登陆脚本，对登陆用户和密码进行参数化，使前2个用户名正确，第三个用户名错误，设置脚本迭代3次，分别使用第一个、第二个、第三个用户登陆，此时在脚本中对登陆的提</summary><published>2011-02-15T02:37:00Z</published><updated>2011-02-15T02:37:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954908.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954908.html"/><content type="html">&lt;p&gt;原文从&lt;a href="http://blog.163.com/venus-yhj/blog/static/95688270200962991842582/" target="_blank"&gt;&lt;font color="#000000"&gt;http://blog.163.com/venus-yhj/blog/static/95688270200962991842582/&lt;/font&gt;&lt;/a&gt;转来。&lt;/p&gt;&lt;p&gt;正在学习LR录制web登录脚本，十分有用，故转之。&lt;/p&gt;&lt;p&gt;或许对其他初学者有些用处。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;本文中我将介绍LOADRUNNER对事务操作的几个函数，并通过一个例子，说明LOADRUNNER中事务是否成功是如何判断的，同时也介绍如何判断在脚本执行过程中脚本是否真实的执行成功。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;1.先问个问题，我们带着问题继续&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 录制一个登陆脚本，对登陆用户和密码进行参数化，使前2个用户名正确，第三个用户名错误，设置脚本迭代3次，分别使用第一个、第二个、第三个用户登陆，此时在脚本中对登陆的提交操作加一个事务TR_LOGIN,现在提出问题：运行脚本时&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;第一个用户登陆成功，事务TR_LOGIN是否成功？&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;第二个用户登陆成功，事务TR_LOGIN是否成功？&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;第三个用户登陆失败，事务TR_LOGIN是否成功？&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;答案是：TR_LOGIN事务三次执行时均成功&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;那有人会问，登陆失败为什么事务成功？我们一起来看下面的例子，相信在做过例子后就会得到答案！&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;我这个例子录制的是LOADRUNNER自带的mercuryWebTours&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;录制方法在这里就不介绍了，录制完成并对用户名和密码参数化后的脚本如下：（参数化时其中第三个用户名是错误的）&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double trans_time; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int status;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;web_url("mercuryWebTours",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"URL=http://127.0.0.1:1080/mercuryWebTours/",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Resource=0",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"RecContentType=text/html",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Referer=",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Snapshot=t1.inf",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Mode=HTML",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;LAST);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr_start_transaction("tr_login");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trans_time=lr_get_transaction_duration( "tr_login" );&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//lr_get_transaction_duration这个函数可以得到事务执行所消耗的时间&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; web_reg_find("Text=Error", &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SaveCount=login_Count", LAST);&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//web_reg_find这个函数可以在相应的范围内找到要找的内容，和检查点类似，但这个函数被WEB_FIND多一个参数返回结果，那就是savecount这个值可以记录在指定范围内找到指定内容的个数，这个例子中我们就是通过这个值来判断用户是否真正的登陆成功&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//说明：在登陆失败后，登陆页面会有一个&amp;#8220;ERROR&amp;#8221;的字符串，所以我们认为如果出现该字符串代表登陆失败，这个判断登陆成功或失败的条件，根据具体的项目不同而不同，根据实际情况而定&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = web_submit_form("login.pl",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Snapshot=t2.inf",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ITEMDATA,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Name=username", "Value={name}", ENDITEM,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Name=password", "Value={password}", ENDITEM,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Name=login.x", "Value=51", ENDITEM,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;"Name=login.y", "Value=12", ENDITEM,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;LAST);&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//我们把web_submit_form函数执行的结果赋给status这个变量，如果成功返回0，不成功返回大于0的数&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;if (status == 0) //如果成功&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;lr_end_transaction("tr_login", LR_PASS);//如果提交成功，设置事务状态为PASS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;else &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;lr_end_transaction("tr_login", LR_FAIL);//如果提交失败，设置事务状态为FAIL&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;if (trans_time) //如果该事务消耗了时间输出该时间&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;lr_output_message("tr_login事务耗时 %f 秒", trans_time);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果该事务没有消耗时间，那么输出时间不确定&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;lr_output_message("The duration cannot be determined.");&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;if (atoi(lr_ev&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;al_string("{login_Count}")) &amp;gt; 0){&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//如果在登陆后的页面中找到&amp;#8220;ERROR&amp;#8221;这个字符串，我们认为登陆失败&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr_error_message("Login failed");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;else{&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;//否则登陆成功&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr_output_message("Login successful.");&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(0);&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;return 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;好了，&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;执行这个脚本，得到的结果是：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;第一次迭代时：（在这里只粘贴了一部分关键的日志）&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(15): Notify: Transaction "tr_login" started.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(17): Registering web_reg_find was successful&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26390]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "name" = "huruihai"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "password" = "huruihai"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Registered web_reg_find successful for "Text=Error"&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26362]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Saving Parameter "login_Count = 0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): web_submit_form("login.pl") was successful, 32673 body bytes, 1652 header bytes&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26386]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(30): Notify: Transaction "tr_login" ended with "Pass" status &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(35): login事务耗时 0.002523 秒&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(39): Notify: Parameter Substitution: parameter "login_Count" = "0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(44): Login successful.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;第二次迭代时：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(15): Notify: Transaction "tr_login" started.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(17): Registering web_reg_find was successful&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26390]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "name" = "wangjin"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "password" = "wangjin"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Registered web_reg_find successful for "Text=Error"&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26362]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Saving Parameter "login_Count = 0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): web_submit_form("login.pl") was successful, 32673 body bytes, 1652 header bytes&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26386]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(30): Notify: Transaction "tr_login" ended with "Pass" status &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(35): login事务耗时 0.006644 秒&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(39): Notify: Parameter Substitution: parameter "login_Count" = "0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(44): Login successful.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;第三次迭代时:&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(15): Notify: Transaction &lt;/span&gt;&lt;span style="color: #0000ff"&gt;"tr_login" started.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(17): Registering web_reg_find was successful&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26390]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "name" = "errorname"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Parameter Substitution: parameter "password" = "errorpd"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Registered web_reg_find successful for "Text=Error" (count=3)&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26364]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): Notify: Saving Parameter "login_Count = 3"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(20): web_submit_form("login.pl") was successful, 29263 body bytes, 821 header bytes&amp;nbsp;&amp;nbsp; [MsgId: MMSG-26386]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(30): Notify: Transaction "tr_login" ended with "Pass" status (Duration: 0.6840 Wasted Time: 0.0010).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(35): login事务耗时 0.005852 秒&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(39): Notify: Parameter Substitution: parameter "login_Count" = "3"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.c(40): Error: Login failed&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;Ending act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion Act&lt;/span&gt;&lt;wbr&gt;&lt;span style="color: #0000ff"&gt;ion.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;大家可以看到，事务执行结果总是成功的，但最后一次的登陆确是失败的&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff99cc" size="3"&gt;&lt;span style="color: #0000ff"&gt;我又把最后一次事务提交的请求地址做了错误的参数化，得到的结果是，事务执行失败&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954908.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954908.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954904.html</id><title type="text">LoadRunner常见问题整理</title><summary type="text">1.LoadRunner录制脚本时为什么不弹出IE浏览器？ 当一台主机上安装多个浏览器时， LoadRunner录制脚本经常遇到不能打开浏览器的情况，可以用下面的方法来解决。启动浏览器，打开Internet选项对话框，切换到高级标签，去掉“启用第三方浏览器扩展（需要重启动）”的勾选，然后再次运行VuGen即可解决问题提示：通常安装Firefox等浏览器后，都会勾选上面得选项，导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。2.录制Web脚本时，生成的脚本中存在乱码该如何解决？录制脚本前，打开录制选项配置对话框Reco</summary><published>2011-02-15T02:35:00Z</published><updated>2011-02-15T02:35:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954904.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954904.html"/><content type="html">&lt;strong&gt;1.LoadRunner录制脚本时为什么不弹出IE浏览器？&lt;/strong&gt; &lt;div&gt;当一台主机上安装多个浏览器时， LoadRunner录制脚本经常遇到不能打开浏览器的情况，可以用下面的方法来解决。&lt;/div&gt;&lt;div&gt;启动浏览器，打开Internet选项对话框，切换到高级标签，去掉&amp;#8220;启用第三方浏览器扩展（需要重启动）&amp;#8221;的勾选，然后再次运行VuGen即可解决问题&lt;/div&gt;&lt;div&gt;提示：通常安装Firefox等浏览器后，都会勾选上面得选项，导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;2.录制Web脚本时，生成的脚本中存在乱码该如何解决？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;录制脚本前，打开录制选项配置对话框Record-Options，进入到Advanced标签，先勾选&amp;#8220;Support charset&amp;#8221;，然后选择中支持UTF-8。再次录制，就不会出现中文乱码问题了。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;3.HTML-based script与URL-based script的脚本有什么区别？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;使用&amp;#8220;HTML-based script&amp;#8221;的模式录制脚本，VuGen为用户的每个HTML操作生成单独的步骤，这种脚本看上去比较直观；使用&amp;#8220;URL-based script&amp;#8221;模式录制脚本时，VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求，然后为用户的每个请求分别生成对应方法。&lt;/div&gt;&lt;div&gt;通常，基于浏览器的Web应用会使用&amp;#8220;HTML-based script&amp;#8221;模式来录制脚本；而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议，这时使用&amp;#8220;URL-based script&amp;#8221;模式进行录制。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;4.为什么脚本中添加了检查方法Web-find，但是脚本回放时却没有执行？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;由于检查点功能会耗费一定的资源，因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能，必须修改运行时的配置Run-time Setting。&lt;/div&gt;&lt;div&gt;进入&amp;#8220;Run-time Setting&amp;#8221;对话框，依次进入&amp;#8220;Internet Protocol&amp;#8594;Preferences&amp;#8221;，勾选Checks下的&amp;#8220;Enable Image and text check&amp;#8221;选项即可。&lt;/div&gt;&lt;div&gt;检查执行结果时推荐使用web_reg_find方法。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;5.运行时的Pacing设置主要影响什么？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法：上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。&lt;/div&gt;&lt;div&gt;根据实际需要设置迭代即可。通常，没有时间间隔会产生更大的压力。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;6.运行时设置Log标签中，如果没有勾选&amp;#8220;Enable logging&amp;#8221;，则手工消息可以发送吗？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选，虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;7.LoadRunner 8.0版本的VuGen在录制Web Services协议的脚本时一切正常，而回放时报出错误提示&amp;#8220;Error：server returned an incorrectly formatted SOAP response&amp;#8221;。这时说明原因引起的？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web Service协议的脚本时存在一个缺陷：如果服务器的操作系统是中文的，VuGen会自动将WSDL文件的头改为&amp;lt;?xml version=&amp;#8221;1.0&amp;#8221; encoding=&amp;#8221;zh_cn&amp;#8221;?&amp;gt;，因此会有上面的错误提示。&lt;/div&gt;&lt;div&gt;解决方法：把&amp;#8220;LR80WebservicesFPI_setup.exe&amp;#8221;和&amp;#8220;lrunner_web_sevices_path_1.exe&amp;#8221;两个补丁打上即可解决。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;8.VuGen支持Netscape的客户证书吗？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书，然后将其导入到Internet Explorer中，并确保以相同的顺序导出和导入这些证书。而且，在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;9.VuGen会修改录制浏览器中的代理服务器设置吗？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;会修改。在开始录制基于浏览器的Web Vuser脚本时，VuGen首先会启动指定的浏览器。然后，VuGen会指示浏览器访问VuGen代理服务器。为此，VuGen会修改录制浏览器上的代理服务器设置。默认情况下，VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后，VuGen会将原始代理服务器设置还原到该录制浏览器中。因此，在VuGen进行录制的过程中，不可以更改代理服务器设置，否则将无法正常进行。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;10.在LoadRunner脚本如何输出当前系统时间？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;LoadRunner提供了char *ctime(const time_t *time)函数，调用参数为一个Long型的整数指针，用于存放返回时间的数值表示。&lt;/div&gt;&lt;div&gt;调用语句与返回值如下示例：&lt;/div&gt;&lt;div&gt;&lt;table style="border-right: #999 1px solid; border-top: #999 1px solid; font-size: 12px; border-left: #999 1px solid; width: 80%; border-bottom: #999 1px solid; background-color: #dddddd" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;typedef long time_t;&lt;br /&gt;Action()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time_t t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr_message(&amp;#8220;Time in seconds since 1/1/70: %ld\n&amp;#8221;,time(&amp;amp;t));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lr_message(&amp;#8220;System time and date: %s&amp;#8221;,ctime(&amp;amp;t));&lt;br /&gt;}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;输出结果为：&lt;/div&gt;&lt;div&gt;Time in seconds since 1/1/70: 1185329968&lt;/div&gt;&lt;div&gt;System time and date:Wed Jul 25 10:19:28 2007&lt;/div&gt;&lt;div&gt;&lt;strong&gt;11.一些Web虚拟用户脚本录制后立刻回放没有任何问题，但是当设置迭代次数大于1时，如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;这种现象多是由于在&amp;#8220;Run-time Setting&amp;#8221;的&amp;#8220;Browse Emulation&amp;#8221;的设置中，勾选了&amp;#8220;Simulate a new user on each iteration&amp;#8221;及其下面的选项&amp;#8220;Clear cache on each iteration&amp;#8221;这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。&lt;/div&gt;&lt;div&gt;由于脚本迭代时，init和end只能执行一次，如果每次迭代都模拟一个新的用户并清除缓存，则用户登录信息将一并清除，因此迭代时可能会发生错误。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;12.虚拟客户脚本&amp;#8220;Run-time Setting&amp;#8221;中的线程和进程运行方式的区别？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;如果选择&amp;#8220;Run Vuser as a process&amp;#8221;，则场景运行时会为每一个虚拟用户创建一个进程；选择&amp;#8220;Run Vuser as a thread&amp;#8221;则将每个虚拟用户作为一个线程来运行，在任务管理器中只看到一个mmdrv.exe，这种方式的运行效率更高，能造成更大的压力，时默认选项。&lt;/div&gt;&lt;div&gt;另外，如果启用了IP欺骗功能，则先在Controller中选中Tools菜单下的&amp;#8220;Expert Mode&amp;#8221;，然后将Tools菜单下的&amp;#8220;Options&amp;gt;General&amp;#8221;标签页中的IP地址分配方式也设置为与Vuser运行方式一致，同为线程或进程方式。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;13.在Controller中运行Web相关测试场景时，经常会有很多超时错误提示，如何处理这类问题？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;这主要有脚本的默认超时设置引起。当回放Web脚本时，有时候由于服务器响应时间较长，会产生超时的错误。这时需要修改脚本的运行时配置。&lt;/div&gt;&lt;div&gt;进入&amp;#8220;Run-time Setting&amp;#8221;对话框后，依次进入&amp;#8220;Internet Protocol&amp;#8594;Preference&amp;#8221;。然后点击&amp;#8220;Options&amp;#8230;&amp;#8221;按钮，进入高级设置对话框，可以修改各类超时设置的默认值。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;14.为什么Windows系统中的CPU、内存等资源仍然充足，但是模拟的用户数量却上不去？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;在Windows计算机的标准设置下，操作系统的默认限制只能使用几百个Vuser，这个限制与CPU或内存无关，主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制，须修改Windows注册表。以Windows XP Professional为例。&lt;/div&gt;&lt;div&gt;（1）打开注册表后，进入注册表项HKEY_LOCAL_MACHINE中的下列关键字：System\CurrentControlSet\Control\Session Manager\SubSystems。&lt;/div&gt;&lt;div&gt;（2）找到Windows关键字，Windows关键字如下所示：&lt;/div&gt;&lt;div&gt;%SystemRoot%\system32\csrss.exe bjectDirectory=\Windows&lt;/div&gt;&lt;div&gt;SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1&lt;/div&gt;&lt;div&gt;ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2&lt;/div&gt;&lt;div&gt;ProfileControl=Off MaxRequestThreads=16&lt;/div&gt;&lt;div&gt;SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中，xxxx定义了系统范围堆的最大值（以KB为单位），yyyy定义每个桌面堆得大小。&lt;/div&gt;&lt;div&gt;（3）将yyyy的设置从3072更改为8192（即8MB），增加SharedSection参数值。&lt;/div&gt;&lt;div&gt;通过对注册表的更改，系统将允许运行更多的线程，因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制，而只受硬件和内部可伸缩性限制的约束。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;15.Controller中设置了用户并发数量，但是运行时为何初始化的用户数量少于实际数量？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;主要时设置问题。在Tools&amp;#8594;options&amp;#8594;Run-time setting中可以设置每次最多初始化的虚拟用户。如果需要100个并发用户，则将该值设置为大于100的数值。另外，注意LoadRunner相关协议License的更新，确保使用的License能够允许所需要的并发用户数量。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;16.如何让场景的用户执行发生错误继续运行，以保证不间断进行压力测试？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;用VuGen打开虚拟用户脚本后，进入&amp;#8220;Run-time Settings&amp;#8221;对话框后，依次进入&amp;#8220;General&amp;#8594;Miscellaneous&amp;#8221;，可以看到Miscellaneous设置中关于&amp;#8220;Error Handling&amp;#8221;的配置。勾选&amp;#8220;Continue on error&amp;#8221;即可让虚拟用户发生错误继续运行。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;17.为什么.NET虚拟用户有时不能在远程主机执行？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;主要时LoadRunner的版本问题。根据笔者的经验，如果是Microsoft Visual Studio 2005开发的虚拟用户，同时LoadRunner客户端的版本低于8.1，执行Controller的主机将会发生错误。&lt;/div&gt;&lt;div&gt;因此要想正确的运行Microsoft Visual Studio 2005开发的.NET虚拟用户，客户端最好装8.1以上的版本，Controller的主机则安装8.0和8.1两个版本均可。此外，产生压力的LoadRunner客户端上预先应该安装.NET运行环境，如果Microsoft Visual Studio 2005开发的是.NET虚拟用户，则应该安装Microsoft .NET Framework SDK v2.0。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;18.测试分析结果中会统计Action时间，而实际上可能并不须要这些数据，如何只显示自己定义的用户事务？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;进入脚本的运行时设置，依次进入General&amp;#8594;Miscellaneous。默认情况下，自动事务配置&amp;#8220;Automatic Transactions&amp;#8221;下有两个选项：第一个是把脚本的Action部分定义为一个事务；第二个时把脚本的每一部分定义为一个事务。去掉这两个勾选后，测试结果将会只显示自己定义的用户事务。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;19.测试结果中，Summary和平均事务响应时间图里的各个事务的最大值、平均值、最小值为什么显示不一样？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;主要是受采样时间的影响。Summary里的事务平均响应时间是根据整个场景执行过程得到的数据计算所得，最大值与最小值也是从整个场景中得到的。平均事务响应时间图主要时按照LoadRunner分析出来的采样频率来获取事务响应时间的最大值与最小值，然后计算平均值。&lt;/div&gt;&lt;div&gt;可以通过&amp;#8220;Set Granularity&amp;#8221;来修改平均事务响应时间图的采样频率。如果把&amp;#8220;Granularity&amp;#8221;设为场景执行时间，则统计结果将会一致。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;20.统计结果中的总点击量Total Hits时用户的鼠标点击次数吗？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Total Hits不时按照用户的鼠标点击次数来计算的，而是按照各个虚拟客户端向后台发起的总的请求数来进行统计的。例如在向服务器请求的一个页面中，如果该页面包含5个图片，用户只要单击鼠标就可以访问该页面，而单个虚拟用户在LoadRunner访问的点击量为1+5=6次。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;21.有些Web测试结果分析图（例如每秒返回页面数）在测试结果分析图中无法看到，如何进行配置？&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;用VuGen打开虚拟用户脚本后，进入&amp;#8220;Run-time Settings&amp;#8221;对话框后，依次进入&amp;#8220;Internet Protocol&amp;gt;Preference&amp;#8221;，可以看到一些Web性能图配置。&lt;/div&gt;&lt;div&gt;勾选上面得选项后，Controller将会在测试执行过程中生成数据，然后可在Analysis中查看相应的性能结果分析图。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954904.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954904.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954898.html</id><title type="text">LoadRunner的HTML和URL录制模式</title><summary type="text">在跟使用Loadrunner工具使用者交流的过程中，经常有人提到这个问题，基于HTML（HyperText Markup Language 超文本置标语言）模式录制与基于URL（Uniform Resource Locator的缩写，统一资源定位符，也被称为网页地址，是因特网上标准的资源的地址。）录制模式到底有什么不同？为什么通常情况下我们都会去选择使用URL模式去录制我们的业务脚本？所以在这里我把我知道的东西写出来跟同行分享和交流： HTML是一种高级别的录制模式，这种模式是基于“浏览器”或者说是“内容敏感”的。这种录制选项是让浏览器去决定</summary><published>2011-02-15T02:34:00Z</published><updated>2011-02-15T02:34:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954898.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954898.html"/><content type="html">&lt;span onmouseup="NewHighlight(event)" class="wenzhang_con" id="articlecontent" style="width: 740px"&gt;在跟使用Loadrunner工具使用者交流的过程中，经常有人提到这个问题，基于HTML（HyperText Markup Language 超文本置标语言）模式录制与基于URL（Uniform Resource Locator的缩写，统一资源定位符，也被称为网页地址，是因特网上标准的资源的地址。）录制模式到底有什么不同？为什么通常情况下我们都会去选择使用URL模式去录制我们的业务脚本？所以在这里我把我知道的东西写出来跟同行分享和交流： &lt;p&gt;HTML是一种高级别的录制模式，这种模式是基于&amp;#8220;浏览器&amp;#8221;或者说是&amp;#8220;内容敏感&amp;#8221;的。这种录制选项是让浏览器去决定在回放&lt;a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank"&gt;&lt;font color="#1848b5"&gt;下载&lt;/font&gt;&lt;/a&gt;HTML资源，哪些页面资源（比如图片或者Flash内容）是需要被&lt;a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank"&gt;&lt;font color="#1848b5"&gt;下载&lt;/font&gt;&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;URL是一种低级别的录制模式，这种录制选项不允许浏览器去确定哪些页面资源（比如图片或者Flash内容）是需要&lt;a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank"&gt;&lt;font color="#1848b5"&gt;下载&lt;/font&gt;&lt;/a&gt;的。每项资源在录制回话的过程中都被录制到脚本中。这种级别录制模式同时也会录制其他任何隐藏的对象，比如session ID（也就是会话ID）信息，包括发给服务端和从服务端收到的session ID信息。&lt;/p&gt;&lt;p&gt;脚本方面的不同，HTML级别录制模式将生成的是web_submit_form语句来提交终端用户可以看见或者修改的信息。当基于HTML模式在提交窗体时遇到错误，你可以选择URL模式去录制任何从服务端发送过来的请求和资源。而URL基本录制模式将生成的是web_submit_data语句，这些语句记录的是所有通过浏览器实际发送给服务端的信息。值得注意的是URL录制模式会录制那些HTML模式没有能录制到隐藏信息。通常情况下，隐藏信息里面会包含session ID信息。&lt;/p&gt;&lt;p&gt;写到这里，熟悉的人可能应该明白为什么在通常的情况下，我们选择URL模式去录制我们基于Web（HTTP/HTML）&lt;a class="channel_keylink" href="http://cisco.chinaitlab.com/List_11.html" target="_blank"&gt;&lt;font color="#1848b5"&gt;协议&lt;/font&gt;&lt;/a&gt;的脚本，概括的说就是现在的应用（或者说将来的应用）为了&lt;a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank"&gt;&lt;font color="#1848b5"&gt;安全&lt;/font&gt;&lt;/a&gt;性，都会包含像session ID、token等动态信息。简单的说就是每一访问，服务端都会给客户端发送一个描述会话的session信息，而session ID使用的是动态的生成技术。如果要是脚本能够正常回放，通常需要把这个动态的信息保存下来，这个需要使用到correlation 技术（也就是关联技术）。在以后我会在我的博客里面继续写我对关联的理解（包括自动关联、手工关联、规则等实用技术）。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954898.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954898.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954894.html</id><title type="text">LoadRunner下设置监控Windows系统资源</title><summary type="text">一般在客户端通过LoadRunner对服务器进行压力测试，都需要实时监控服务器端的系统资源，本篇主要简单介绍一下如何设置在LoadRunner的Controller中配置监控Windows Resources，其实也可以直接在远程连接服务器端在上面开启任务管理器或者在控制面板中找到性能计数器来监控也可以，但是为了在LR进行施压过程中更便捷，我们还是要学会这个基本的配置。关于此处的配置，需要针对不同的服务器操作系统进行不同的设置，但基本思路相同。本篇以Windows系统为例，具体配置如下：1、通过客户端与服务器进行网络测试，保证通信畅通2、开启服务器端Windows中的如下两个服务，如下图：3、</summary><published>2011-02-15T02:31:00Z</published><updated>2011-02-15T02:31:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954894.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954894.html"/><content type="html">&lt;p&gt;一般在客户端通过LoadRunner对服务器进行压力测试，都需要实时监控服务器端的系统资源，本篇主要简单介绍一下如何设置在LoadRunner的Controller中配置监控Windows Resources，其实也可以直接在远程连接服务器端在上面开启任务管理器或者在控制面板中找到性能计数器来监控也可以，但是为了在LR进行施压过程中更便捷，我们还是要学会这个基本的配置。关于此处的配置，需要针对不同的服务器操作系统进行不同的设置，但基本思路相同。本篇以Windows系统为例，具体配置如下：&lt;/p&gt;&lt;p&gt;1、通过客户端与服务器进行网络测试，保证通信畅通&lt;/p&gt;&lt;p&gt;2、开启服务器端Windows中的如下两个服务，如下图：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/164952/2011010717384869.jpg" /&gt;&lt;/p&gt;&lt;p&gt;3、需要对服务器的系统本地策略进行更改，这个很重要，也是决定客户端能不能访问服务器端的关键步骤，具体需要进入控制面板下的管理工具中，找到本地安全策略，如下：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/164952/2011010717414958.jpg" /&gt;&lt;/p&gt;&lt;p&gt;注意：这里一定要改成经典模式，默认为仅来宾模式。&lt;/p&gt;&lt;p&gt;4、在客户端进行测试，在&amp;#8220;运行&amp;#8221;栏中输入服务器的ip地址，后面跟上C$，表示服务器C盘下的系统资源目录，如：&amp;#8220;\\192.168.96.135\C$&amp;#8221;,看看是否可以访问服务器C盘目录，通常情况下可能需要输入用户名和密码，填充服务器端的账户和密码就ok，如下所示：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/164952/2011010717453298.jpg" /&gt;&lt;/p&gt;&lt;p&gt;注：如果显示可以访问该页面表示，可以正常访问服务器端的系统资源，也就可以监控。&lt;/p&gt;&lt;p&gt;5、切换到LoadRunner的Controller中在Windows Resources下配置监控目标，具体如下：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/164952/2011010717472266.jpg" /&gt;&lt;/p&gt;&lt;p&gt;通过上图发现，这种配置方式跟系统的性能计数器配置基本类似。&lt;/p&gt;&lt;p&gt;6、看看配置完成后的实时监控记录，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/164952/2011010717482632.jpg" /&gt;&lt;/p&gt;&lt;p&gt;以上是在压力测试过程中，所实时监控的目标服务器的系统资源。&lt;/p&gt;&lt;p&gt;LR是一个功能比较全面的性能测试工具，所以很多细节的功能可能不好设置，但是作用却很大。下次有机会将总结LoadRunner如何监控Linux系统资源。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954894.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954894.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954893.html</id><title type="text">LoadRunner监视的性能计数器用法</title><summary type="text">Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁，说明内存不足。“页交换”是使用称为“页面”的单位，将固定大小的代码和数据块从 RAM 移动到磁盘的过程，其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存，也是可以接受的，但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况，请从以下的对象计数器开始：Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小（4 MB 或更小），</summary><published>2011-02-15T02:30:00Z</published><updated>2011-02-15T02:30:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954893.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954893.html"/><content type="html">&lt;div id="app-share-content"&gt;&lt;p&gt;Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统&amp;#8220;页交换&amp;#8221;频繁，说明内存不足。&amp;#8220;页交换&amp;#8221;是使用称为&amp;#8220;页面&amp;#8221;的单位，将固定大小的代码和数据块从 RAM 移动到磁盘的过程，其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存，也是可以接受的，但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况，请从以下的对象计数器开始：&lt;/p&gt;&lt;p&gt;Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小（4 MB 或更小），则说明计算机上总的内存可能不足，或某程序没有释放内存。&lt;/p&gt;&lt;p&gt;page/sec: 表明由于硬件页面错误而从磁盘取出的页面数，或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百，那么您应该进一步研究页交换活动。有可能需要增加内存，以减少换页的需求（你可以把这个数字乘以4k就得到由此引起的硬盘数据流量）。Pages/sec 的值很大不一定表明内存有问题，而可能是运行使用内存映射文件的程序所致。&lt;/p&gt;&lt;p&gt;page read/sec:页的硬故障，page/sec的子集，为了解析对内存的引用，必须读取页文件的次数。阈值为&amp;gt;5. 越低越好。大数值表示磁盘读而不是缓存读。&lt;/p&gt;&lt;p&gt;由于过多的页交换要使用大量的硬盘空间，因此有可能将导致将页交换内存不足与导致页交换的磁盘瓶径混淆。因此，在研究内存不足不太明显的页交换的原因时，您必须跟踪如下的磁盘使用情况计数器和内存计数器： &lt;br /&gt;Physical Disk\\ % Disk Time &lt;br /&gt;Physical Disk\\ Avg.Disk Queue Length&lt;/p&gt;&lt;p&gt;例如，包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操作速率很低，同时 % Disk Time 和 Avg.Disk Queue Length的值很高，则可能有磁盘瓶径。但是，如果队列长度增加的同时页面读取速率并未降低，则内存不足。&lt;/p&gt;&lt;p&gt;要确定过多的页交换对磁盘活动的影响，请将 Physical Disk\\ Avg.Disk sec/Transfer 和 Memory\\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1，那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况，那么您可能需要更多的内存。&lt;/p&gt;&lt;p&gt;Page Faults/sec:每秒软性页面失效的数目（包括有些可以直接在内存中满足而有些需要从硬盘读取）较page/sec只表明数据不能在内存的指定工作集中立即使用。&lt;/p&gt;&lt;p&gt;Cache Bytes：文件系统缓存（File System Cache），默认情况下为50%的可用物理内存。如IIS5.0 运行内存不够时，它会自动整理缓存。需要关注该计数器的趋势变化&lt;/p&gt;&lt;p&gt;如果您怀疑有内存泄露，请监视 Memory\\ Available Bytes 和 Memory\\ Committed Bytes，以观察内存行为，并监视您认为可能在泄露内存的进程的 Process\\Private Bytes、Process\\Working Set 和Process\\Handle Count。如果您怀疑是内核模式进程导致了泄露，则还应该监视 Memory\\Pool Nonpaged Bytes、Memory\\ Pool Nonpaged Allocs 和 Process(process_name)\\ Pool Nonpaged Bytes。&lt;/p&gt;&lt;p&gt;Pages per second :每秒钟检索的页数。该数字应少于每秒一页。&lt;/p&gt;&lt;p&gt;Process：&lt;/p&gt;&lt;p&gt;%Processor Time: 被处理器消耗的处理器时间数量。如果服务器专用于sql server,可接受的最大上限是80-85%&lt;/p&gt;&lt;p&gt;Page Faults/sec:将进程产生的页故障与系统产生的相比较，以判断这个进程对系统页故障产生的影响。&lt;/p&gt;&lt;p&gt;Work set: 处理线程最近使用的内存页，反映了每一个进程使用的内存页的数量。如果服务器有足够的空闲内存，页就会被留在工作集中，当自由内存少于一个特定的阈值时，页就会被清除出工作集。&lt;/p&gt;&lt;p&gt;Inetinfo:Private Bytes:此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低，则此计数器可以是内存泄漏的最佳指示器。&lt;/p&gt;&lt;p&gt;Processor：监视&amp;#8220;处理器&amp;#8221;和&amp;#8220;系统&amp;#8221;对象计数器可以提供关于处理器使用的有价值的信息，帮助您决定是否存在瓶颈。&lt;/p&gt;&lt;p&gt;%Processor Time:如果该值持续超过95%，表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。&lt;/p&gt;&lt;p&gt;%User Time:表示耗费CPU的数据库操作，如排序，执行aggregate functions等。如果该值很高，可考虑增加索引，尽量使用简单的表联接，水平分割大表格等方法来降低该值。&lt;/p&gt;&lt;p&gt;%Privileged Time：（CPU内核时间）是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"Physical Disk"参数值一直很高，表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM，减低"max async IO"，"max lazy writer IO"等措施都会降低该值。&lt;/p&gt;&lt;p&gt;此外，跟踪计算机的服务器工作队列当前长度的 Server Work Queues\\ Queue Length 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值，而不是一段时间的平均值。&lt;/p&gt;&lt;p&gt;% DPC Time:越低越好。在多处理器系统中，如果这个值大于50%并且Processor:% Processor Time非常高，加入一个网卡可能会提高性能，提供的网络已经不饱和。&lt;/p&gt;&lt;p&gt;Thread&lt;/p&gt;&lt;p&gt;ContextSwitches/sec: (实例化inetinfo 和dllhost 进程) 如果你决定要增加线程字节池的大小，你应该监视这三个计数器（包括上面的一个）。增加线程数可能会增加上下文切换次数，这样性能不会上升反而会下降。如果十个实例的上下文切换值非常高，就应该减小线程字节池的大小。&lt;/p&gt;&lt;p&gt;Physical Disk:&lt;/p&gt;&lt;p&gt;%Disk Time %:指所选磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。如果三个计数器都比较大，那么硬盘不是瓶颈。如果只&lt;/p&gt;&lt;p&gt;%Disk Time比较大，另外两个都比较适中，硬盘可能会是瓶颈。在记录该计数器之前，请在Windows 2000 的命令行窗口中运行diskperf -yD。若数值持续超过80%，则可能是内存泄漏。&lt;/p&gt;&lt;p&gt;Avg.Disk Queue Length:指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。该值应不超过磁盘数的1.5~2 倍。要提高性能，可增加磁盘。注意：一个Raid Disk实际有多个磁盘。&lt;/p&gt;&lt;p&gt;Average Disk Read/Write Queue Length:指读取(写入)请求(列队)的平均数。&lt;/p&gt;&lt;p&gt;Disk Reads(Writes)/s: 物理磁盘上每秒钟磁盘读、写的次数。两者相加，应小于磁盘设备最大容量。&lt;/p&gt;&lt;p&gt;Average Disksec/Read: 指以秒计算的在此盘上读取数据的所需平均时间。&lt;/p&gt;&lt;p&gt;Average Disk sec/Transfer:指以秒计算的在此盘上写入数据的所需平均时间。&lt;/p&gt;&lt;p&gt;Network Interface：&lt;/p&gt;&lt;p&gt;Bytes Total/sec :为发送和接收字节的速率，包括帧字符在内。判断网络连接速度是否是瓶颈，可以用该计数器的值和目前网络的带宽比较&lt;/p&gt;&lt;p&gt;SQLServer性能计数器：&lt;/p&gt;&lt;p&gt;Access Methods(访问方法) 用于监视访问数据库中的逻辑页的方法。&lt;/p&gt;&lt;p&gt;Full Scans/sec(全表扫描/秒) 每秒不受限的完全扫描数。可以是基本表扫描或全索引扫描。如果这个计数器显示的值比1或2高，应该分析你的查询以确定是否确实需要全表扫描，以及S Q L查询是否可以被优化。&lt;/p&gt;&lt;p&gt;Page splits/sec(页分割/秒)由于数据更新操作引起的每秒页分割的数量。&lt;/p&gt;&lt;p&gt;Buffer Manager(缓冲器管理器)：监视 Microsoft&amp;#174; SQL Server? 如何使用： 内存存储数据页、内部数据结构和过程高速缓存；计数器在 SQL Server 从磁盘读取数据库页和将数据库页写入磁盘时监视物理 I/O。 监视 SQL Server 所使用的内存和计数器有助于确定： 是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样，SQL Server 必须从磁盘检索数据。 是否可通过添加更多内存或使更多内存可用于数据高速缓存或 SQL Server 内部结构来提高查询性能。&lt;/p&gt;&lt;p&gt;SQL Server 需要从磁盘读取数据的频率。与其它操作相比，例如内存访问，物理 I/O 会耗费大量时间。尽可能减少物理 I/O 可以提高查询性能。&lt;/p&gt;&lt;p&gt;.Page Reads/sec：每秒发出的物理数据库页读取数。这一统计信息显示的是在所有数据库间的物理页读取总数。由于物理 I/O 的开销大，可以通过使用更大的数据高速缓存、智能索引、更高效的查询或者改变数据库设计等方法，使开销减到最小。&lt;/p&gt;&lt;p&gt;.Page Writes/sec (.写的页/秒) 每秒执行的物理数据库写的页数。&lt;/p&gt;&lt;p&gt;.Buffer Cache Hit Ratio. 在&amp;#8220;缓冲池&amp;#8221;（Buffer Cache/Buffer Pool）中没有被读过的页占整个缓冲池中所有页的比率。可在高速缓存中找到而不需要从磁盘中读取的页的百分比。这一比率是高速缓存命中总数除以自 SQL Server 实例启动后对高速缓存的查找总数。经过很长时间后，这一比率的变化很小。由于从高速缓存中读数据比从磁盘中读数据的开销要小得多，一般希望这一数值高一些。通常，可以通过增加 SQL Server 可用的内存数量来提高高速缓存命中率。计数器值依应用程序而定，但比率最好为90% 或更高。增加内存直到这一数值持续高于90%，表示90% 以上的数据请求可以从数据缓冲区中获得所需数据。&lt;/p&gt;&lt;p&gt;Lazy Writes/sec(惰性写/秒)惰性写进程每秒写的缓冲区的数量。值最好为0。&lt;/p&gt;&lt;p&gt;Cache Manager(高速缓存管理器) 对象提供计数器，用于监视 Microsoft&amp;#174; SQL Server? 如何使用内存存储对象，如存储过程、特殊和准备好的 Transact-SQL 语句以及触发器。&lt;/p&gt;&lt;p&gt;Cache Hit Ratio(高速缓存命中率，所有Cache&amp;#8221;的命中率。在SQL Server中，Cache可以包括Log Cache，Buffer Cache以及Procedure Cache，是一个总体的比率。) 高速缓存命中次数和查找次数的比率。对于查看SQL Server高速缓存对于你的系统如何有效，这是一个非常好的计数器。如果这个值很低，持续低于80%，就需要增加更多的内存。&lt;/p&gt;&lt;p&gt;Latches(闩) 用于监视称为闩锁的内部 SQL Server 资源锁。监视闩锁以明确用户活动和资源使用情况，有助于查明性能瓶颈。&lt;/p&gt;&lt;p&gt;Average Latch Wait Ti m e ( m s ) (平均闩等待时间(毫秒)) 一个SQL Server线程必须等待一个闩的平均时间，以毫秒为单位。如果这个值很高，你可能正经历严重的竞争问题。&lt;/p&gt;&lt;p&gt;Latch Waits/sec (闩等待/秒) 在闩上每秒的等待数量。如果这个值很高，表明你正经历对资源的大量竞争。&lt;/p&gt;&lt;p&gt;Locks(锁) 提供有关个别资源类型上的 SQL Server 锁的信息。锁加在 SQL Server 资源上（如在一个事务中进行的行读取或修改），以防止多个事务并发使用资源。例如，如果一个排它 (X) 锁被一个事务加在某一表的某一行上，在这个锁被释放前，其它事务都不可以修改这一行。尽可能少使用锁可提高并发性，从而改善性能。可以同时监视 Locks 对象的多个实例，每个实例代表一个资源类型上的一个锁。&lt;/p&gt;&lt;p&gt;Number of Deadlocks/sec(死锁的数量/秒) 导致死锁的锁请求的数量&lt;/p&gt;&lt;p&gt;Average Wait Time(ms) (平均等待时间(毫秒)) 线程等待某种类型的锁的平均等待时间&lt;/p&gt;&lt;p&gt;Lock Requests/sec(锁请求/秒) 每秒钟某种类型的锁请求的数量。&lt;/p&gt;&lt;p&gt;Memory manager:用于监视总体的服务器内存使用情况，以估计用户活动和资源使用，有助于查明性能瓶颈。监视 SQL Server 实例所使用的内存有助于确定：&lt;/p&gt;&lt;p&gt;是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样，SQL Server 必须从磁盘检索数据。&lt;/p&gt;&lt;p&gt;是否可以通过添加更多内存或使更多内存可用于数据高速缓存或 SQL Server 内部结构来提高查询性能。&lt;/p&gt;&lt;p&gt;Lock blocks:服务器上锁定块的数量，锁是在页、行或者表这样的资源上。不希望看到一个增长的值。&lt;/p&gt;&lt;p&gt;Total server memory：sql server服务器当前正在使用的动态内存总量.&lt;/p&gt;&lt;p&gt;监视IIS需要的一些计数器&lt;/p&gt;&lt;p&gt;Internet Information Services Global:&lt;/p&gt;&lt;p&gt;File Cache Hits %、File CacheFlushes、File Cache Hits&lt;/p&gt;&lt;p&gt;File Cache Hits %是全部缓存请求中缓存命中次数所占的比例，反映了IIS 的文件缓存设置的工作情况。对于一个大部分是静态网页组成的网站，该值应该保持在80%左右。而File Cache Hits是文件缓存命中的具体值，File CacheFlushes 是自服务器启动之后文件缓存刷新次数，如果刷新太慢，会浪费内存；如果刷新太快，缓存中的对象会太频繁的丢弃生成，起不到缓存的作用。通过比较File Cache Hits 和File Cache Flushes 可得出缓存命中率对缓存清空率的比率。通过观察它两个的值，可以得到一个适当的刷新值（参考IIS 的设置ObjectTTL 、MemCacheSize 、MaxCacheFileSize）&lt;/p&gt;&lt;p&gt;Web Service:&lt;/p&gt;&lt;p&gt;Bytes Total/sec:显示Web服务器发送和接受的总字节数。低数值表明该IIS正在以较低的速度进行数据传输。&lt;/p&gt;&lt;p&gt;Connection Refused：数值越低越好。高数值表明网络适配器或处理器存在瓶颈。&lt;/p&gt;&lt;p&gt;Not Found Errors：显示由于被请求文件无法找到而无法由服务器满足的请求数（HTTP状态代码404）&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 9pt"&gt;页面分解&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果某个&lt;/span&gt; &lt;span style="font-size: 9pt"&gt;transaction&lt;/span&gt; &lt;span style="font-size: 9pt"&gt;的时间过长，为了分析问题出在哪里？就可以利用页面分解了，它可以把每个页面分解成：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div forimg="1"&gt;&lt;a href="http://hiphotos.baidu.com/apr13th/pic/item/eb799b1336e5efcff6039e13.jpg" target="_blank"&gt;&lt;img src="http://hiphotos.baidu.com/apr13th/abpic/item/eb799b1336e5efcff6039e13.jpg" border="0" small="1"  alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 9pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DNS&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;解析时间：浏览器访问一个网站的时候，一般用的是域名，需要&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;dns&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;服务器把这个域名解析为&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;IP&lt;/span&gt;，这个过程就是域名解析时间，如果我们在局域网内直接使用IP访问的话，就没有这个时间了。&lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection&lt;span style="font-size: 9pt"&gt;：解析出&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Web Server &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;的&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;IP&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;地址后，浏览器请求被送到了&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Web Server&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;，然后浏览器和&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Web Server &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;之间需要建立一个初始化&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;HTTP&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;连接，服务器端需要做&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;2&lt;/span&gt;件事：一是接收请求，二是分配进程，建立该连接的过程就是connection时间。&lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First Buffer&lt;span style="font-size: 9pt"&gt;：建立连接后，从&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Web Server &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;发出第一个数据包，经过网络传输到客户端，浏览器成功接受到第一字节的时间就是&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;First Buffer&lt;/span&gt;。这个度量时间不仅可以表示Web Server 的延迟时间，还可以表示出网络的反应时间。&lt;br /&gt;&lt;span style="font-size: 9pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Receive：从浏览器接收到第一个字节起，直到成功收到最后一个字节，下载完成止，这段时间就是receive时间。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-size: 9pt"&gt;其他的时间还有&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;SSL Handshaking&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;（&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;SSL &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;握手协议，用到该协议的页面比较少）、&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Client&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Time&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;（请求在客户端浏览器延迟的时间，可能是由于客户端浏览器的&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;think time &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;或者客户端&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;其他方面引起的延迟）、&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Error Time&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;（从发送了一个&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;HTTP &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;请求，到&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;Web Server &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;发送回一个&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;HTTP &lt;/span&gt;&lt;span style="font-size: 9pt"&gt;错误信息，需要的时间）&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div id="appShareUrl" style="clear: both"&gt;&lt;div id="appShareSafeLinkTip" style="display: none"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;来自: &lt;a onmousedown="share.safelink.showConfirm(this);" href="http://hi.baidu.com/apr13th/blog/item/dcc41eb3d8d685a0d8335aeb.html" target="_blank"&gt;http://hi.baidu.com/apr13th/blog/item/dcc41eb3d8d685a0d8335aeb.html&lt;/a&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954893.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954893.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954892.html</id><title type="text">LoadRunner监视的性能计数器</title><summary type="text">今天，我先把我整理的一些计数器及其阈值要求等贴出来，这些计数器是针对我对windows操作系统，C/S结构的sql server数据库及WEB平台.net产品测试时的一些计数器；大家可以继续补充，作过unix平台上oracle数据库测试及J2EE架构及WEBLOGIC方面测试的朋友，也希望把自己使用的计数器贴出来，让大家分享。 好了，先说这些了，希望通过这个专题，最终能让大家对自己的测试结果进行分析。 Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁，说明内存不足。“页交换”是使用称为“页面&amp;#</summary><published>2011-02-15T02:29:00Z</published><updated>2011-02-15T02:29:00Z</updated><author><name>广陵散仙（www.cnblogs.com/junzhongxu/）</name><uri>http://www.cnblogs.com/junzhongxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954892.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954892.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;font size="2"&gt;今天，我先把我整理的一些计数器及其阈值要求等贴出来，这些计数器是针对我对windows操作系统，C/S结构的sql &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server数据库及WEB平台.net产品测试时的一些计数器；大家可以继续补充，作过unix平台上oracle数据库测试及J2EE架构及WEBLOGIC方面测试的朋友，也希望把自己使用的计数器贴出来，让大家分享。 &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 好了，先说这些了，希望通过这个专题，最终能让大家对自己的测试结果进行分析。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Memory: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 内存使用情况可能是系统性能中最重要的因素。如果系统&amp;#8220;页交换&amp;#8221;频繁，说明内存不足。&amp;#8220;页交换&amp;#8221;是使用称为&amp;#8220;页面&amp;#8221;的单位，将固定大小的代码和数据块从 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RAM 移动到磁盘的过程，其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 能够使用比实际更多的内存，也是可以接受的，但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况，请从以下的对象计数器开始： &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小（4 MB &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 或更小），则说明计算机上总的内存可能不足，或某程序没有释放内存。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; page/sec: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 表明由于硬件页面错误而从磁盘取出的页面数，或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百，那么您应该进一步研究页交换活动。有可能需要增加内存，以减少换页的需求（你可以把这个数字乘以4k就得到由此引起的硬盘数据流量）。Pages/sec &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的值很大不一定表明内存有问题，而可能是运行使用内存映射文件的程序所致。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; page read/sec:页的硬故障，page/sec的子集，为了解析对内存的引用，必须读取页文件的次数。阈值为&amp;gt;5. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 越低越好。大数值表示磁盘读而不是缓存读。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 由于过多的页交换要使用大量的硬盘空间，因此有可能将导致将页交换内存不足与导致页交换的磁盘瓶径混淆。因此，在研究内存不足不太明显的页交换的原因时，您必须跟踪如下的磁盘使用情况计数器和内存计数器： &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical Disk\\ % Disk Time &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical Disk\\ Avg.Disk Queue Length &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如，包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操作速率很低，同时 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % Disk Time 和 Avg.Disk Queue &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length的值很高，则可能有磁盘瓶径。但是，如果队列长度增加的同时页面读取速率并未降低，则内存不足。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要确定过多的页交换对磁盘活动的影响，请将 Physical Disk\\ Avg.Disk sec/Transfer 和 Memory\\ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1，那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况，那么您可能需要更多的内存。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Faults/sec:每秒软性页面失效的数目（包括有些可以直接在内存中满足而有些需要从硬盘读取）较page/sec只表明数据不能在内存的指定工作集中立即使用。 &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cache Bytes：文件系统缓存（File System Cache），默认情况下为50%的可用物理内存。如IIS5.0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 运行内存不够时，它会自动整理缓存。需要关注该计数器的趋势变化 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果您怀疑有内存泄露，请监视 Memory\\ Available Bytes 和 Memory\\ Committed &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes，以观察内存行为，并监视您认为可能在泄露内存的进程的 Process\\Private Bytes、Process\\Working &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set 和Process\\Handle Count。如果您怀疑是内核模式进程导致了泄露，则还应该监视 Memory\\Pool Nonpaged &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes、Memory\\ Pool Nonpaged Allocs 和 Process(process_name)\\ Pool &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nonpaged Bytes。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pages per second :每秒钟检索的页数。该数字应少于每秒一页。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Process： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Processor Time: 被处理器消耗的处理器时间数量。如果服务器专用于sql server,可接受的最大上限是80-85% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page Faults/sec:将进程产生的页故障与系统产生的相比较，以判断这个进程对系统页故障产生的影响。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Work set: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 处理线程最近使用的内存页，反映了每一个进程使用的内存页的数量。如果服务器有足够的空闲内存，页就会被留在工作集中，当自由内存少于一个特定的阈值时，页就会被清除出工作集。 &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inetinfo:Private &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes:此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低，则此计数器可以是内存泄漏的最佳指示器。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Processor：监视&amp;#8220;处理器&amp;#8221;和&amp;#8220;系统&amp;#8221;对象计数器可以提供关于处理器使用的有价值的信息，帮助您决定是否存在瓶颈。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Processor Time:如果该值持续超过95%，表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %User Time:表示耗费CPU的数据库操作，如排序，执行aggregate &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; functions等。如果该值很高，可考虑增加索引，尽量使用简单的表联接，水平分割大表格等方法来降低该值。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Privileged Time：（CPU内核时间）是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"Physical &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Disk"参数值一直很高，表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM，减低"max async IO"，"max &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lazy writer IO"等措施都会降低该值。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 此外，跟踪计算机的服务器工作队列当前长度的 Server Work Queues\\ Queue Length &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值，而不是一段时间的平均值。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; % DPC Time:越低越好。在多处理器系统中，如果这个值大于50%并且Processor:% Processor &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Time非常高，加入一个网卡可能会提高性能，提供的网络已经不饱和。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextSwitches/sec: (实例化inetinfo 和dllhost 进程) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你决定要增加线程字节池的大小，你应该监视这三个计数器（包括上面的一个）。增加线程数可能会增加上下文切换次数，这样性能不会上升反而会下降。如果十个实例的上下文切换值非常高，就应该减小线程字节池的大小。 &lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical Disk: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Disk Time %:指所选磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。如果三个计数器都比较大，那么硬盘不是瓶颈。如果只&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Disk Time比较大，另外两个都比较适中，硬盘可能会是瓶颈。在记录该计数器之前，请在Windows 2000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的命令行窗口中运行diskperf -yD。若数值持续超过80%，则可能是内存泄漏。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Avg.Disk Queue Length:指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。该值应不超过磁盘数的1.5~2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 倍。要提高性能，可增加磁盘。注意：一个Raid Disk实际有多个磁盘。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average Disk Read/Write Queue Length:指读取(写入)请求(列队)的平均数。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Disk Reads(Writes)/s: 物理磁盘上每秒钟磁盘读、写的次数。两者相加，应小于磁盘设备最大容量。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average Disksec/Read: 指以秒计算的在此盘上读取数据的所需平均时间。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average Disk sec/Transfer:指以秒计算的在此盘上写入数据的所需平均时间。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Network Interface： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Total/sec :为发送和接收字节的速率，包括帧字符在内。判断网络连接速度是否是瓶颈，可以用该计数器的值和目前网络的带宽比较 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQLServer性能计数器： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Access Methods(访问方法) 用于监视访问数据库中的逻辑页的方法。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Full Scans/sec(全表扫描/秒) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 每秒不受限的完全扫描数。可以是基本表扫描或全索引扫描。如果这个计数器显示的值比1或2高，应该分析你的查询以确定是否确实需要全表扫描，以及S Q &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L查询是否可以被优化。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page splits/sec(页分割/秒)由于数据更新操作引起的每秒页分割的数量。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Buffer Manager(缓冲器管理器)：监视 Microsoft&amp;amp;reg; SQL Server? 如何使用： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 内存存储数据页、内部数据结构和过程高速缓存；计数器在 SQL Server 从磁盘读取数据库页和将数据库页写入磁盘时监视物理 I/O。 监视 SQL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server 所使用的内存和计数器有助于确定： 是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样，SQL Server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 必须从磁盘检索数据。 是否可通过添加更多内存或使更多内存可用于数据高速缓存或 SQL Server 内部结构来提高查询性能。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server 需要从磁盘读取数据的频率。与其它操作相比，例如内存访问，物理 I/O 会耗费大量时间。尽可能减少物理 I/O &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以提高查询性能。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Page Reads/sec：每秒发出的物理数据库页读取数。这一统计信息显示的是在所有数据库间的物理页读取总数。由于物理 I/O &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的开销大，可以通过使用更大的数据高速缓存、智能索引、更高效的查询或者改变数据库设计等方法，使开销减到最小。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Page Writes/sec (.写的页/秒) 每秒执行的物理数据库写的页数。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Buffer Cache Hit Ratio. 在&amp;#8220;缓冲池&amp;#8221;（Buffer Cache/Buffer &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pool）中没有被读过的页占整个缓冲池中所有页的比率。可在高速缓存中找到而不需要从磁盘中读取的页的百分比。这一比率是高速缓存命中总数除以自 SQL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实例启动后对高速缓存的查找总数。经过很长时间后，这一比率的变化很小。由于从高速缓存中读数据比从磁盘中读数据的开销要小得多，一般希望这一数值高一些。通常，可以通过增加 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server 可用的内存数量来提高高速缓存命中率。计数器值依应用程序而定，但比率最好为90% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 或更高。增加内存直到这一数值持续高于90%，表示90% 以上的数据请求可以从数据缓冲区中获得所需数据。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lazy Writes/sec(惰性写/秒)惰性写进程每秒写的缓冲区的数量。值最好为0。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cache Manager(高速缓存管理器) 对象提供计数器，用于监视 Microsoft&amp;amp;reg; SQL Server? &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如何使用内存存储对象，如存储过程、特殊和准备好的 Transact-SQL 语句以及触发器。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cache Hit Ratio(高速缓存命中率，所有Cache&amp;#8221;的命中率。在SQL Server中，Cache可以包括Log &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cache，Buffer Cache以及Procedure Cache，是一个总体的比率。) 高速缓存命中次数和查找次数的比率。对于查看SQL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server高速缓存对于你的系统如何有效，这是一个非常好的计数器。如果这个值很低，持续低于80%，就需要增加更多的内存。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latches(闩) 用于监视称为闩锁的内部 SQL Server 资源锁。监视闩锁以明确用户活动和资源使用情况，有助于查明性能瓶颈。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average Latch Wait Ti m e ( m s ) (平均闩等待时间(毫秒)) 一个SQL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server线程必须等待一个闩的平均时间，以毫秒为单位。如果这个值很高，你可能正经历严重的竞争问题。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latch Waits/sec (闩等待/秒) 在闩上每秒的等待数量。如果这个值很高，表明你正经历对资源的大量竞争。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Locks(锁) 提供有关个别资源类型上的 SQL Server 锁的信息。锁加在 SQL Server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 资源上（如在一个事务中进行的行读取或修改），以防止多个事务并发使用资源。例如，如果一个排它 (X) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 锁被一个事务加在某一表的某一行上，在这个锁被释放前，其它事务都不可以修改这一行。尽可能少使用锁可提高并发性，从而改善性能。可以同时监视 Locks &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对象的多个实例，每个实例代表一个资源类型上的一个锁。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of Deadlocks/sec(死锁的数量/秒) 导致死锁的锁请求的数量 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average Wait Time(ms) (平均等待时间(毫秒)) 线程等待某种类型的锁的平均等待时间 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lock Requests/sec(锁请求/秒) 每秒钟某种类型的锁请求的数量。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Memory manager:用于监视总体的服务器内存使用情况，以估计用户活动和资源使用，有助于查明性能瓶颈。监视 SQL Server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实例所使用的内存有助于确定： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样，SQL Server 必须从磁盘检索数据。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是否可以通过添加更多内存或使更多内存可用于数据高速缓存或 SQL Server 内部结构来提高查询性能。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lock blocks:服务器上锁定块的数量，锁是在页、行或者表这样的资源上。不希望看到一个增长的值。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total server memory：sql server服务器当前正在使用的动态内存总量. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 监视IIS需要的一些计数器 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Internet Information Services Global: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File Cache Hits %、File CacheFlushes、File Cache Hits &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File Cache Hits %是全部缓存请求中缓存命中次数所占的比例，反映了IIS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的文件缓存设置的工作情况。对于一个大部分是静态网页组成的网站，该值应该保持在80%左右。而File Cache &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hits是文件缓存命中的具体值，File CacheFlushes &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是自服务器启动之后文件缓存刷新次数，如果刷新太慢，会浪费内存；如果刷新太快，缓存中的对象会太频繁的丢弃生成，起不到缓存的作用。通过比较File &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cache Hits 和File Cache Flushes &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可得出缓存命中率对缓存清空率的比率。通过观察它两个的值，可以得到一个适当的刷新值（参考IIS 的设置ObjectTTL 、MemCacheSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 、MaxCacheFileSize） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Web Service: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Total/sec:显示Web服务器发送和接受的总字节数。低数值表明该IIS正在以较低的速度进行数据传输。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection Refused：数值越低越好。高数值表明网络适配器或处理器存在瓶颈。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Not Found Errors：显示由于被请求文件无法找到而无法由服务器满足的请求数（HTTP状态代码404）&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Loadrunner性能测试一个实例&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;font size="2"&gt;随着测试越来越重要，其中的性能测试也受到越来越多的关注。比较普遍的性能测试工具是Loadrunner7.51，但是很多人对此性能工具不是很熟悉。本人也是总结心得体会，将做过的性能测试实例以饷大家，希望对各位做测试的朋友有所帮助。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 该方案是针对某公司试题库的性能测试。该试题库是用来对公司内部员工培训结果的一个考核。试题库在公司内部web服务器上，假设开设50个账号和密码可供 50个考生同时参加考试。要求，每台机器只能由一个用户使用，每个用户只能使用各自不同的账号登录考试系统，做完题目后，要求提交考试结果，若在制定的时间内不提交，则系统强制提交考试结果。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但是，一般测试部门不可能有50台机器同时进行测试的。所以，可以借Loadrunner7.51模拟IP地址，修改脚本来协助测试。但是，为了保证测试结果，建议搜罗公司中所有可用的机器进行复测，因为有时候是不可以完全信赖工具的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 现场测试环境&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 硬件：50台PC机，Web服务器&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 软件：Loadrunner7.0，Win2000，IE5.0和IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 人员：质控部2人，执行现场测试&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 项目部22人，提供现场环境&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 技术部各1人，提供技术支持&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 测试要求&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50个用户拥有独立IP地址，不同的用户及密码登录，试题完成后各自同时提交。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 测试内容&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50个用户以不同的用户名和密码登录试题库。试题完成后，提交考试结果。测试考试结果是否能正常提交以及正确评分。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 测试方案&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 完全20台实际的PC机进行现场测试。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 准备工作，并做计划。第一轮测试执行三遍，设定用户考试内容全部同时提交，第一遍全部使用IE5.0，第二遍10台使用IE5.0，10台使用IE6.0，第三遍全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2） At 9：00 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3） At 9：05 ，20个用户同时全部提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （4） 分别记录第一轮测试（三遍）的结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （5） 第二轮测试准备工作，设定15个用户考试内容同时提交，另外5个用户延时5分钟提交，全部使用IE5.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （6） At 9：15 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （7） At 9：20 ，15个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （8） At 9：25 ，剩余5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （9） 记录第二轮测试结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （10） 第三轮测试准备工作，设定15个用户考试内容同时提交，另外5个用户延时5分钟提交，全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （11） At 9：15 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （12） At 9：20 ，15个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （13） At 9：25 ，剩余5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （14） 记录第三轮测试结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （15） 第四轮测试准备工作，设定15个用户考试内容同时提交，另外5个用户延时5分钟提交，正常提交用户使用IE5.0，延时提交用户使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （16） At 9：15 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （17） At 9：20 ，15个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （18） At 9：25 ，剩余5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （19） 记录第四轮测试结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （20） 第五轮测试准备工作，设定15个用户考试内容同时提交，另外5个用户延时5分钟提交，正常提交用户使用IE6.0，延时提交用户使用IE5.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （21） At 9：15 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （22） At 9：20 ，15个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （23） At 9：25 ，剩余5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （24） 记录第五轮测试结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （25） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第六轮测试准备工作，设定15个用户考试内容同时提交，另外5个用户延时5分钟提交，正常提交用户其中10个使用IE5.0，5个使用IE6.0，延时提交用户使用IE5.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （26） At 9：15 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （27） At 9：20 ，15个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （28） At 9：25 ，剩余5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （29） 记录第六轮测试结果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （30） 第七轮测试准备工作，设定10个用户考试内容同时提交，另外10个用户分两次分别延时5分钟、15提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （31） At 9：35 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （32） At 9：40 ，10个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （33） At 9：45 ，剩余的其中5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （34） At 9：55 ，剩余的5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （35） 记录第七轮测试结果，参见第二轮测试－第六轮测试过程分别对IE5.0和IE6.0的情况进行测试&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （36） 第八轮测试准备工作，设定其中10个用户不提交，由系统强行提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （37） At 10：10 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （38） At 10：15 ，10个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （39） 其余用户的内容由系统强行提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （40） 记录第八轮测试结果，参见第二轮测试－第六轮测试过程分别对IE5.0和IE6.0的情况进行测试&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （41） 第九轮测试准备工作，设定其中10个用户同时提交，5个用户延时5分钟提交，其余用户由系统强行提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （42） At 10：25 ，20个用户同时登录系统&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （43） At 10：30 ，10个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （44） At 10：35 ，剩余的其中5个用户同时提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （45） 剩余5个用户系统强制提交&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （46） 记录第九轮测试结果，参见第二轮测试－第六轮测试过程分别对IE5.0和IE6.0的情况进行测试&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 模拟20个用户进行测试。其中，10台是PC机，另外10台机器的IP地址是Loadrunner模拟出来的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在10台实际的PC机中抽取其中一台虚拟10个IP地址，包括自身的IP地址，该机器上共11个IP地址，这11个IP地址只能全部使用IE5.0或者全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2） 其余9台实际的PC机分别由9个人操作，另外一台机器由一位质控部人员操作&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3） 对于异常情况，延时提交和强制提交全部由实际的机器来模拟&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （4） 其余过程参见1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 模拟20个用户进行测试。其中，5台是PC机，另外15台机器的IP地址是用Loadrunner模拟出来的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在5台实际的PC机中抽取其中一台虚拟15个IP地址，包括自身的IP地址，该机器上共16个IP地址，这16个IP地址只能全部使用IE5.0或者全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2） 其余4台实际的PC机分别由4个人操作，另外一台机器由一位质控部人员操作&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3） 对于异常情况，延时提交和强制提交全部由实际的机器来模拟&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （4） 其余过程参见1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 模拟35个用户进行测试。其中，20台是PC机，另外15台机器的IP地址是用Loadrunner模拟出来的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1） 在20台实际的PC机中抽取其中两台分别虚拟7个、8个IP地址，这17个IP地址只能全部使用IE5.0或者全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2） 其余18台实际的PC机分别由18个人操作，另外两台机器由两位质控部人员操作&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3） 对于异常情况，延时提交和强制提交全部由实际的机器来模拟&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （4） 其余过程参见1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5、 模拟50台用户进行测试。其中，20台是PC机，另外30台机器的IP地址是用分别用两台实际的PC机模拟出来的。记录测试结果。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1） 在20台实际的PC机中抽取其中两台分别虚拟15个IP地址，这32个IP地址只能全部使用IE5.0或者全部使用IE6.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2） 其余18台实际的PC机分别由18个人操作，另外两台机器由两位质控部人员操作&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3） 对于异常情况，延时提交和强制提交全部由实际的机器来模拟&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （4） 其余过程参见1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6、 对5中所述情况重复测试两次。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7、 为了保证结果的正确性，完全50台实际的PC机进行现场测试。过程参见1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 测试过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注：该测试过程针对虚拟IP地址情况。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 一台PC机上创建15个虚拟的IP地址。首先，启动IP Wizard，如下：开始程序－&amp;gt;Loadrunner－&amp;gt;Tools－&amp;gt;IP Wizard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 点击&amp;#8220;Add&amp;#8221;，添加你计划虚拟的IP地址。但是注意不能添加已经被占用的IP地址。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 启动Virtual User &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Generator，并录制脚本，由于50个用户的账号和密码各不相同，所以，要修改脚本，设置参数。我是录制了一个脚本，复制了49份，在每个脚本中手工修改了各自不同的地方。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 启动Loadrunner Controller，先将刚才保存的脚本添加进来。然后点击&amp;#8220;Scenario&amp;#8221;菜单，激活其中的&amp;#8220;Enable IP &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spoofer&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 点击屏幕右方的&amp;#8220;Generators&amp;#8221;，添加已经建立的IP，然后connect建立连接。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5、对连接起来的不同用户（IP地址）分配不同的脚本，在Controller中的&amp;#8220;design&amp;#8221;中，点击&amp;#8220;Load &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Generators&amp;#8221;其中，每个脚本有一个用户执行。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6、 执行Scenario。 &lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;Loadrunner中参数的设置&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;font size="2"&gt;在做负载或者压力测试时，很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本，然后产生数千个虚拟用户运行脚本（虚拟用户可以分布在局域网中不同的PC机上），最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题，比如不同的用户有不同的使用数据，这就牵涉到参数的设置问题。本文就Loadrunner中参数的设置进行说明，希望对大家有所帮助。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 录制程序运行的过程中，VuGen（脚本生成器） &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动（如查询、提交等等），那么你必须用参数值取代录制的数值。这个过程称为参数化脚本。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文主要包括如下内容：理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 除了GUI，以下的内容适合于各种类型的用户脚本。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一、关于参数的定义&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在你录制程序运行的过程中，脚本生成器自动生成由函数组成的用户脚本。函数中参数的值就是在录制过程中输入的实际值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如，你录制了一个Web应用程序的脚本。脚本生成器生成了一个声明，该声明搜索名称为&amp;#8220;UNIX&amp;#8221;的图书的数据库。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当你用多个虚拟用户和迭代回放脚本时，也许你不想重复使用相同的值&amp;#8220;UNIX&amp;#8221;。那么，你就可以用参数来取代这个常量。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个文件，也可以是内部产生的变量。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用参数表示用户的脚本有两个优点：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9312; 可以使脚本的长度变短。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9313; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以使用不同的数值来测试你的脚本。例如，如果你企图搜索不同名称的图书，你仅仅需要写提交函数一次。在回放的过程中，你可以使用不同的参数值，而不只搜索一个特定名称的值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数化包含以下两项任务：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9312; 在脚本中用参数取代常量值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9313; 设置参数的属性以及数据源。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外，不是所有的函数都可以参数化的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 二、参数的创建&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Web程序的用户脚本中，你可以使用如下过程在基于文本的脚本视图中创建参数。或者，也可以在基于图标的树形视图中创建参数。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要创建一个参数：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 将光标定位在要参数化的字符上，点击右键。打开弹出菜单。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 在弹出菜单中，选择&amp;#8220;Replace with a Parameter&amp;#8221;。选择或者创建参数的对话框弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 在&amp;#8220;Parameter name&amp;#8221;中输入参数的名称，或者选择一个在参数列表中已经存在的参数。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 在&amp;#8220;Parameter type&amp;#8221;下拉列表中选择参数类型。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5、 点击&amp;#8220;OK&amp;#8221;，关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符，参数用一对&amp;#8220;{}&amp;#8221;括住。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：在参数化CORBA或者General-Java 用户脚本的时候，必须参数化整个字符串，而不是其中的部分。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外注意：除了Web或者WAP，缺省的参数括号对于任何脚本都是 &amp;#8220;{}&amp;#8221;。你可以在&amp;#8220;General &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Options&amp;#8221;对话框中的&amp;#8220;Parameterization&amp;#8221;标签（Tools&amp;gt;General Options）中定义参数括号种类。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6、 用同样的参数替换字符的其余情况，选中参数，点击右键，弹出菜单。从弹出的菜单中，选择&amp;#8220;Replace More &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Occurrences&amp;#8221;。搜索和替换对话框弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8220;Find What&amp;#8221;中显示了你企图替换的值。&amp;#8220;Replace With&amp;#8221;中显示了括号中参数的名称。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 选择适当的检验框来匹配整个字符或者大小写。如果要搜索规则的表达式（.，!，?等等），选中&amp;#8220;Regular &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression&amp;#8221;检验框，然后点击&amp;#8220;Replace&amp;#8221;或者&amp;#8220;Replace All&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：小心使用&amp;#8220;Replace All&amp;#8221;，尤其替换数字字符串的时候。脚本生成器将会替换字符出现的所有情况。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7、 如果想用以前定义过的参数来替换常量字符串的话，选中该字符串，点击右键，然后选择&amp;#8220;Use Existing Parameter&amp;#8221;，子菜单&amp;#8220;Use &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Existing Parameters&amp;#8221;弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从子菜单&amp;#8220;Use Existing Parameters&amp;#8221;选择参数，或者用&amp;#8220;Select from Parameter &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;#8221;来打开参数列表对话框。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：如果用以前定义过的参数来替换常量字符串的话，那么，使用&amp;#8220;Parameter List&amp;#8221;非常方便。同时，还可以查看和修改该参数的属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8、 对于已经用参数替换过的地方，如果想取回原来的值，那么，就在参数上点击右键，然后选择&amp;#8220;Restore Original Value&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Web用户脚本的树形视图中创建参数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Web用户脚本的树形视图中创建一个参数的步骤&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、将光标定位在企图参数化的地方，点击右键，从弹出的菜单中选择&amp;#8220;Properties&amp;#8221;。则相关的属性对话框打开。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、点击在要参数化的参量的旁边的&amp;#8220;ABC&amp;#8221;形状的图标。&amp;#8220;Select or Create Parameter&amp;#8221;对话框打开。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、在&amp;#8220;Parameter name&amp;#8221;中输入参数的名称，或者从列表中选择一个已经存在的参数。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、在&amp;#8220;Parameter type&amp;#8221;中输入参数的类型。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5、点击&amp;#8220;OK&amp;#8221;关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量，并用一个表格形状的图标替换&amp;#8220;ABC&amp;#8221;形状的图标。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6、要恢复参数化以前的值，点击图标，然后从弹出的菜单中选择&amp;#8220;Undo Parameter&amp;#8221;，则以前的值便会重现。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 三、定义参数的属性&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 创建参数完成后，就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中，参数使用的数据源。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Web用户脚本中，你既可以在基于文本的脚本视图中定义参数属性，也可以在基于图标的树形视图中定义参数属性。下面的过程将教你如何在基于本文的脚本视图中定义参数属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 定义参数属性步骤：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 在参数上点击右键，有菜单弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 在弹出的菜单中，选择&amp;#8220;Parameter Properties&amp;#8221;。参数属性对话框打开，显示和当前参数类型相关的属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 输入参数的属性值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 点击&amp;#8220;Close&amp;#8221;关闭参数属性对话框。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Web用户脚本的树形视图中定义参数的属性&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 将关标定位在参数上，然后点击右键，选择&amp;#8220;Properties&amp;#8221;。属性对话框打开。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 点击要定义属性的参数旁边的表格形状按钮，点击右键，选择&amp;#8220;Parameter &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Properties&amp;#8221;。参数属性对话框打开，和参数类型相关的属性显示出来。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 输入参数的属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 点击&amp;#8220;Close&amp;#8221;关闭参数属性对话框。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用参数列表&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用参数列表可以在任意时刻查看所有的参数，创建新的参数、删除参数，或者修改已经存在参数的属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要使用参数列表：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、 点击参数列表按钮或者用&amp;#8220;Vuser&amp;gt;Parameter List&amp;#8221;。参数列表对话框打开。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、 要创建新的参数，点击&amp;#8220;New&amp;#8221;按钮。新的参数则被添加在参数树中，该参数有一个临时的名字，你可以给它重新命名，然后回车。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：不要将一个参数命名为&amp;#8220;unique&amp;#8221;，因为这个名称是用户脚本生成器本身的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 设置参数的类型和属性，点击&amp;#8220;OK&amp;#8221;，关闭参数列表对话框。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：用户脚本生成器创建新的参数，但是不会自动用该参数在脚本中替换任意选中的字符串。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、 要删除已有的参数，那么，要先从参数树中选择该参数，点击&amp;#8220;Delete&amp;#8221;，然后确认你的行为即可。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4、 要修改已有参数，那么，要先从参数树中选择该参数，然后编辑参数的类型和属性。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 四、理解参数的类型&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在你定义参数属性的时候，要指定参数值的数据源。你可以指定下列数据源类型的任何一种：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Internal Data 虚拟用户内部产生的数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data Files 存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User-Defined Functions 调用外部DLL函数生成的数据&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Internal Data包括以下几种：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. Date/Time&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式，你可以从菜单列表中选择格式，或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Group Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Group Name &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用虚拟用户组名称替换参数。在创建scenario的时候，你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候，虚拟用户组名称总是None。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. Load Generator Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. Iteration Number&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iteration Number用当前的迭代数目替换参数。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. Random Number&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. Unique Number&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7. Vuser ID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vuser &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID用分配给虚拟用户的ID替换参数，ID是由Loadrunner的控制器在scenario运行时生成的。如果你从脚本生成器运行脚本的话，虚拟用户的ID总是-1。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 五、数据文件&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数据文件中的数据是以表的形式存储的。一个文件中可以包含很多参数值。每一列包含一个参数的数据。列之间用分隔符隔开，比如说，用逗号。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对数据文件设置参数属性&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果使用文件作为参数的数据源，必须指定以下内容：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 文件的名称和位置&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 包含数据的列&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. 文件格式，包括列的分隔符&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. 更新方法&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果参数的类型是&amp;#8220;File&amp;#8221;，打开参数属性（Parameter Properties）对话框，设置文件属性如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 在&amp;#8220;File &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path&amp;#8221;中输入文件的位置，或者点击&amp;#8220;Browse&amp;#8221;指定一个已有文件的位置。缺省情况下，所有新的数据文件名都是&amp;#8220;parameter_name.dat&amp;#8221;，注意，已有的数据文件的后缀必须是.dat。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. &lt;br /&gt;点击&amp;#8220;Edit&amp;#8221;。记事本打开，里面第一行是参数的名称，第二行是参数的初始值。使用诸如逗号之类的分隔符将列隔开。对于每一新的表行开始一行新的数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：在没有启动记事本的情况下如果想添加列，就在参数属性对话框中点击&amp;#8220;Add Col&amp;#8221;，那么&amp;#8220;Add new &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column&amp;#8221;对话框就会弹出。输入新列的名称，点击&amp;#8220;OK&amp;#8221;。脚本生成器就会添加该列到表中，并显示该列的初始值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. 在&amp;#8220;Select &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Column&amp;#8221;部分，指明包含当前参数数据的列。你可以指定列名或者列号。列号是包含你所需要数据的列的索引。列名显示在每列的第一行（row 0）。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. 在&amp;#8220;Column delimiter&amp;#8221;中输入列分隔符，你可以指定逗号、空格符等等。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. 在&amp;#8220;First data line&amp;#8221;中，在脚本执行的时候选择第一行数据使用。列标题是第0行。若从列标题后面的第一行开始的话，那就在&amp;#8220;First &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data line&amp;#8221;中输入1。如果没有列标题，就输入0。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. 在&amp;#8220;Select next &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row&amp;#8221;中输入更新方法，以说明虚拟用户在脚本执行的过程中如何选择表中的数据。方法可以是：连续的、随机的、唯一的、或者与其它参数表的相同行。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7. 选中&amp;#8220;Advance row each iteration&amp;#8221;表示虚拟用户在每次迭代都使用新的一行数据而不是所有的迭代都使用相同的数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从文件中更新参数值&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 若使用文件中的数值，脚本生成器会要求你指定给参数分配数值给的方法。可用的方法有：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 顺序（Sequential）：该方法顺序地给虚拟用户分配参数值。如果正在运行的虚拟用户访问数据表的时候，它会取到下一行中可用的数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 随机（Random）：该方法在每次迭代的时候会从数据表中取随机数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. 使用种子取随机顺序（Use Random Sequence with &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Seed）：如果从Loadrunner的控制器来运行scenario，你可以指定一个种子数值用于随机顺序。每一个种子数值在测试执行的时候代表了一个随机数的顺序。无论你何时使用这个种子数值，在scenario中同样的数据顺序就被分配给虚拟用户。如果在测试执行的时候发现了一个问题并且企图使用同样的随机数序列来重复测试，那么，你就可以启动这个功能（可选项）。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. 唯一（Unique）：Unique方法分配一个唯一的有顺序的值给每个虚拟用户的参数。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. 与以前定义的参数取同一行（Same Line As &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ）：该方法从和以前定义过的参数中的同样的一行分配数据。你必须指定包含有该数据的列。在下拉列表中会出现定义过的所有参数列表。注意：至少其中的一个参数必须是Sequential、Random或者Unique。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果数据表中有三列，三个参数定义在列表中：id1，name1和title1，如下：。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID Name Title&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 132 Kim Manager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 187 Cassie Engineer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 189 Jane VP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对于参数id1，你可以指示虚拟用户使用Random方法，而为参数name1和title1就可以指定方法&amp;#8220;Same Line as &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id1&amp;#8221;。所以，一旦ID&amp;#8220;132&amp;#8221;被使用，那么，姓名（Name）&amp;#8220;Kim&amp;#8221;和职位（Title）&amp;#8220;Manager&amp;#8221;同时被使用。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 六、从已存在的数据库中导入数据&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loadrunner允许你利用参数化从已经存在的数据库中导入数据。可以使用下列两种方式之一：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 使用Microsoft Query（要求在系统上先安装MS Query）。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 指定数据库连接字符串和SQL语句。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用户脚本生成器在从数据库中导入数据的过程中提供了一个向导。在向导中，你指明如何导入数据－通过MS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query创建查询语句或者直接书写SQL语句。在导入数据以后，以.dat为后缀并作为正规的参数文件保存。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要开始导入数据库中数据的过程，在参数属性对话框中点击&amp;#8220;Data Wizard&amp;#8221;，则，数据库查询向导弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要创建新的查询&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 选择&amp;#8220;Create new query&amp;#8221;。如果需要MS Query的帮助，选择&amp;#8220;Show me how to use Microsoft &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query&amp;#8221;，然后点击&amp;#8220;Finish&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你还没有安装Microsoft Query，Loadrunner会提示你这个功能不可用。在进行之前，从Microsoft Office中安装MS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 在Microsoft Query中遵循以下步骤，导入期望的表和列。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. 在完成数据的导入后，选择&amp;#8220;Exit and return to Virtual User &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Generator&amp;#8221;，然后点击&amp;#8220;Finish&amp;#8221;。在参数属性对话框中数据库记录以data文件的形式显示出来。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要在MS Query中编辑并查看数据，选择&amp;#8220;View data or edit in Microsoft &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query&amp;#8221;。若要结束，则选择&amp;#8220;File&amp;gt;Exit and return to Virtual User Generator&amp;#8221;返回到脚本生成器。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. 在&amp;#8220;Select Column&amp;#8221;部分，指定包含当前参数数据的列可以指定列号或者列名。注意：列标题默认为第0行（row 0）。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. 从&amp;#8220;Select next &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row&amp;#8221;列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。可选项是：Sequential、Random、Unique或者Same &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line As。其中每一项的含义文章前面已经讲述，就不再赘述。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. 如果选择&amp;#8220;Advance row each iteration&amp;#8221;，虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要指定数据库连接或者SQL语句&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. 选择&amp;#8220;Specify SQL Statement&amp;#8221;，然后点击&amp;#8220;Next&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 点击&amp;#8220;Create&amp;#8221;指定一个新的连接字符串。选择数据源的窗口弹出。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 选择已有的数据源，或者点击&amp;#8220;New&amp;#8221;创建一个新的数据源。向导将提示你穿过创建ODBC数据源的过程。在完成后，连接字符串就会在连接字符串框中显示出来。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. 在SQL框中，输入或者粘贴SQL语句。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. 点击&amp;#8220;Finish&amp;#8221;继续SQL语句并导入数据。数据库记录将以data文件的形式显示在参数属性框中。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. 在&amp;#8220;Select Column&amp;#8221;部分中，指定包含当前参数数据的列。你可以指定列号或者列名。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7. 从&amp;#8220;Select next &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row&amp;#8221;列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。可选项是：Sequential、Random、Unique或者Same &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line As。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8. 如果选择&amp;#8220;Advance row each iteration&amp;#8221;，虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。 &lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/junzhongxu/aggbug/1954892.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2011/02/15/1954892.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
