当trafic变得有点高(30-40个用户)时,我对sinatra瘦应用程序有一些奇怪的滞后问题。 这是一款使用长轮询的小游戏,因此与用户数量相比,http IO可能会很高。
CPU负载保持低水平,并且有大量可用内存。
以下是发生滞后时的一些典型日志行:
1 - [17/Jul/2015:16:50:17 -0400] "POST /play?next=word HTTP/1.1" 200 1 0.0018
2 - [17/Jul/2015:16:50:17 -0400] "GET /update?_=1437166100579 HTTP/1.1" 200 304 15.0046
3 - [17/Jul/2015:16:50:17 -0400] "GET /update?_=1437166102348 HTTP/1.1" 200 286 15.0045
4 - [17/Jul/2015:16:50:17 -0400] "POST /accept_replay? HTTP/1.1" 200 - 0.0021
5 - [17/Jul/2015:16:50:18 -0400] "GET /core HTTP/1.1" 200 3719 0.0015
6 - [17/Jul/2015:16:50:18 -0400] "GET /join HTTP/1.1" 302 - 0.0640
7 - [17/Jul/2015:16:50:18 -0400] "GET /core HTTP/1.1" 200 3719 0.0024
8 - [17/Jul/2015:16:50:19 -0400] "POST /play?next=word HTTP/1.1" 200 1 0.0034
9 - [17/Jul/2015:16:50:19 -0400] "GET /update?_=1437166215907 HTTP/1.1" 200 248 10.0018
10- [17/Jul/2015:16:50:19 -0400] "GET /update?_=1437166222579 HTTP/1.1" 200 252 11.0029
11- [17/Jul/2015:16:50:31 -0400] "GET /core HTTP/1.1" 200 3719 0.0034
12- [17/Jul/2015:16:50:31 -0400] "POST /sentiment/bad? HTTP/1.1" 200 - 0.0024
13- [17/Jul/2015:16:50:31 -0400] "GET / HTTP/1.1" 200 4449 0.0086
14- [17/Jul/2015:16:50:31 -0400] "POST /decline_replay HTTP/1.1" 302 - 0.0020
另外还有30个[2015年7月17日:16:50:31 -0400]
(get / update是longpolling请求,因此最多可能需要40秒) Everythings在10到11之间停止12秒。在此期间收到的所有请求似乎都是同时处理的。
我以那种方式启动应用程序
thin start -p 80
这可能是一个很薄的问题吗? 我需要自定义瘦配置文件吗? 我需要nginx吗?
欢迎任何迹象......
编辑: 我在ObectSpace中发现的错误[SystemStackError,1] [NoMemoryError,1] [IOError,1]
答案 0 :(得分:1)
这种行为闻起来很像请求排队,这意味着没有足够的Web进程可以自由处理传入的请求。所以请求等待,然后积压清除它们突然全部得到超快速处理并且一次性完成。
这家伙写了一篇关于如何使用Thin, EventMachine, and Async Sinatra to handle long-polling requests的好文章。