本文大纲

《如何做性能测试》

JMeter使用注意点

测试工具介绍

解决JMeter压力测试中大量TIME_WAIT状态连接的问题

在进行Web应用性能测试时,经常会遇到网络连接相关的异常情况。例如,在使用JMeter对Tomcat中的Web应用(通过HTTP协议)进行压测时,常常会发现系统每隔2分钟卡住10秒左右,然后又恢复正常。经过深入分析和排查后,我们发现JMeter客户端产生了大约1.6万个TIME_WAIT状态的连接等待回收,导致网络连接被堵塞,无法建立新的连接。

TIME_WAIT状态简介

在网络通信中,TCP连接在关闭时会经历一个称为TIME_WAIT的状态。这是为了确保所有数据包都已传输完毕,并且允许重传未到达的数据包。虽然这是一个安全机制,但当大量连接频繁打开和关闭时,会导致大量的TIME_WAIT状态存在,从而消耗宝贵的网络资源。

问题分析

  • JMeter客户端 :在压力测试过程中,由于短时间内创建了大量的TCP连接并快速关闭,导致JMeter客户端积累了大量处于TIME_WAIT状态的连接。
  • 服务器端(Tomcat) :虽然服务器端也受到影响,但主要瓶颈在于客户端因大量的TIME_WAIT连接而导致无法继续建立新的连接。

解决方案

1. 加速TIME_WAIT回收时间

可以通过调整操作系统的TCP参数来加速TIME_WAIT状态的回收。例如,在Linux系统中可以设置以下内核参数:

  • net.ipv4.tcp_fin_timeout:定义了处于FIN-WAIT-2状态的最大超时时间,默认为60秒,可适当缩短。
  • net.ipv4.tcp_tw_reuse:允许重用TIME_WAIT套接字,即使它仍在TIME_WAIT状态中。
  • net.ipv4.tcp_tw_recycle:启用TCP快速回收机制。注意此选项在某些情况下可能导致连接失败。

2. 使用Keep-Alive长连接

从根本上解决TIME_WAIT问题的最佳方法是使用HTTP Keep-Alive机制。Keep-Alive允许客户端和服务器之间保持持久的TCP连接,从而避免频繁地建立和关闭连接。

在JMeter中配置HTTP请求默认启用Keep-Alive:

  1. 打开JMeter测试计划。
  2. 在线程组(Thread Group)中右键点击“添加” -> “取样器” -> “HTTP请求”,进入“高级”选项卡。
  3. 将“Connection Timeout (in milliseconds)”设置为一个合理的值,如5000毫秒。
  4. 检查并确保“Keep-Alive”参数被启用。

image2017-10-4 19:7:48.png

注意:下图中的http客户端的实现,应选择HttpClient对keepalive支持好,可以解决问题。不要选择“java”实现对keepalive支持不好,未能解决问题。

image2017-10-4 19:8:23.png

结论

通过优化TCP参数和启用HTTP Keep-Alive机制,可以有效解决JMeter压力测试中TIME_WAIT状态连接积累的问题。这种方法不仅能够提升系统的响应性能,还能减少网络资源的消耗,从而确保长时间的压力测试更加稳定可靠。

以上解决方案适用于大多数情况下的网络通信问题,并且可以根据具体的系统环境进行相应的调整和优化。通过合理的配置和调优,可以显著提高Web应用在高并发场景下的稳定性与性能。

模拟固定的QPS压力

目标 :使用 JMeter 以恒定的 QPS(每秒查询次数)值模拟 300 QPS 的负载,确保产生的压力是稳定的。

使用 Constant Throughput Timer 控制请求速率

JMeter 提供了一个非常有用的定时器——Constant Throughput Timer(常数吞吐量定时器),它可以帮助我们精确地控制给定取样器发送请求的频率。通过设置期望的 QPS 值,我们可以确保 JMeter 产生稳定的压力。

如何配置 Constant Throughput Timer

  1. 添加 Constant Throughput Timer

    • 在你的测试计划中选择一个线程组(Thread Group)。
    • 右键点击该线程组,然后选择“插入” -> “定时器” -> “常数吞吐量定时器”。
    • image2017-10-4 19:17:37.png
  2. 配置目标吞吐量

    • 打开 Constant Throughput Timer 的配置对话框,在“目标请求/分钟”(Target Requests per Minute)字段中设置期望的 QPS 值。
    • 例如,如果需要模拟每秒 300 次请求,则设置为 18000(因为每分钟有60秒)。
    • image2017-10-4 19:13:2.png
  3. 调整其他参数

    • “使用活动线程数”(Use all active threads):选择此选项可以确保所有活动的线程都参与控制吞吐量。
    • “如果未达到目标则延迟”(If target not reached, delay thread):启用该选项可以在实际请求频率低于期望值时暂时挂起线程,直到达到目标速率。
  4. 测试与调整

    • 运行 JMeter 测试计划并观察实际的 QPS 是否符合预期。
    • 根据实际情况微调 Target Requests per Minute 的值以确保稳定的压力输出。

通过使用 Constant Throughput Timer,并结合适当的线程配置和取样器设置,可以有效地模拟固定数量的每秒请求次数(QPS),从而在测试环境中实现稳定的负载压力。这种方法不仅简单易用,还能帮助我们准确地评估应用系统的性能瓶颈与响应能力。

结论

利用 JMeter 的 Constant Throughput Timer 可以轻松控制和调整发送到服务器的请求速率,确保模拟出稳定且符合预期的 QPS 压力值(例如 300 QPS)。这有助于更真实、准确地进行系统性能测试,并为优化应用系统的响应能力提供有价值的参考依据。

Constant Throughput Timer 的主要属性介绍

名称 :定时器的名称

Target throughput(in samples per minute):目标吞吐量。注意这里是每分钟发送的请求数,因此,对应测试需求中所要求的20 QPS ,这里的值应该是1200 。

Calculate Throughput based on:有5个选项,分别是:

  This thread only :控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的 target Throughput 乘以矣线程的数量。

  All active threads : 设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。

  All active threads in current thread group :设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,

      该选项和All active threads选项的效果完全相同。

  All active threads (shared ):与All active threads 的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。

  All cative threads in current thread group (shared ):与All active threads in current thread group 基本相同,唯一的区别是,

      每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。

  当然,Constant Throughput Timer只有在线程组中的线程产生足够多的request 的情况下才有意义,因此,即使设置了Constant Throughput Timer的值,也可能由于线程组中的线程数量不够,或是定时器设置不合理等原因导致总体的QPS不能达到预期目标。