使用Python asyncore进行网站负载/压力测试
希望有人能帮忙解决这个问题。
简单来说:我想用Python自己做一个网站压力测试工具。
为什么呢?因为我觉得这样做挺有意思的 :) 我并不想要现成的解决方案,比如funkload或JMeter。我觉得这作为一个编程练习很有趣。我也认为学会怎么做这个对我以后在其他场合会有帮助。
我想让它做什么呢?我打算随着时间的推移让它变得更复杂,但我的第一个目标很简单:在最短的时间内尽可能多地发送请求。我希望能达到每秒300到500个请求。
我尝试了很多不同的方法。其中两个比较有希望:
- 创建很多线程。每个线程发送一个请求。这种方法速度很快[每个线程轻松能达到每秒1个请求——500个线程就意味着几乎每秒500个请求],但对电脑的压力非常大。我觉得在Python中同时启动几百个线程的内存和计算资源消耗太高了。我觉得应该有更优雅的解决办法。
- 使用Python的asyncore库。我试着玩了一下,感觉这个库很不错,但我很快就遇到瓶颈。如果请求的大小在140字节左右,它能达到每秒超过1000个请求[太棒了!],但我需要它能处理响应更大的请求[比如100kb到500kb]。一旦响应变大,速度就降到每秒10到50个请求[如果运气好的话]。
有没有人有什么想法或建议?如果我能在不实际读取响应内容的情况下获取响应的大小,那就太完美了。我只想知道我确实收到了正确数量的字节,数据内容不重要。
或者,如果在Python中这不是个选项,我也愿意尝试任何人推荐的其他方法。我试过Twister,但速度没有超过我用线程时的表现。
总之,任何帮助都非常感谢!
2 个回答
0
我建议你使用pycurl,这是libcurl的Python绑定。它有自己非常快速的异步事件循环。
如果你不能直接使用它,还有一个简化的实现包装器可以让你进行调整。
你可以查看我维护的Pycopia项目中的WWW.client模块。