浅谈定时器之同步定时器
“同步定时器”(Synchronizing Timer)是一个特别的定时器,它用于确保在特定时间点上多个线程(或虚拟用户)同时发起请求,这对于测试系统在高并发情况下的表现尤为重要。本文将深入解析JMeter的同步定时器及其应用。
同步定时器基础
同步定时器的主要目的是在测试执行过程中创建一个“集合点”,即等待指定数量的线程到达后,这些线程才会同时执行后续操作。这对于模拟网站或应用程序在短时间内受到大量用户访问的场景非常有用,例如电商的大促活动开始瞬间、新闻网站的热点新闻发布时等。
参数说明
- 模拟用户组数量:
这是同步定时器的核心参数,指定了需要等待多少个线程达到同步点后才一起释放执行。例如,设置为100表示只有当100个线程都到达此定时器时,它们才会作为一个整体同时发送请求。 - 超时时间以毫秒为单位:
指定线程等待其他线程达到同步点的最大等待时间,单位是毫秒。如果在这个时间内没有达到设定的用户数量,已到达的线程将不再等待,会直接执行后续操作。设置为0表示无限等待,直到达到指定的用户数量。
应用场景
● 压力测试:在需要模拟大量用户同时访问某一功能时,使用同步定时器可以准确控制并发用户的数量和时间点,以评估系统的最大承载能力。
● 负载测试:验证系统在预期的并发用户量下是否能稳定运行,避免因用户同时操作导致的服务崩溃或响应延迟。
● 稳定性测试:通过设定不同数量的同步用户,测试系统在不同负载水平下的稳定性表现。
配置示例
- 添加同步定时器:
在JMeter的测试计划中,右击希望添加同步点的线程组,选择“添加”>“定时器”>“同步定时器”。 - 参数配置:
假设我们要模拟100个用户同时下单,设置“模拟用户组的数量”为100,根据实际情况设置合适的“超时时间以毫秒为单位”的参数。 - 注意事项:
○ 使用同步定时器会显著增加测试执行的时间,特别是当设置的用户数较大且超时时间较短时。
○ 需要合理配置线程组中的线程数,确保至少有足够的线程能够达到同步点。
○ 考虑到测试环境的资源限制,避免设置过高的并发数导致测试环境崩溃。
配置示例
我们编写如下脚本
线程组:线程数设置为10,其他保持默认
同步定时器:模拟用户组的数量设置为9,超时时间为毫秒为单位5000
BeanShell 取样器:编写如下脚本
log.info("test");
运行脚本,查看JMeter日志如下
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,011 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,012 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,012 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,012 INFO o.a.j.u.BeanShellTestElement: test
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-9
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-8
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-7
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-6
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-7
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-5
2024-07-01 15:01:27,012 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-4
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-6
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-4
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-3
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-8
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-9
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-3
2024-07-01 15:01:27,013 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-5
2024-07-01 15:01:27,014 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2024-07-01 15:01:27,111 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-10
2024-07-01 15:01:32,126 WARN o.a.j.t.SyncTimer: SyncTimer 同步定时器 timeouted waiting for users after: 5000ms
2024-07-01 15:01:32,126 INFO o.a.j.u.BeanShellTestElement: test
可以看到线程组1-1到线程组1-9都在2024-07-01 15:01:27这个时间点执行,因为设置的是10个线程,并且只是执行一次,所以线程组1-10这个线程在超时时间内等待线程是否还要运行,当超过超时时间时,线程组1-10没有等到其他线程,所以进行了一次运行。
结论
同步定时器是JMeter中实现高并发测试的关键组件之一,通过精细控制并发用户的行为,帮助测试人员更准确地评估系统在极端条件下的性能表现。正确使用同步定时器,结合其他JMeter组件,可以构建出贴近实际业务场景的性能测试方案,为软件的优化和扩容提供数据支持。