【问题标题】:Using Python asyncore for load / stress testing a website使用 Python asyncore 对网站进行负载/压力测试
【发布时间】:2011-07-27 22:04:53
【问题描述】:

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

短版:我正在寻找用 Python 构建自己的网站压力测试器。

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

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

我尝试了许多不同的方法。最有前途的两个是:

  1. 产生线程。其中很多。让每个线程发出一个请求。这被证明是最快的[每个线程每秒可以轻松地接近 1 个请求 - 500 个线程意味着每秒几乎 500 个请求],但是它似乎对计算机来说非常密集。在我看来,在 Python 中生成数百个线程所占用的内存和计算量令人望而却步。我觉得必须有一个更优雅的解决方案。
  2. 使用 Python 的异步库。我一直在搞这个,它似乎真的很酷,但我很快就结束了。如果我收到大约 140 个字节的请求,那么它每秒能够抛出 >1000 个请求 [太棒了!],但我需要它能够处理响应相当大的请求 [即100kb - 500kb]。引入更大的响应大小意味着它每秒会限制大约 10-50 个请求 [如果我幸运的话]。

有人有什么想法或建议吗?如果我能以某种方式获得响应的大小而无需实际读取它,那将是完美的。我只想知道我实际上得到了正确的字节数。数据是什么并不重要。

或者,如果这不是 Python 中的一个选项,那么老实说,我愿意尝试任何人必须提出的建议。我玩过 Twister,但没有达到比我已经看到的线程更高的速度。

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

【问题讨论】:

    标签: python multithreading http asynchronous asyncore


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!这似乎很有希望。不幸的是,在安装库后导入时出现以下错误:pastebin.com/XQXM7HzD。你有没有遇到过这样的问题?
    • 不,gevent 1.0 中使用了 libev,并且包含在源代码中。 gevent 的 0.13.6 版本,使用 libevent。有问题的回溯更可能是由使用的旧版本的 libevent 引起的。请安装一些 libevent-1.4.14 并确保删除旧的。
    • 或者更好的是,获取包含所有依赖项的 1.0a2 版本:code.google.com/p/gevent/downloads/list
    【解决方案2】:

    我建议您使用 pycurl,它是 libcurl 的 Python 绑定。它有自己的异步事件循环,速度非常快。

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

    查看 Pycopia 项目的WWW.client 模块(我维护)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多