利用python做压力测试

http://www.pythoner.cn/home/blog/twisted-treq-http-test/

 

发布时间: admin 10 months ago

(0 comments)

从事API相关的工作很有挑战性,在高峰期保持系统的稳定及健壮性就是其中之一,这也是我们在Mailgun做很多压力测试的原因。

这么久以来,我们已经尝试了很多种方法,从简单的ApacheBench到复杂些的自定义测试套。但是本贴讲述的,是一种使用python进行“快速粗糙”却非常灵活的压力测试的方法。

使用python写HTTP客户端的时候,我们都很喜欢用 Requests library。这也是我们向我们的API用户们推荐的。Requests 很强大,但有一个缺点,它是一个模块化的每线程一个调用的东西,很难或者说不可能用它来快速的产生成千上万级别的请求。

Treq on Twisted简介

为解决这个问题我们引入了Treq (Github库)。Treq是一个HTTP客户端库,受Requests影响,但是它运行在Twisted上,具有Twisted典型的强大能力:处理网络I/O时它是异步且高度并发的方式。

Treq并不仅仅限于压力测试:它是写高并发HTTP客户端的好工具,比如网页抓取。Treq很优雅、易于使用且强大。这是一个例子:

01>>> from treq import get
02
03>>> def done(response):
04... print response.code
05... reactor.stop()
06
07>>> get("http://www.github.com").addCallback(done)
08
09>>> from twisted.internet import reactor
10>>> reactor.run()
11200

简单的测试脚本

如下是一个使用Treq的简单脚本,用最大可能量的请求来对单一URL进行轰炸。
01#!/usr/bin/env python
02from twisted.internet import epollreactor
03epollreactor.install()
04
05from twisted.internet import reactor, task
06from twisted.web.client import HTTPConnectionPool
07import treq
08import random
09from datetime import datetime
10
11req_generated = 0
12req_made = 0
13req_done = 0
14
15cooperator = task.Cooperator()
16
17pool = HTTPConnectionPool(reactor)
18
19def counter():
20'''This function gets called once a second and prints the progress at one
21second intervals.
22'''
23print("Requests: {} generated; {} made; {} done".format(
24req_generated, req_made, req_done))
25# reset the counters and reschedule ourselves
26req_generated = req_made = req_done = 0
27reactor.callLater(1, counter)
28
29def body_received(body):
30global req_done
31req_done += 1
32
33def request_done(response):
34global req_made
35deferred = treq.json_content(response)
36req_made += 1
37deferred.addCallback(body_received)
38deferred.addErrback(lambda x: None) # ignore errors
39return deferred
40
41def request():
42deferred = treq.post('http://api.host/v2/loadtest/messages',
43auth=('api', 'api-key'),
44data={'from': 'Loadtest <test@example.com>',
45'to': 'to@example.org',
46'subject': "test"},
47pool=pool)
48deferred.addCallback(request_done)
49return deferred
50
51def requests_generator():
52global req_generated
53while True:
54deferred = request()
55req_generated += 1
56# do not yield deferred here so cooperator won't pause until
57# response is received
58yield None
59
60if __name__ == '__main__':
61# make cooperator work on spawning requests
62cooperator.cooperate(requests_generator())
63
64# run the counter that will be reporting sending speed once a second
65reactor.callLater(1, counter)
66
67# run the reactor
68reactor.run()
输出结果:
12013-04-25 09:30 Requests: 327 generated; 153 sent; 153 received
22013-04-25 09:30 Requests: 306 generated; 156 sent; 156 received
32013-04-25 09:30 Requests: 318 generated; 184 sent; 154 received

“Generated”类的数字代表被Twisted反应器准备好但是还没有发送的请求。这个脚本为了简洁性忽略了所有错误处理。为它添加超时状态的信息就留给读者作为一个练习。

这个脚本可以当做是一个起始点,你可以通过拓展改进它来自定义特定应用下的处理逻辑。建议你在改进的时候用collections.Counter 来替代丑陋的全局变量。这个脚本运行在单线程上,想通过一台机器压榨出最大量的请求的话,你可以用类似 mulitprocessing 的技术手段。

愿你乐在压力测试!

英文原文:Stress Testing HTTP with Twisted Python and Treq

转载:开源中国

Currently unrated


发表评论
0条评论
0次被喜欢

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值