Tornado 并发数很低,正常么?

2016-01-14 17:47:48 +08:00
 bluesky139
在 localhost 下测试,像 demo 一样, get 或 post 里面没有任何多余的耗时代码,直接返回。
得到的结果是每秒 200 多的并发数,这正常么?

目前系统是 win7 , CPU 是 E3 1231 ,
从任务管理器来看,似乎是单线程跑满了(因为进程的 CPU 占用率为 13 )。
各位用 tornado 的朋友也是同样的结果么? 还是说哪里有坑?
15417 次点击
所在节点    Tornado
19 条回复
scys
2016-01-14 17:51:46 +08:00
测试 tornado ,不要在 windows 下,完全没有优化,只是个模型
bobuick
2016-01-14 17:51:57 +08:00
什么压力工具, 什么参数,在本机么,要发全一点
aisk
2016-01-14 17:53:23 +08:00
Windows 下好像只支持 select ,肯定不会快了。
phithon
2016-01-14 17:54:05 +08:00
楼上说的对, windows 下只是 select ,最慢的异步模型。
bluesky139
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
2016-01-14 18:31:32 +08:00
为啥不跑在 linux/bsd 下?
lecher
2016-01-14 19:21:33 +08:00
这份代码是阻塞的。请自行加上异步处理的装饰器。
phithon
2016-01-14 19:29:42 +08:00
楼上正解。楼主你在异步框架里写阻塞的内容,当然慢了~
wy315700
2016-01-14 20:01:11 +08:00
并发和 QPS 不是一个概念
sujin190
2016-01-14 22:47:30 +08:00
cpu 跑满了么?这简单的,四核四进程的话 qps 可以到两万不成问题,单进程七八千 qps 也无压力
neoblackcap
2016-01-15 01:18:11 +08:00
@bluesky139 OS X 下的 IO 复用也是烂,OS X 下面的可不是 kqueue ,肯定也是不行的。像 Tornado 这样的异步框架,都是基于 epoll/kqueue 的,没有这些系统调用,快不起来。

还有就是不能用标准库里面的 time 这些库,这些库调用的时候都会堵塞 IOloop ,肯定快不了。
mengskysama
2016-01-15 01:41:46 +08:00
yield gen.sleep(0.5)
dai269619118
2016-01-15 09:18:49 +08:00
tornado 是单进程的
可以多开几个
用 nginx 做反向代理
sujin190
2016-01-15 09:43:41 +08:00
@neoblackcap OS X 用的就是 kqueue ,有什么不同么?
bluesky139
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
2016-01-15 10:54:13 +08:00
@bluesky139 上支持 windows IOCP 的 IOLoop
chuangbo
2016-01-15 14:24:02 +08:00
异步框架是要 IO 压力高的时候优势才大。
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
2016-01-15 17:06:30 +08:00
@bluesky139 要测试的话,请去看官方的测试例子,记得 Tornado 就提供一个类似 Time 的非堵塞库。专门给大家测试用的。多读文档,你会发现很多问题文档里面就有写了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/250767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX