LoadRunner性能测试实战:从脚本录制到瓶颈分析完整指南

📅 2026/7/3 18:34:11
LoadRunner性能测试实战:从脚本录制到瓶颈分析完整指南
1. 项目概述为什么性能测试不能只靠“感觉”如果你刚接触性能测试可能会觉得它很神秘不就是让系统多跑几个用户看看会不会卡吗我见过太多新手拿到LoadRunner后第一件事就是录个登录脚本然后直接拉上几百个虚拟用户开跑最后盯着一个平均响应时间就敢下结论说“系统性能良好”或“存在瓶颈”。这种“凭感觉”的测试不仅浪费了LoadRunner这个强大工具的价值更可能给项目埋下巨大的隐患——你以为的“良好”可能只是压力没打到位你发现的“瓶颈”也许只是脚本写得不对。LoadRunner作为一款经典的商业性能测试工具它的核心价值在于“预测”和“定位”。它通过精准模拟海量用户的并发操作并实时监控从用户端到服务器端包括网络、应用服务器、数据库等的全链路性能数据来回答两个关键问题1. 系统在预期负载下表现是否符合要求 2. 如果不符合问题到底出在哪里这远不是“跑个脚本看时间”那么简单它是一套从业务建模、脚本开发、场景设计、监控执行到结果分析的完整工程方法。这篇实战教程就是要把这套方法掰开揉碎让你从“会用工具”升级到“懂测试思维”。我们不只讲按钮怎么点更会深入每个操作背后的“为什么”为什么这里要参数化为什么集合点不能乱放TPS曲线波动大第一眼该看哪里这些从真实项目踩坑中总结出的经验才是从入门到精通的关键。2. 性能测试核心概念与LoadRunner工具定位在动手之前我们必须统一语言。性能测试领域有很多术语如果理解有偏差后续的所有工作都可能南辕北辙。2.1 关键性能指标KPIs辨析很多人容易混淆“指标”和“参数”。简单说指标是系统在压力下“表现如何”的度量结果而参数是我们为了制造压力“如何设置”的输入条件。核心性能指标主要包括响应时间从用户发起请求到收到完整响应所经历的时间。这是最直观的用户体验指标。在LoadRunner中我们通过定义“事务”来度量它。需要注意的是平均响应时间会掩盖问题必须结合90分位或95分位响应时间即90%或95%的用户体验到的响应时间一起看才能发现长尾问题。吞吐量/每秒事务数TPS系统在单位时间内成功处理的事务数量。TPS直接反映了系统的处理能力。一个常见的误区是认为“用户数越多TPS越高”。实际上当系统达到瓶颈后增加用户数只会增加响应时间TPS会持平甚至下降。并发用户数在同一时刻与系统进行交互的虚拟用户数量。这里有三个容易混淆的概念系统并发数严格意义上的同一毫秒内正在处理请求的用户数极难精确统计。业务并发数在典型业务场景中同时进行操作的用户数量。我们通常模拟的是这个。负载测试中的“并发”在LoadRunner场景中更多指的是“同时处于运行状态的虚拟用户数”这些用户可能处于执行脚本、思考Think Time或等待如集合点的不同阶段。资源利用率CPU使用率、内存使用率、磁盘I/O、网络带宽等。这些指标用于定位瓶颈发生在基础设施的哪个环节。例如CPU持续高于80%可能意味着计算瓶颈而磁盘I/O等待时间长可能意味着磁盘或数据库慢查询。注意千万不要孤立地看任何一个指标。TPS高但响应时间也急剧上升可能意味着系统在“硬扛”响应时间正常但TPS很低可能意味着脚本的思考时间设置过长没有给系统施加足够压力。2.2 LoadRunner与其他工具的对比提到性能测试很多人也会想到JMeter、Locust等开源工具。了解LoadRunner的定位能帮助你做出正确的技术选型。特性LoadRunnerApache JMeterLocust类型商业软件有免费社区版开源免费开源免费协议支持极其丰富超过50种对老旧协议如Citrix, SAP GUI支持好主流协议HTTP, JDBC, JMS等可通过插件扩展以HTTP为主可通过Python代码扩展脚本语言C默认、Java、.NET、JavaScript等Java基于GUI配置Python代码即脚本资源监控内置强大监控器如Windows PerfMon, UNIX RPC集成度高依赖插件如PerfMon插件配置稍复杂无内置需自行集成或使用第三方服务分布式压测通过Load Generator负载机原生支持由Controller统一管理通过Master-Slave模式实现配置相对繁琐原生支持分布式通过Master-Node通信学习曲线较高概念和模块多中等GUI易于上手较低对Python开发者灵活性高报告与分析Analysis模块强大提供深度关联分析和自动瓶颈定位建议报告基础依赖第三方插件如BlazeMeter增强报告简洁基于Web UI可定制适用场景企业级、复杂系统、高保真模拟、深度分析中小型项目、API测试、快速验证敏捷开发、需要高度定制压测逻辑、开发主导的测试LoadRunner的核心优势在于其“企业级”的完整性和深度。对于金融、电信、ERP等核心业务系统需要模拟成千上万用户、使用多种混合协议、并进行精准的资源监控和根因分析时LoadRunner往往是更专业的选择。它的Controller场景设计、Analysis结果关联分析是开源工具需要大量二次开发才能媲美的。3. 实战第一步环境搭建与VuGen脚本录制工欲善其事必先利其器。稳定的测试环境是成功的一半。3.1 安装部署避坑指南从官网下载LoadRunner Community Edition社区版后安装过程看似简单但有几个关键点决定了后续使用的顺畅度。安装路径与权限强烈建议安装在英文路径下且路径中不要有空格。很多脚本回放和组件调用问题都源于中文字符或空格。同时以管理员身份运行安装程序确保有权限写入注册表和系统目录。防火墙与杀毒软件安装和运行时暂时关闭Windows Defender防火墙或添加例外规则。LoadRunner的负载发生器Load Generator服务需要特定端口通信被拦截会导致Controller无法连接负载机。杀毒软件实时扫描也可能严重影响录制和回放效率建议将LoadRunner安装目录加入信任区。浏览器与代理设置LoadRunner VuGen通过代理方式录制Web流量。安装后它会自动在IE/Chrome等浏览器中设置代理127.0.0.1:8888。如果你使用了其他代理如公司网络代理或科学上网工具务必在录制前清除否则无法捕获到流量。录制完成后最好也恢复原状以免影响正常上网。负载机部署如果你需要多台机器联合施压分布式压测需要在每台负载机上独立安装“Load Generator”组件。安装后确保MI Listener服务已启动并在Controller中添加该机器IP。关键点所有负载机与被测系统之间的网络延迟应尽量低且稳定负载机本身的硬件资源CPU、内存要充足避免压力机先成为瓶颈。3.2 脚本录制从“录得上”到“录得准”录制脚本是性能测试的基石。一个糟糕的脚本会让后续所有测试失去意义。标准录制流程选择协议在VuGen中创建新脚本最关键的一步是选择正确的协议。对于现代Web应用首选“Web - HTTP/HTML”协议。如果你测试的是WebSocket、Java RMI或数据库直连等需选择对应协议。不确定时选择“多协议”并勾选可能的选项VuGen会尝试自动识别。配置录制选项录制模式对于基于浏览器的应用选择“HTML-based script”基于HTML的脚本。这种模式生成的脚本更简洁每个页面请求为一个web_url函数。而“URL-based script”基于URL的脚本会记录所有资源请求如图片、JS、CSS脚本冗长通常用于调试或需要精确控制每个请求的场景。浏览器与起始URL指定你要使用的浏览器建议Chrome或Edge和被测应用的入口地址。开始录制与操作点击录制VuGen会打开浏览器并开始捕获所有网络请求。此时你应像真实用户一样完整地走一遍待测试的业务流程如登录-搜索商品-加入购物车-下单。停止录制与初步优化录制结束后你会得到一个包含vuser_init、Action、vuser_end三个部分的脚本。首先删除所有无关请求。通过View - Tree View视图检查每一步录制的请求移除那些与核心业务无关的静态资源请求如logo图片、第三方统计JS。这能大幅提升脚本效率和可读性。实操心得录制时经常遇到“无法打开网页”或录不到流量的问题。90%的原因出在代理冲突。请按以下顺序排查①检查浏览器代理设置是否指向了127.0.0.1:8888②关闭所有其他VPN或代理软件③以管理员身份运行VuGen④尝试更换浏览器或使用LoadRunner内置的浏览器。4. 脚本强化让虚拟用户更像真人录制生成的原始脚本是“死”的它只是回放了一遍你的操作。要让其支持大量虚拟用户并发并真实模拟用户行为必须进行“脚本强化”主要包括参数化、关联和添加事务与集合点。4.1 参数化告别“重复登录”的尴尬如果1000个虚拟用户都用同一个账号“test01”登录系统可能会因为重复会话而报错或者缓存命中率虚高测试结果失真。参数化就是将脚本中的常量如用户名、密码、搜索关键词替换为从数据源读取的变量。操作步骤在脚本中选中需要参数化的值如用户名。右键选择“Replace with a Parameter”。设置参数名称如username并选择参数类型。最常用的是“File”类型。点击“Data Wizard”或直接编辑参数文件创建一個文本文件如username.dat每行一个值如user001, user002…。在参数属性中设置“Select next row”为“Unique”每个Vuser取唯一值“Update value on”为“Each iteration”每次迭代更新。为什么这么做模拟真实用户多样性。避免缓存和数据库锁冲突。满足业务规则如一个订单只能由一个用户创建。4.2 关联应对服务器返回的动态数据这是脚本开发中最具挑战的一环。很多系统会在交互中产生动态值如会话IDJSESSIONID、令牌CSRF Token、订单号等。这些值在每次会话中都不同录制时是一个具体值回放时如果还用这个旧值请求就会失败。关联的本质是从服务器响应中提取动态值保存到参数中再将其替换到后续的请求里。如何找到需要关联的动态值回放比对法最常用录制脚本后先回放一遍。在回放日志Replay Log中查找错误通常会有“找不到…”、“无效…”等提示。对比录制和回放的请求数据找到那些不同的值。自动扫描法使用VuGen的“Scan for Correlation”功能。在录制后或回放失败后让工具自动扫描并建议关联点。但工具不一定能发现所有动态值仍需人工校验。关联函数示例最常见的关联函数是web_reg_save_param_ex。你需要找到动态值在响应中的左右边界LB和RB。// 在请求之前注册关联函数从响应中提取token web_reg_save_param_ex( ParamNamecsrf_token, LBname\csrf_token\ value\, RB\, SearchBody, LAST); // 接下来的请求会触发关联 web_submit_form(login.pl, ...); // 在后续请求中使用提取到的参数 web_submit_form(submit_order.pl, ItemDatacsrf_token{csrf_token}item123, LAST);踩坑记录关联最怕“边界不准”。如果LB/RB文本不唯一可能会提取到错误的内容。务必在Tree View中查看响应的原始代码而非解析后的视图确保边界文本能唯一定位到目标值。对于JSON响应可以使用更强大的web_reg_save_param_json函数。4.3 事务与集合点定义业务与制造并发峰值事务Transaction用来衡量一个或多个操作的响应时间。在脚本中用lr_start_transaction(“事务名”)和lr_end_transaction(“事务名”, LR_AUTO)将一段代码包围起来。例如将“登录”操作定义为一个事务Analysis报告中就会单独统计登录的平均响应时间、通过率等。事务划分要基于业务逻辑粒度适中通常对应一个用户可感知的完整操作如“加入购物车”、“支付”。集合点Rendezvous用于模拟瞬时并发。在需要制造峰值压力的操作前如秒杀活动的“提交订单”按钮插入lr_rendezvous(“集合点名”)。当多个Vuser执行到此处时会暂停并等待直到达到场景中设定的释放条件如满足一定数量的Vuser再同时继续执行从而形成真正的并发冲击。注意集合点必须放在Action部分不能放在vuser_init或vuser_end中。5. 场景设计在Controller中编排压力舞蹈脚本准备好后需要在Controller中设计场景Scenario决定“多少用户”、“以何种方式”、“运行多久”来给系统施压。5.1 虚拟用户组与负载生成器管理将开发好的脚本添加到场景中形成一个虚拟用户组Group。你可以添加多个组模拟不同角色如浏览用户、下单用户的混合业务场景。 关键设置在于“负载生成器”Load Generators。默认使用本地机如果压力大需添加多台负载机。确保状态为“Ready”否则无法分配负载。5.2 负载策略循序渐进才是王道在“场景计划”选项卡中设计负载模型。这是性能测试的“指挥棒”。虚拟用户数设置最大并发用户数。这个数字应基于业务目标如高峰在线用户数来确定而非盲目设定。负载生成器选择运行Vuser的机器。计划方式选择“按场景计划”更灵活。启动设置Ramp Up这是最容易出错的地方之一。不要让所有用户瞬间启动。应该设置一个合理的“逐步启动”时间如每10秒启动20个用户。这既能模拟真实的用户增长也给系统一个缓冲避免因瞬间过载而直接崩溃导致你无法观察到系统在压力下的真实表现。持续时间压力测试需要持续一段时间如15-30分钟以便系统状态稳定获取有代表性的性能数据。稳定性测试可能需要持续数小时甚至数天。退出设置Ramp Down同样逐步停止用户模拟用户离开。5.3 运行时设置模拟真实用户行为双击用户组进入“运行时设置”这里微调每个Vuser的行为。思考时间Think Time模拟用户操作间的停顿。重要抉择在压测时通常需要忽略思考时间选择“忽略思考时间”或将其设置为一个很小的随机百分比以便在单位时间内施加最大压力寻找系统极限。在容量规划或真实性测试时则需保留思考时间。迭代次数设置每个Vuser重复执行Action的次数。日志调试时开启“标准日志”甚至“扩展日志”但正式压测时务必改为“仅错误日志”或“无日志”否则I/O开销会极大影响负载机性能使测试结果失真。速度模拟可以模拟不同的网络带宽如拨号、宽带。6. 监控与执行让瓶颈无处遁形压测过程中实时监控至关重要。Controller不仅负责发压更是一个强大的监控中心。6.1 资源监控器配置在Controller的“运行”视图中可以添加各种监控器Monitors。Windows资源监控监控被测服务器Windows系统的CPU、内存、磁盘、网络等计数器。需要确保Controller所在机器能访问被测服务器且具有相应权限通常需要管理员账号。UNIX/Linux资源监控通过rpc.rstatd或SSH服务监控Linux服务器资源。需要在被测服务器上启动rstatd服务sudo systemctl start rpcbindsudo systemctl start rstatd并在防火墙开放相应端口。应用服务器监控如Apache、Nginx、Tomcat、WebLogic等需要配置JMX或特定插件来获取连接数、线程池、JVM内存等关键指标。数据库监控如Oracle、SQL Server、MySQL通过ODBC或专用监控器获取SQL执行情况、锁等待、缓存命中率等。实操心得监控不是越多越好。只添加与你测试目标相关的核心计数器。过多的监控点会产生额外的网络和系统开销可能干扰测试本身。重点关注CPU使用率%Processor Time、可用内存Available MBytes、磁盘队列长度Avg. Disk Queue Length、网络流量Bytes Total/sec以及应用特有的指标如JVM GC时间、数据库活动连接数。6.2 场景运行与实时观察点击“开始场景”后进入运行视图。重点关注以下几个区域场景状态查看正在运行、已完成、失败的Vuser数量。事务响应时间图观察关键事务的响应时间是否在预期范围内并关注其趋势是平稳、上升还是波动。每秒点击率/吞吐量图观察系统接收到的负载压力趋势。系统资源图观察服务器资源是否出现瓶颈如CPU持续高于90%。错误信息一旦出现错误立即在“错误”面板中查看详情。少量错误可能是网络抖动但大量错误或错误数持续增长往往意味着系统已出现严重问题可能需要停止测试进行分析。7. 结果分析从数据海洋中洞察真相测试执行完毕数据收集完成最关键的环节来了——分析。LoadRunner Analysis模块提供了强大的数据分析能力但面对几十张图表新手容易眼花缭乱。7.1 核心分析思路关联与钻取不要一张图一张图地看。正确的分析思路是关联分析和钻取分析。确定性能拐点首先打开“运行Vuser数”图和“平均事务响应时间”图将它们合并查看。找到响应时间开始显著上升的那个时间点同时观察此时的并发用户数是多少。这个点就是系统的性能拐点。关联资源指标将拐点时间与“系统资源图”关联。当响应时间上升时是CPU先到顶了还是内存耗尽了或是磁盘I/O堵住了这能帮你初步定位瓶颈所在的层级网络、服务器、数据库。钻取事务详情对响应时间最长或波动最大的事务进行钻取。查看该事务在整个测试过程中的响应时间分布最小、平均、最大、标准差并可以进一步查看其子组件如网络时间、服务器处理时间、数据库时间。分析错误与日志查看错误发生的时间点和类型。结合当时的用户负载和系统资源情况判断错误原因如超时、连接拒绝、服务器返回5xx错误等。7.2 关键图表解读与瓶颈定位速查表现象图表表现可能的原因下一步排查方向TPS曲线达到平台后下降响应时间急剧上升系统资源耗尽如线程池满、连接池满或内部出现大量锁竞争。1. 检查应用服务器日志看是否有大量错误或警告。2. 监控应用服务器线程池、数据库连接池使用率。3. 检查数据库锁等待和慢查询。响应时间缓慢但CPU、内存、网络资源利用率都很低应用在“等待”瓶颈可能在外部依赖如慢速的第三方接口、数据库慢查询、或代码中存在同步锁/死锁。1. 使用Analysis的“细分图”查看事务的“网络时间”和“服务器时间”占比。2. 开启数据库慢查询日志进行分析。3. 检查应用代码中是否存在同步方法或锁粒度不合理。随着测试进行内存使用率持续线性增长且不释放可能存在内存泄漏。1. 监控JVM的堆内存变化和老年代GC频率。2. 在压测后期使用内存分析工具如jmap, jvisualvm抓取堆转储文件分析。网络吞吐量图显示接收字节数远大于发送字节数服务器返回的数据量过大可能是查询未分页、接口返回了不必要的数据。检查相关事务的请求和响应数据大小优化接口设计。大量超时错误或连接拒绝错误服务器或中间件如Nginx的连接数已满或网络防火墙限制。1. 检查Web服务器如Nginx的worker_connections配置和当前连接状态。2. 检查操作系统最大文件描述符限制。3. 检查网络防火墙或负载均衡器的并发连接限制。7.3 生成专业测试报告Analysis支持将分析结果导出为Word、HTML或PDF报告。一份好的性能测试报告应包含测试概述测试目标、环境、时间、人员。场景执行摘要总虚拟用户数、持续时间、通过/失败事务总数。关键性能指标汇总以表格形式列出各事务的平均响应时间、90分位响应时间、TPS、通过率。资源使用情况汇总各被监控服务器的CPU、内存、磁盘、网络峰值使用率。关键图表附上“并发用户-响应时间-吞吐量”关联图、资源趋势图等核心图表。结论与建议明确给出系统是否满足性能需求的结论。如果存在瓶颈指出可能的原因和改进建议。结论要基于数据避免模糊表述。8. 高级实战技巧与常见问题排查掌握了基础流程我们再来探讨一些能让你事半功倍的高级技巧和那些“坑”。8.1 参数化数据与测试数据准备数据量要足够参数文件中的数据行数必须大于等于“虚拟用户数 × 迭代次数”且设置为“Unique”时要留有余量避免数据用完导致Vuser失败。数据真实性尽量使用贴近生产环境的数据分布。例如商品ID参数化时热门商品的出现频率应该更高。这可以通过准备不同权重的数据文件来实现。动态造数对于需要唯一性的数据如订单号可以使用LoadRunner的内置函数如lr系列函数生成或调用外部DLL/JAR包生成。8.2 脚本调试与回放失败排查脚本回放失败是家常便饭。遵循以下排查路径可以高效定位问题看日志打开“扩展日志”中的“参数替换”和“服务器返回数据”回放脚本。查看参数是否替换成功服务器返回了什么。比对请求使用工具如Fiddler、浏览器开发者工具抓取一次真实操作与LoadRunner回放时发出的请求进行逐字节比对。重点关注Headers特别是Cookie、Content-Type、请求体Body中的数据。检查关联回放失败最常见的原因是动态数据关联没做好。确认所有在录制后变化的动态值都已正确关联。检查上下文某些请求依赖于前面请求建立的上下文如Session。确保脚本逻辑完整没有跳步。简化脚本如果脚本复杂可以尝试注释掉大部分代码只保留最核心的请求序列逐步添加定位到引发错误的特定请求。8.3 分布式压测与负载机管理当单台负载机无法模拟足够压力或者需要从不同网络区域发起测试时就需要分布式压测。负载机选择负载机本身性能要强多核CPU、大内存、高速网络且系统干净没有运行其他重负载程序。网络要求所有负载机与Controller之间、与被测系统之间网络必须通畅且低延迟。高延迟或丢包会严重影响测试结果的准确性你测到的可能是网络瓶颈而非系统瓶颈。防火墙设置确保负载机上的MI Listener服务端口默认50500、54345等在防火墙中开放允许Controller连接。时间同步所有负载机和Controller的系统时间必须同步否则Analysis中的事务时间戳会对不上导致分析混乱。建议配置NTP时间同步服务。8.4 思考时间与步调时间的微妙区别这是两个常被混淆的概念思考时间Think Time模拟用户操作之间的停顿如阅读页面内容、填写表单的时间。它包含在事务的响应时间内。步调时间Pacing控制同一个Vuser两次迭代即重复执行整个Action之间的间隔时间。如何设置在压力测试/负载测试中为了在短时间内施加最大压力通常忽略思考时间并设置较短的步调时间甚至为0。在容量规划/稳定性测试中为了更真实地模拟用户行为需要保留思考时间并设置合理的步调时间使Vuser的迭代频率符合真实业务节奏例如一个用户平均每分钟完成一次下单。我个人在长期项目中的体会是性能测试的成功三分靠工具七分靠设计和分析。LoadRunner提供了所有你需要的武器但能否打胜仗取决于测试人员对业务的理解、对系统架构的认知以及严谨的分析思维。不要满足于“跑通了”要多问“为什么这个数是这样”“它意味着什么”。每一次对异常曲线的深挖都可能让你对系统的理解更深一层。最后性能测试报告不是终点推动开发团队解决发现的问题并验证修复效果形成闭环才是性能测试价值的最终体现。