LoadRunner Vuser资源占用调优指南
一、 问题诊断:
Vuser占用资源过高一般表现为单台负载生成器可模拟的用户数远低于预期或测试运行时CPU/内存使用率飙升至接近100%。
区分短板类型:
CPU不断>90%:一般由两种原因导致:一是Vuser数量过多,操作系统进程/线程调度开销过大;二是脚本思路复杂,包含大量运算、检查点或动态关联,单个Vuser消耗过高。
内存耗尽或频繁交换:表示Vuser进程/线程的内存开销过大,或脚本中存在内存泄露(如未释放的缓冲区、过多的web_reg_save_param捕获)。
网络连接数限制:错误日志伴随大量“27796”连接失败,是Windows TCP/IP端口耗尽的表现,而不是严格意义上的资源占用,但限制了Vuser数量上限。
使用性能计数器准确定位:
在负载生成器上监控以下重点计数器:
Process(vugen*) -> % Processor Time:查看单个VuGen进程的CPU占用。
Process(vugen*) -> Private Bytes:查看单个VuGen进程的独占内存。
System -> Context Switches/sec:如果数值很高(如>50,000/秒),说明进程/线程数过多,导致系统忙于切换。
TCPv4 -> Connections Established:监控已建立的TCP连接数。
二、 Vuser运行机制
LoadRunner的Vuser可以运行在两种方式下:
多进程方式(默认):每个Vuser作为独立的mmdrv.exe进程运行。优点是稳定性高,一个Vuser崩溃不影响其他;缺点是内存开销巨大(每个进程约20-50MB),启动慢,上下文切换成本高。
多线程方式:多个Vuser作为线程运行在同一个mmdrv.exe进程中。优点是内存开销极小(每个线程仅约1-2MB),启动迅速;缺点是稳定性风险高,一个线程的严重错误可能导致整个进程崩溃,且某些技术(如Citrix、Java)不支持。
资源占用高的重要矛盾是:在有限的硬件上,试图用“多进程”方式运行过多Vuser。
三、 系统级调优为高并发创造条件
操作系统内核参数调优(Windows)
调整TCP/IP临时端口范围:防止端口耗尽限制Vuser数。
修改注册表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新增DWORD值:
MaxUserPort = 65534 (十进制,最大临时端口数)
TcpTimedWaitDelay = 30 (十进制,TIME_WAIT状态保持时间,单位秒)
目的:将可用端口数从默认约4000个增加到近6万个,显著提升单机模拟能力。
优化系统内存管理:
对于物理内存大于8GB的负载生成器,建议禁用虚拟内存分页文件(仅用于纯性能测试的专用机器),或将其设置在独立的、高速的SSD上,避免磁盘I/O成为短板。
LoadRunner运行时引擎配置
启用Vuser线程化运行(最有效的内存优化):
在Controller中,进入 “情形” -> “运行时设置” -> “常规” -> “其他”。
勾选 “按线程运行Vuser”。
警告:切换后必须对脚本进行全面回归测试。尤其检查依赖进程局部存储(如C语言static变量)或COM对象的脚本,在线程方式下可能行为异常。
调整mdrv.dat配置文件,减少进程开销:
编辑 <LoadRunner安装目录>\dat\mdrv.dat。
找到对应协议的部分(如[wsrweb]),添加或修改参数:
CmdLine=-drv lr_websocket.dll
EnvVars=WIN_INIT=... (已有内容)
**MaxThreadPerProcess=100** // 限制单个mmdrv进程内的最大线程数,避免单个进程过大
**ExtraCopyCmdLine=-mem 1024** // (示例)限制单个mmdrv进程的内存上限(KB)
修改前必须备份原文件。
四、 Vuser脚本调优
脚本优化
日志输出:
在正式负载测试的运行时设置中,将日志级别设置为仅在错误发生时发送消息。完整的日志输出会产生巨大的磁盘I/O和内存开销。
优化关联和检查点:
仅对必需的、动态变化的值进行关联。避免使用过于宽泛的左/右边界,导致搜索响应体耗时增加。
web_reg_find等检查点函数会强制完整下载页面资源。如果非必要,应移除或替换为对捕获参数的简单思路判断。
合理使用思考时间控制:
在设计中,利用 lr_think_time 和 pacing(迭代间隔)来控制Vuser的请求频率,避免以极限速度狂轰滥炸,这能直接降低CPU和网络连接的峰值压力。
设计优化
采用渐进式负载:
避免瞬间启动所有Vuser。使用 “渐进式” 或 “目的情形” ,让负载平缓上升,给予操作系统和应用程序缓冲时间,可以观察到资源随着负载增加的渐变趋势,而不是瞬间过载。
分布式负载生成:
当单台负载生成器达到物理极限(CPU不断>85%)时,最有效的方案是增加更多负载生成器,将Vuser分散到多台机器上执行。这是解决资源问题的硬件方案。
五、 监控
任何调优后,必须通过一个压力测试来确定效果和稳定性。
设计证实情形:
使用一个稳定、简单的脚本(如访问静态页面)。
以线程方式和优化后的配置,逐步增加Vuser数量,直到达到目的或出现资源短板。
监控标准:每秒事务数(TPS)是不是线性增长、响应时间是不是平稳、错误率是不是为零、系统资源使用率是不是在安全阈值内。
建立基线:
记录调优前后,在相同硬件上支持的最大稳定Vuser数、TPS及资源利用率。
六、 调优总结:
目的Vuser数 < 500:优先尝试启用“按线程运行Vuser”,并调整Windows TCP/IP参数。
目的Vuser数 > 500:必须采用分布式负载生成,并结合线程方式。
CPU不断过高:检查脚本思路,减少检查点和复杂运算;增加lr_think_time;考虑升级CPU或增加负载机。
内存耗尽:第一要务切换至线程方式;其次检查脚本内存泄露;最后考虑增加物理内存。
出现大量网络错误:立即检查并调整Windows MaxUserPort 和 TcpTimedWaitDelay 设置。