使用Python asyncore对网站进行负载/压力测试

时间:2011-07-27 22:04:54

标签: python multithreading http asynchronous asyncore

希望有人能够帮助解决这个问题。

简短版本:我希望用Python构建我自己的网站压力测试器。

为什么呢?因为我觉得它:)我不是在寻找预先构建的解决方案[即funkload或JMeter]。作为编程练习,这似乎是一件有趣的事情。我也认为学习如何做我想做的事情在以后的其他情况下可能会有用。

我想要它做什么?随着时间的推移,我打算让它变得更复杂,但我的第一个目标很简单:在尽可能短的时间内尽可能多地提出请求。我每秒拍摄300-500个请求。

我尝试了很多不同的方法。最有希望的两个是:

  1. 产生线程。其中很多。让每个线程发出一个请求。这被证明是最快的[每个线程每秒接近1个请求容易起来 - 500个线程意味着每秒几乎500个请求],但是对于计算机而言似乎非常密集。在我看来,在Python中产生数百个线程的内存和计算足迹是令人望而却步的。我觉得必须有一个更优雅的解决方案。
  2. 使用Python的asyncore库。我一直在搞乱这个,它看起来真的很酷,但我很快就被限制了。如果我收到大约140个字节的请求,那么它能够每秒抛出> 1000个请求[太棒了!],但我需要它能够处理响应相当大的请求[即100kb - 500kb]。引入更大的响应大小意味着它每秒限制大约10-50个请求[如果我很幸运]。
  3. 有没有人有任何想法或建议?如果我能够以某种方式获得响应的大小而实际上没有被强制读取它,那将是完美的。我想知道的是,我实际上正在获得正确的字节数。数据是什么并不重要。

    或者,如果这不是Python中的一个选项,那么说实话,我会尝试任何人都有的建议。我和Twister一起玩过,但没有达到比我已经看过线程更高的速度。

    无论如何 - 任何帮助都会很棒。谢谢!

2 个答案:

答案 0 :(得分:4)

我建议您尝试gevent。它可以非常简单地完成这项任务,因为你编写的代码看起来是同步的,并使用像urllib2这样的python stdlib。它将非常快,因为它具有较低的内存开销(仅支付您使用的费用)并且它使用快速轮询系统调用IO。 This code example非常接近你想要的。你需要为每个核心运行一个gevent worker。

答案 1 :(得分:0)

我建议你使用pycurl,libcurl的Python绑定。它有自己的非同步事件循环非常快。

如果您不能按原样使用它,还有一个简化的实现包装器,您可以调整它。

请参阅Pycopia项目的WWW.client模块(我维护)。