【问题标题】:jmeter vs python requests - different response timejmeter vs python请求 - 不同的响应时间
【发布时间】:2015-03-30 09:11:23
【问题描述】:

我正在使用 Jmeter 和 python Requests 包进行负载测试,但是当我尝试访问同一个网站时得到不同的结果。

目标网站:http://www.somewebsite.com/

请求次数:100

Jmeter 的平均响应时间:1965 毫秒

python 请求的平均响应时间:4076 毫秒

我检查了 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 python-requests load-testing


    【解决方案1】:

    如果没有您的 JMeter 代码,我无法告诉您有什么区别,但让我让您了解一下请求调用中发生的情况:

    • 我们创建一个 Session 对象,加上我们使用的 urllib3 连接池
    • 我们对“www.somewebsite.com”进行 DNS 查找,这不会对该请求造成太大负面影响
    • 我们为“www.somewebsite.com:80”打开一个套接字
    • 我们发送请求
    • 我们收到响应的第一个字节
    • 我们确定用户是否想要流式传输响应正文,如果不是,我们会读取所有响应正文并将其缓存在本地。

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

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

    也就是说,每个响应对象都应该有一个属性,elapsed,它将为您提供响应正文第一个字节的时间。换句话说,它将测量从实际发送请求到找到标头末尾之间的时间。

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

    也就是说,请记住,您在该 for 循环中所做的事情也会大量调用垃圾收集器:

    1. 创建会话、适配器、适配器连接池等。
    2. 创建套接字
    3. 丢弃插座
    4. 放弃会话
    5. 转到 1

    如果您创建一次会话,您的脚本通常会执行得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多