V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
bluesky139
V2EX  ›  Tornado

Tornado 并发数很低,正常么?

  •  
  •   bluesky139 · 2016-01-14 17:47:48 +08:00 · 15352 次点击
    这是一个创建于 2996 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 localhost 下测试,像 demo 一样, get 或 post 里面没有任何多余的耗时代码,直接返回。
    得到的结果是每秒 200 多的并发数,这正常么?

    目前系统是 win7 , CPU 是 E3 1231 ,
    从任务管理器来看,似乎是单线程跑满了(因为进程的 CPU 占用率为 13 )。
    各位用 tornado 的朋友也是同样的结果么? 还是说哪里有坑?
    19 条回复    2016-01-15 17:06:30 +08:00
    scys
        1
    scys  
       2016-01-14 17:51:46 +08:00
    测试 tornado ,不要在 windows 下,完全没有优化,只是个模型
    bobuick
        2
    bobuick  
       2016-01-14 17:51:57 +08:00
    什么压力工具, 什么参数,在本机么,要发全一点
    aisk
        3
    aisk  
       2016-01-14 17:53:23 +08:00
    Windows 下好像只支持 select ,肯定不会快了。
    phithon
        4
    phithon  
       2016-01-14 17:54:05 +08:00
    楼上说的对, windows 下只是 select ,最慢的异步模型。
    bluesky139
        5
    bluesky139  
    OP
       2016-01-14 18:09:33 +08:00
    @scys
    @aisk
    @phithon
    @bobuick
    刚在 mac 下试了下,也一样。压力工具是 JMeter.

    并发数是我自己统计的,代码如下:
    access = 0
    def PrintDown():
    global access
    print 'access', access
    access = 0
    Timer(1, PrintDown, ()).start()
    Timer(1, PrintDown, ()).start()

    class MainHandler(tornado.web.RequestHandler):
    def post(self):
    global access
    access = access + 1
    self.write('')

    结果如下:
    access 161
    access 142
    access 169
    access 139
    access 168
    access 136
    scys
        6
    scys  
       2016-01-14 18:31:32 +08:00
    为啥不跑在 linux/bsd 下?
    lecher
        7
    lecher  
       2016-01-14 19:21:33 +08:00 via Android
    这份代码是阻塞的。请自行加上异步处理的装饰器。
    phithon
        8
    phithon  
       2016-01-14 19:29:42 +08:00
    楼上正解。楼主你在异步框架里写阻塞的内容,当然慢了~
    wy315700
        9
    wy315700  
       2016-01-14 20:01:11 +08:00
    并发和 QPS 不是一个概念
    sujin190
        10
    sujin190  
       2016-01-14 22:47:30 +08:00
    cpu 跑满了么?这简单的,四核四进程的话 qps 可以到两万不成问题,单进程七八千 qps 也无压力
    neoblackcap
        11
    neoblackcap  
       2016-01-15 01:18:11 +08:00
    @bluesky139 OS X 下的 IO 复用也是烂,OS X 下面的可不是 kqueue ,肯定也是不行的。像 Tornado 这样的异步框架,都是基于 epoll/kqueue 的,没有这些系统调用,快不起来。

    还有就是不能用标准库里面的 time 这些库,这些库调用的时候都会堵塞 IOloop ,肯定快不了。
    mengskysama
        12
    mengskysama  
       2016-01-15 01:41:46 +08:00 via Android
    yield gen.sleep(0.5)
    dai269619118
        13
    dai269619118  
       2016-01-15 09:18:49 +08:00
    tornado 是单进程的
    可以多开几个
    用 nginx 做反向代理
    sujin190
        14
    sujin190  
       2016-01-15 09:43:41 +08:00
    @neoblackcap OS X 用的就是 kqueue ,有什么不同么?
    bluesky139
        15
    bluesky139  
    OP
       2016-01-15 10:47:33 +08:00
    @scys
    @neoblackcap
    我现在移到了 linux 下( CPU i5-4278U ,这个尾巴带 U 的 CPU 会不会太垃圾了?),结果:
    access 1278
    access 1335
    access 1229

    @lecher
    @phithon
    这两位是指 Timer 里面会锁 access 么?
    我现在改成了这样:
    class MainHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(20000)
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
    ret = yield self.get_async('')
    self.write('end.' + str(ret))
    self.finish()

    @run_on_executor
    def get_async(self, p):
    global access
    access = access + 1
    return 5
    结果:
    access 339
    access 263
    access 310
    话说这个怎么弄比较好?

    @dai269619118
    暂时先不考虑多实例的问题,先把单个提起来再说。
    alex8224
        16
    alex8224  
       2016-01-15 10:54:13 +08:00
    @bluesky139 上支持 windows IOCP 的 IOLoop
    chuangbo
        17
    chuangbo  
       2016-01-15 14:24:02 +08:00
    异步框架是要 IO 压力高的时候优势才大。
    neoblackcap
        18
    neoblackcap  
       2016-01-15 17:03:44 +08:00
    @sujin190 根据网上的反应来看, OS X 的 kqueue 应该是跟 FreeBSD 的不太一样,记得当初看到的说法是 OS X 网络性能烂,但到底是不是因为 IO 复用部分的系统调用烂呢,这个我就不清楚了。

    不过根据大家针对高级 IO 接口的比较来看, OS X 就没被比较过,看过的评测都是 BSD/kqueue, Linux/epoll, Windows/IOCP 。因此根据我的推断,应该是 OS X 的 kqueue 实现是残废的或者是它其他网络部分实现是残废的。

    此处引用自 Tornado 的官方文档 http://www.tornadoweb.org/en/stable/index.html

    Platforms: Tornado should run on any Unix-like platform, although for the best performance and scalability only Linux (with epoll) and BSD (with kqueue) are recommended for production deployment (even though Mac OS X is derived from BSD and supports kqueue, its networking performance is generally poor so it is recommended only for development use). Tornado will also run on Windows, although this configuration is not officially supported and is recommended only for development use.
    neoblackcap
        19
    neoblackcap  
       2016-01-15 17:06:30 +08:00
    @bluesky139 要测试的话,请去看官方的测试例子,记得 Tornado 就提供一个类似 Time 的非堵塞库。专门给大家测试用的。多读文档,你会发现很多问题文档里面就有写了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   964 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:23 · PVG 04:23 · LAX 13:23 · JFK 16:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.