jmeter vs python 请求 - 不同的响应时间
jmeter vs python requests - different response time
我正在运行使用Jmeter和python请求包进行负载测试,但是当我尝试访问同一个网站时得到不同的结果。
目标网站:http://www.somewebsite.com/
request times: 100
avg response time for Jmeter: 1965ms
avg response time for python Requests: 4076ms
我检查了jmeter的响应html内容和python请求是一样的。所以这意味着他们都从网站上得到了正确的回应。但不确定为什么它们彼此相差 2 倍。有谁知道这有什么深层原因吗?
python请求示例代码:
repeat_time = 100
url = 'http://www.somewebsite.com/'
base_time = datetime.datetime.now()
time_cost = base_time
for i in range(repeat_time):
start_time = datetime.datetime.now()
r = requests.get(url, headers=headers)
end_time = datetime.datetime.now()
print str(r.status_code) + ';time cost: %s' % (end_time - start_time)
time_cost += (end_time - start_time)
print 'total time: %s' % (time_cost - base_time)
print 'average time: %s' % ((time_cost - base_time).total_seconds() / repeat_time)
如果没有你的 JMeter 代码,我无法告诉你有什么区别,但让我告诉你在那个请求调用中发生了什么:
- 我们创建一个Sessionobject,加上我们使用的urllib3连接池
- 我们为 'www.somewebsite.com' 做了一个 DNS look-up,这应该不会对这个请求产生太大的负面影响
- 我们为'www.somewebsite.com:80'
打开一个套接字
- 我们发送请求
- 我们收到响应的第一个字节
- 我们确定用户是否想要流式传输响应的 body,如果不是,我们读取所有响应并将其缓存在本地。
请记住,三个最密集的部分(通常)是:
- DNS查询(出于各种原因,但正如我已经说过的,这里应该不是问题)
- 创建套接字(这总是一个昂贵的操作)
- 正在读取整个 body 并将其缓存在本地。
就是说,每个响应 object 都应该有一个属性 elapsed
,它将为您提供响应第一个字节的时间 body。换句话说,它将测量 实际 发送请求与找到 headers 结尾之间的时间。
这可能会为您提供比您现在测量的信息更准确的信息,即消息最后一个字节的时间。
也就是说,请记住,您在 for-loop 中所做的工作也经常调用垃圾收集器:
- 创建Session、适配器、适配器连接池等
- 创建套接字
- 丢弃套接字
- 丢弃Session
- 转到 1
如果您创建一次 session,您的脚本总体上会表现得更好。
我正在运行使用Jmeter和python请求包进行负载测试,但是当我尝试访问同一个网站时得到不同的结果。
目标网站:http://www.somewebsite.com/
request times: 100
avg response time for Jmeter: 1965ms
avg response time for python Requests: 4076ms
我检查了jmeter的响应html内容和python请求是一样的。所以这意味着他们都从网站上得到了正确的回应。但不确定为什么它们彼此相差 2 倍。有谁知道这有什么深层原因吗?
python请求示例代码:
repeat_time = 100
url = 'http://www.somewebsite.com/'
base_time = datetime.datetime.now()
time_cost = base_time
for i in range(repeat_time):
start_time = datetime.datetime.now()
r = requests.get(url, headers=headers)
end_time = datetime.datetime.now()
print str(r.status_code) + ';time cost: %s' % (end_time - start_time)
time_cost += (end_time - start_time)
print 'total time: %s' % (time_cost - base_time)
print 'average time: %s' % ((time_cost - base_time).total_seconds() / repeat_time)
如果没有你的 JMeter 代码,我无法告诉你有什么区别,但让我告诉你在那个请求调用中发生了什么:
- 我们创建一个Sessionobject,加上我们使用的urllib3连接池
- 我们为 'www.somewebsite.com' 做了一个 DNS look-up,这应该不会对这个请求产生太大的负面影响
- 我们为'www.somewebsite.com:80' 打开一个套接字
- 我们发送请求
- 我们收到响应的第一个字节
- 我们确定用户是否想要流式传输响应的 body,如果不是,我们读取所有响应并将其缓存在本地。
请记住,三个最密集的部分(通常)是:
- DNS查询(出于各种原因,但正如我已经说过的,这里应该不是问题)
- 创建套接字(这总是一个昂贵的操作)
- 正在读取整个 body 并将其缓存在本地。
就是说,每个响应 object 都应该有一个属性 elapsed
,它将为您提供响应第一个字节的时间 body。换句话说,它将测量 实际 发送请求与找到 headers 结尾之间的时间。
这可能会为您提供比您现在测量的信息更准确的信息,即消息最后一个字节的时间。
也就是说,请记住,您在 for-loop 中所做的工作也经常调用垃圾收集器:
- 创建Session、适配器、适配器连接池等
- 创建套接字
- 丢弃套接字
- 丢弃Session
- 转到 1
如果您创建一次 session,您的脚本总体上会表现得更好。