jmeter vs python请求 - 不同的响应时间

时间:2015-03-30 09:11:24

标签: jmeter python-requests load-testing

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

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

  

请求时间:100

     

Jmeter的平均响应时间:1965ms

     

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

我已经检查过响应html内容的jmeter和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)

1 个答案:

答案 0 :(得分:0)

如果没有你的JMeter代码,我无法告诉你它的区别是什么,但让我告诉你在一次调用请求时发生了什么:

  • 我们创建一个Session对象,以及我们使用的urllib3连接池
  • 我们对'www.somewebsite.com'进行DNS查询,这不应对此请求产生太大的负面影响
  • 我们为'www.somewebsite.com:80'
  • 打开一个套接字
  • 我们发送请求
  • 我们收到回复的第一个字节
  • 我们确定用户是否想要传输响应的主体,如果不是,我们会读取所有响应并在本地缓存它。

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

  1. DNS查询(出于各种原因,但正如我已经说过,这不应该是一个问题)
  2. 套接字创建(总是昂贵的操作)
  3. 读取整个身体并在本地缓存。
  4. 也就是说,每个响应对象都应该有一个属性elapsed,它会给你时间到响应体的第一个字节。换句话说,它将衡量请求实际发送的时间与找到标题结尾之间的时间。

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

    那就是说,请记住,你在for循环中所做的事情也在很多地调用垃圾收集器:

    1. 创建会话,适配器,适配器连接池等
    2. 创建套接字
    3. 丢弃插座
    4. 放弃会话
    5. 转到1
    6. 如果您创建一次会话,您的脚本通常会表现得更好。