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。 ✆


反馈

创建 by -- ZoomQuiet [2011-11-25 14:11:35]

MiscItems/2011-11-25 (last edited 2011-11-25 14:55:55 by ZoomQuiet)