对于Ruby on Rails,当使用Webrick时,它是否支持并发请求和Keep-Alive,以及为什么加载.js和.png文件这么慢?

我正在运行Rails 3.0.5,并且在控制台上报告了一个页面需要60ms,但如果我检查Firefox Net加载时间图表,则需要2.9秒。 如果我在Bash上运行ab命令,它说需要300ms。

因此,如果移除了javascripts(其中6个),那么它需要1.9秒……但我想知道为什么这么慢? 是不是还活着?

同样奇怪的是Firefox显示4个文件同时下载 – 我认为Webrick一次只支持1个连接?

(改为使用杂种或“瘦”会使事情变得不同或更好吗?)

也奇怪的是,如果我

 ab -n 10 -c 5 http://www.somesite.com:8080 

它需要3秒,并且为了测试如何支持keep-alive ,我使用了-k选项:

 ab -n 10 -c 5 -k http://www.somesite.com:8080 

但现在总时间从3秒变为4.5秒。 是不是keep-alive应该让它更快,并且由Webrick支持keep-alive

另外,如果它支持并发连接,那么如果某些代码使用类变量来处理事物,那么不会有竞争条件发生吗? (因为类变量内容跨越请求)

这并不完全回答你的问题,但我会给你一些建议,可能会使你的问题无关紧要。

Webrick不应该用于生产。 它是用纯ruby编写的,一次只能处理一个请求。 它不能用于开发模式之外的任何东西。

对于生产,你想在反向代理(如nginx)后面使用多个thin实例,或者你可以使用为你做这个的乘客(这是大多数人在现代使用的)。


部分回答你的问题:

ab运行速度比firefox快的原因是因为请求css和javascript文件是浏览器的function。 ab仅对服务器的响应时间进行基准测试,不包括发送任何图像,css或js。

rails基准测试只有60ms的原因是因为它只测量它在rails堆栈中的时间。 它不计算将请求发送回用户所需的时间。

因为webrick不是为生产而制作的,所以如果不支持keep-alive,我也不会感到惊讶。

如果您希望在本地的两个环境中运行相同的应用程序,只需在databases.yml中创建另一个条目,如下所示:

dev2:adapter:mysql2数据库:db username:name密码:wpord! host:mysql.myexample.com pool:5 timeout:5000

然后运行rails server -e dev2 --port 3001

这对我行得通。 也就是说,在本地运行的同一个应用程序连接到本地AND远程数据库。