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

2 投票
2 回答
962 浏览
提问于 2025-04-16 22:23

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

简单来说:我想用Python自己做一个网站压力测试工具。

为什么呢?因为我觉得这样做挺有意思的 :) 我并不想要现成的解决方案,比如funkload或JMeter。我觉得这作为一个编程练习很有趣。我也认为学会怎么做这个对我以后在其他场合会有帮助。

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

我尝试了很多不同的方法。其中两个比较有希望:

  1. 创建很多线程。每个线程发送一个请求。这种方法速度很快[每个线程轻松能达到每秒1个请求——500个线程就意味着几乎每秒500个请求],但对电脑的压力非常大。我觉得在Python中同时启动几百个线程的内存和计算资源消耗太高了。我觉得应该有更优雅的解决办法。
  2. 使用Python的asyncore库。我试着玩了一下,感觉这个库很不错,但我很快就遇到瓶颈。如果请求的大小在140字节左右,它能达到每秒超过1000个请求[太棒了!],但我需要它能处理响应更大的请求[比如100kb到500kb]。一旦响应变大,速度就降到每秒10到50个请求[如果运气好的话]。

有没有人有什么想法或建议?如果我能在不实际读取响应内容的情况下获取响应的大小,那就太完美了。我只想知道我确实收到了正确数量的字节,数据内容不重要。

或者,如果在Python中这不是个选项,我也愿意尝试任何人推荐的其他方法。我试过Twister,但速度没有超过我用线程时的表现。

总之,任何帮助都非常感谢!

2 个回答

0

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

如果你不能直接使用它,还有一个简化的实现包装器可以让你进行调整。

你可以查看我维护的Pycopia项目中的WWW.client模块。

4

我建议你试试gevent。这个工具可以很简单地完成你想做的事情,因为你写的代码看起来就像是同步的,而且可以使用Python自带的库,比如urllib2。它的速度会很快,因为它占用的内存很少(只为你实际使用的部分付费),而且它使用了快速的轮询系统调用来处理输入输出。这个代码示例和你想要的功能非常接近。你会想要为每个核心运行一个gevent工作进程。

撰写回答