HTTP协议下优化JMeter脚本思路是让JMeter更真实地模拟浏览器行为,并更高效地利用系统资源。
连接池优化:
HTTP协议根据TCP,每次新建连接都要经历三次握手,开销很大。连接池的思路是复用已建立的连接,避免为每个请求重复创建和销毁连接,从而显著降低延迟和资源消耗。
1. 使用HttpClient4实现
在JMeter的HTTP Request Sampler的Advanced选项卡中,保证Implementation选择为HttpClient4。
2. 开启Keep-Alive
在HTTP Request Sampler的Advanced选项卡中,勾选Use KeepAlive。这会在请求头中加入Connection: keep-alive。
3. 配置合理的超时时间
在HTTP Request Sampler的Advanced选项卡中或通过HTTP Request Defaults配置元件统一设置:
连接超时 (Connect Timeout):建议设置为 5000 ms(5秒)。如果网络状况不佳,可适当调大。
响应超时 (Response Timeout):根据业务响应时间合理设置,如 10000 ms(10秒)。过长的超时会导致线程被长时间占用。
4. 调整连接池和重试方法
需要在jmeter.properties文件中配置:
httpclient4.time_to_live:设置连接在池中的最大存活时间(毫秒)。默认-1表示无限。建议设置为 60000(60秒),防止使用已被服务端关闭的死连接。
httpclient4.retrycount:请求失败后的重试次数。默认值为3,建议调整为 1。过多的重试会“美化”测试结果,并可能在服务端压力过大时加重负担。
httpclient4.idletimeout:设置连接空闲多长时间后将被关闭(毫秒)。建议设置为 10000(10秒),以快速释放空闲资源。
5. 保证连接在迭代间复用
默认情况下,JMeter在每个线程组迭代时可能会重置HTTP状态。为保证连接复用,可在jmeter.properties文件中添加:
text
httpclient.reset_state_on_thread_group_iteration=false
如果在线程组中勾选了Same user on each iteration,此属性将被忽略。
缓存管理器优化:
HTTP Cache Manager用于模拟浏览器的缓存行为,避免对图片、CSS、JS等静态资源进行重复请求,使测试结果更贴近真实用户场景。
1. 添加并启用缓存管理器
在测试计划中,右键点击Thread Group -> 添加 -> 配置元件 -> HTTP Cache Manager。保证勾选 Use Cache 以启用功能。
2. 保证管理器作用域正确
HTTP Cache Manager必须放在目的HTTP Request的同级或父级节点下,才能生效。
3. 配置跨线程缓存共享
对于多线程(模拟多用户)场景,默认每个线程有独立缓存。如需共享缓存,将管理器的 Share Mode 设置为 All threads。
4. 检查服务端缓存响应头
JMeter严格按照HTTP缓存协议。只有当服务端响应头包含Cache-Control或Expires等缓存指令时,管理器才会缓存资源。如果服务端未返回相关头,可手动添加HTTP Header Manager来模拟。
5. 避免请求破坏缓存
保证请求不包含会破坏缓存的随机参数(如时间戳?t=123456)或强制刷新的请求头(如Cache-Control: no-cache)。
6. 控制缓存大小
默认缓存最多存储 5000 条记录。如需调整,可在jmeter.properties中设置 maxSize 属性。注意,增大缓存会消耗更多内存,可能需要相应调整JVM的-Xmx参数。
优化注意
除了连接池和缓存管理器,以下也能提升脚本性能:
使用非GUI方式运行:这是性能测试的基本要求,能大幅降低JMeter自身的资源消耗。
优化JVM参数:根据机器内存,调整堆内存(如-Xms4g -Xmx4g),并启用G1垃圾回收器(-XX:+UseG1GC)以减少GC停顿。
避免使用高开销监听器:压测时应禁用或移除View Results Tree等图形界面监听器,改用Aggregate Report或Simple Data Writer。
控制嵌入式资源下载:仅在需要模拟完整浏览器行为时才勾选“Retrieve All Embedded Resources”,并合理设置并发下载数量。
注意服务端限制:连接复用不仅取决于客户端,也受服务端配置影响。如,Tomcat的maxKeepAliveRequests参数可能限制单个连接的请求数。
使用调试日志:如果缓存行为不符合预期,可在jmeter.properties中开启DEBUG日志来定位问题。
通过精细配置连接池来复用TCP连接以及使用缓存管理器来避免重复请求静态资源,是优化JMeter脚本、降低客户端压力、获得更真实测试结果的两个手段。