Contents
tornado并发加到2000就开始出错?!
现象
dean forever [email protected] 发件人当地时间: 发送时间 10:47 (GMT+08:00)。发送地当前时间:下午10:05。 ✆ 主题: [CPyUG] 测试tornado性能时 并发加到2000就开始出错?
双核 2.0Ghz debian系统 跑tornado的hello world:
1 import tornado.httpserver
2 import tornado.ioloop
3 import tornado.web
4 class MainHandler(tornado.web.RequestHandler):
5 def get(self):
6 self.write("Hello, world")
7 application = tornado.web.Application([(r"/", MainHandler),])
8
9 if __name__ == "__main__":
10 http_server = tornado.httpserver.HTTPServer(application)
11 http_server.listen(1081)
12 tornado.ioloop.IOLoop.instance().start()
ab -n 10000 -c 1000 http://192.168.8.2:8889/ 并发可达到1588req/s
执行 ab -n 10000 -c 2000 http://192.168.8.2:1081/ 出错:
Traceback (most recent call last): File "/usr/local/lib/python2.6/site-packages/tornado-1.2.1-py2.6.egg/tornado/ioloop.py", line 269, in start File "/usr/local/lib/python2.6/site-packages/tornado-1.2.1-py2.6.egg/tornado/stack_context.py", line 173, in wrapped File "/usr/local/lib/python2.6/site-packages/tornado-1.2.1-py2.6.egg/tornado/httpserver.py", line 238, in _handle_events File "/usr/local/lib/python2.6/socket.py", line 195, in accept error: [Errno 24] Too many open files
在另一台8核 8G内存服务器上跑ab 性能也没有见提升,并发开到2000也出错:
Traceback (most recent call last): File "/usr/local/python/lib/python2.6/site-packages/tornado-2.1.1-py2.6.egg/tornado/ioloop.py", line 309, in start File "/usr/local/python/lib/python2.6/site-packages/tornado-2.1.1-py2.6.egg/tornado/netutil.py", line 314, in accept_handler File "/usr/local/python/lib/python2.6/socket.py", line 195, in accept error: [Errno 24] Too many open files
求指点,是否我的测试方法哪里不对,怎么看不到别的大牛写的 3000+的并发效果?
内置支持
WooParadog [email protected] 发件人当地时间: 发送时间 20:20 (GMT+08:00)。发送地当前时间:下午10:08。 ✆
翻了一下, 发现tornado自带了并行的东西...用法如下..在我的机器上(Dell i5/4G)能跑到5790.15 [#/sec] (mean) 不用的话在2726.08 [#/sec] (mean).. 嗯, 笔记本假四核...
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 '''
4 tor.py
5 Author: WooParadog
6 Email: [email protected]
7
8 Created on
9 2011-11-25
10 '''
11
12 import tornado
13 import tornado.process
14 import tornado.web
15 from tornado import httpserver
16 from tornado import ioloop
17 from tornado.web import RequestHandler
18
19 class non(RequestHandler):
20 def get(self):
21 """docstring for get"""
22 self.write("hello")
23
24 def main():
25 """docstring for main"""
26 sokets = tornado.netutil.bind_sockets(8080)
27 tornado.process.fork_processes(0)
28 application = tornado.web.Application([
29 ('',non)])
30 http_server = httpserver.HTTPServer(application)
31 http_server.add_sockets(sokets)
32 ioloop.IOLoop.instance().start()
33
34 if __name__ == '__main__':
35 main()
哇哇 大牛你这个最管用了!
ab -n 10000 -c 1000 http://192.168.0.36:1081/ ... Requests per second: 8416.98 [#/sec] (mean)
并发开到5000 都还能达到 5000req/s 看来真是自己用的不对 呵呵
飞龙分析
Felinx Lee [email protected] 发件人当地时间: 发送时间 11:33 (GMT+08:00)。发送地当前时间:下午10:10。 ✆
- 这个是系统允许的fd限制所制,可以参考下这个
- 每个进程的fd limit有限制,参考下:
- 用了fork其实是根据多核来跑多个进程,每个进程的限制还没有达到,所以没出错。但tornado的老大们是不推荐用fork的。
反馈
创建 by -- ZoomQuiet [2011-11-25 14:11:35]