对于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远程数据库。