使用LoadRunner进行性能测试时,如果整个场景执行时间过长(比如一个场景要跑好几个小时甚至更久,或者从脚本调试到拿到结果非常拖沓),很可能是脚本、运行时设置、监控等步骤有比较大的优化空间。
1. 精简脚本
检查脚本里是不是有大量调试性的 lr_output_message、lr_log_message,生产运行时必须去除或注释。
避免在每次迭代中做不必要的计算、复杂字符串处理。数据准备工作(如生成 token、读取大文件)尽量放到vuser_init,只做一次;清理动作放到vuser_end。
测试点(web_reg_find 等)只保留重要业务检查,过多的文本检查会明显拖慢单个事务。
2. 调优运行时设置(Run-time Settings)
日志级别:
把 Run-time Settings > Log 改为Send messages only when an error occurs或Standard log并禁用扩展日志。全量日志(如参数替换、服务器返回数据)会严重消耗CPU和I/O,让脚本变慢好几倍。
思考时间:
如果仅想看系统的最大吞吐量,可以将Think Time设为Ignore或使用很小的倍数(如 10%)来加快加压速度。
测真实用户场景时需要保留,但可通过随机 50%~150% 来模拟并控制整体迭代速度,避免死板等待。
超时设置:
调小不重要的连接及接收超时值,避免某个请求卡住长时间不释放虚拟用户资源。
3. 合理设计场景
使用 面向目的(Goal‑Oriented) 或 手动场景时,Ramp Up间隔不宜过大。如果只是测稳态性能,可以加快加载用户的速度。
采用 Duration(不断时间) 而不是固定迭代次数来结束场景,能避免因为个别高响应时间事务把整个场景拖得很长。
正式测试前,先用少量Vuser跑 5‑10 分钟试跑,确定平均事务时间后再定正式时长,避免盲目设定半小时导致无效等待。
4.给负载生成器减负
单台Load Generator负载过高(CPU 或内存满)会反过来拖慢虚拟用户的执行速度,让响应时间假性升高,拉长整体测试。
增加负载生成器(LG)数量,使每台LG的CPU使用率控制在70%以下。
LG 和控制器的网络延迟要低,尽量在同一网段。
试运行时在LG上用任务管理器或 top 观察资源,确定不是脚本慢,是机器本身的短板。
5. 调整采样频率
Controller 默认会频繁收集各项性能数据,数据量一大就会拖慢运行并占用大量磁盘 I/O。
在 Diagnostics > Configuration 中将不需要的 J2EE/.NET 诊断、深度拆解数据统统关闭。
在Results Settings中,将Data collection frequency或者Sample frequency适当调大(如每 10‑15 秒收集一次而不是 5 秒),对于吞吐量趋势已足够。
关闭Detailed log for transaction breakdown等选项,需要深度分析时才临时打开。
6. 监控计数器只留下主要标准
Controller 添加监控时,不要全选所有计数器,否则每采集一次就要拉取成百上千个数据点,严重影响收集效率。
Windows/Linux 只保留 CPU、内存、磁盘、网络吞吐这些重要计数器。
删除不关心的进程级计数器。
对于数据库、应用服务器,选用预置的主要的模板即可,不要的全部添加。
7. 用命令行方式 (CLI) 执行场景
通过命令行(Wlrun.exe 或 mdrv.exe)驱动场景,可以关闭 GUI 渲染开销,并在自动化流水线中快速批量执行。如:
bash
Wlrun.exe -TestPath "C:\Scenario.lrs" -Run -DontClose -ResultName "NightRun"
本身不会直接缩短单次场景时间,但省去了人工点击和等待图形界面响应的时间,尤其适合需要反复执行的回归测试,让整体测试周期缩短。
8. 优化参数化和数据文件
参数文件尽量放置在LG本地的高性能磁盘上(NVMe SSD),用最少的列和行,避免使用网络途径。
参数取值方法设为Unique + Once或Sequential,少用每步都产生大范围随机读取的Random方式(如果数据量大)。
避免在脚本内动态从数据库或大文件反复读取数据,把所需数据提前一次性加载到参数块。
9. 用线程方式替代进程
在Run-time Settings > Multithreading中,将虚拟用户方式从 Process(进程) 改为 Thread(线程)。
线程方式启动更快、资源占用更低,可以显著提高同一台LG能承载的最大Vuser数,减少因进程切换引起的执行延迟。让场景执行更流畅,整体时间自然缩短。
10. 脚本关联分析
不要等到所有脚本都完美关联再开始试跑场景。可以并行推进:
用 VuGen 回放调通重要流程的同时,另外的测试机已经开始准备数据、预热系统。
利用Controller的Group功能,把不同模块的脚本拼在同一个场景里并行测试,一次场景包括多条业务线,避免串行执行多条场景。