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,如果不是,我们读取所有响应并将其缓存在本地。

请记住,三个最密集的部分(通常)是:

  1. DNS查询(出于各种原因,但正如我已经说过的,这里应该不是问题)
  2. 创建套接字(这总是一个昂贵的操作)
  3. 正在读取整个 body 并将其缓存在本地。

就是说,每个响应 object 都应该有一个属性 elapsed,它将为您提供响应第一个字节的时间 body。换句话说,它将测量 实际 发送请求与找到 headers 结尾之间的时间。

这可能会为您提供比您现在测量的信息更准确的信息,即消息最后一个字节的时间。

也就是说,请记住,您在 for-loop 中所做的工作也经常调用垃圾收集器:

  1. 创建Session、适配器、适配器连接池等
  2. 创建套接字
  3. 丢弃套接字
  4. 丢弃Session
  5. 转到 1

如果您创建一次 session,您的脚本总体上会表现得更好。