JMeter同步定时器与并发关系测试
分析了并发测试时JMeter同步定时器的设置对测试的影响
JMeter同步定时器与并发关系测试
1.JMeter测试并发py验证
JMeter运行过程中能看到图形结果如图
无法看出是否在某时间节点的并发情况,需要写个python脚本对统计结果结合分析

x轴表示时间轴,y轴表示响应时间
JMeter 输出的结果文件jtl中包含时间戳字段(默认格式是毫秒级 Unix 时间戳)。
使用Python 统计每个请求的时间间隔。
如果发现多个请求集中在同一个时间点(例如相差几毫秒),则说明它们是并发执行的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
# ================== 配置部分 ==================
jtl_file = 'test_4.jtl' # 替换为你自己的 JTL 文件路径
output_image = 'concurrency_analysis_4b.png' # 输出图表文件名
timeX = '1ms' # 替换为你的 X 值,单位毫秒
# ================== 数据处理 ==================
# 读取 JMeter 结果文件
df = pd.read_csv(jtl_file)
# 将时间戳转换为 datetime 类型(毫秒级)
df['time'] = pd.to_datetime(df['timeStamp'], unit='ms')
# 设置时间为索引
df.set_index('time', inplace=True)
# 按X毫秒聚合请求数量
requests_per_Xms = df.resample(timeX).size()
print(requests_per_Xms)
# 可选:提取每个请求的“线程名”用于识别并发批次
# 如果你需要分析哪些请求来自同一批并发,可使用线程名或自定义变量
# 示例:假设你用 JSR223 添加了 batch_id 到响应数据中,也可以类似处理
# ================== 图形化展示 ==================
plt.figure(figsize=(16, 6))
# 绘制柱状图
ax = requests_per_Xms.plot(kind='bar', color='skyblue', edgecolor='black')
# 设置标题和标签
plt.title(f'Concurrency Pattern: Requests per {timeX}', fontsize=14)
plt.xlabel(f'Time (with {timeX} resolution)', fontsize=12)
plt.ylabel('Number of Requests', fontsize=12)
# 设置 x 轴格式(显示到毫秒)
def format_x_labels(x, pos=None):
if x >= len(requests_per_Xms):
return ''
dt = requests_per_Xms.index[x]
return dt.strftime('%H:%M:%S.%f')[:-3] # 显示到毫秒
ax.xaxis.set_major_locator(plt.MaxNLocator(nbins=20))
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: format_x_labels(int(x))))
# 旋转 x 轴标签
plt.xticks(rotation=45)
plt.tight_layout()
# 保存图像
plt.savefig(output_image, dpi=150)
# 显示图像
plt.show()
print(f"✅ 已生成图表:{output_image}")
总结:
- 通过测试执行次数和执行持续时间两种情况都能证明,无同步定时器几乎不能达到并发条件(见2.1和2.2、见3.1和3.2)
- 通过测试线程数和同步定时器的设定数(可以理解为集合点数),得出如下结论(见2.3和2.4、见3.3和3.4)
a.线程数小于集合点数,并发按照线程数为准;
b.线程数大于集合点数,并发按照集合点数为准。
2.线程按次数执行,执行10次
- 线程数等于定时器数,有同步定时器

图,线程10同步定时器10_测试执行10次 - 线程数等于定时器数,无同步定时器

图5、 jmeter设置10线程执行10次(无同步定时器为),时间间隔10ms
无同步定时器,设置10线程测试10次并不能达到10并发,从图5的X轴时间和Y轴的请求数能看出,
无同步定时器,并发最高只能到4 - 线程数小于定时器数

如图所示,线程5同步定时器10_测试执行10次,jmeter不执行,跑了8分钟都run起来 - 线程数大于定时器数
最大并发只能到5

图,线程10同步定时器5_测试执行10次
横轴是精确到毫秒的时间点(如 04:55:47.400)
纵轴是该 100ms 时间窗口内的请求数
每个柱子代表一次并发行为(如 10 个请求)
3.线程按持续时间执行,持续10s
本文版权归作者所有,未经许可不得转载。










