2010-01-25 77 views
11

询问this question,之后,我开始使用Sinatra作为服务网页的一种方式。为什么我的sinatra网站如此缓慢?

今天晚上,我和我的一个朋友开始测试服务器的速度。

文件登录的样子:

require 'rubygems' 
require 'sinatra' 
require 'haml' 

enable :sessions #for cookies! 

get '/' do 
    haml :index 
end 

而且index.haml样子:

%title 
    First Page 

%header 
    %h2 First Page 

他坐在最近的笔记本电脑,因为我是,与苹果公司的802.11n我们两个之间的路由器。我们都在运行Windows 7.我也在运行Ubuntu 9.10 x64的笔记本电脑上使用Sinatra和apt-get安装的所有相关文件尝试了这些相同的文件。

无论服务器操作系统,Windows还是Linux,Sinatra都需要7秒钟提供单页请求。我看到here作者设法处理了超过400个请求/秒。是什么赋予了? (或者应该在超级用户之类?)

+0

它可能是您的配置使用的服务器。例如,WEBrick,Thin和Mongrel之间存在主要差异。你如何激发你的sinatra应用程序? – daddz 2010-01-25 16:19:33

+0

从命令行;基本上,我们运行'ruby TestServer.rb',然后连接到4567端口。我总共有n00b,所以如果有这种东西的指导,lemme知道。 – mmr 2010-01-25 16:20:58

回答

9

我对于何时优化您的Web应用程序,我们会留下任何意见。

在您的Sinatra应用程序中为开发和生产设置不同的配置,因为其中的一些建议,您并不总是想要使用。事实上,你应该继续前进,设置和环境类似于你将在生产中部署的方式。您不会通过简单运行ruby app.rb进行部署。你可能想把apache或者nginx放在你的Mongrel前面。 Mongrel将提供你的静态文件,但这对于开发模式来说只是明智的。在部署中,Web服务器将为此做更多的工作。简而言之,您部署的环境将比独立的开发环境更快。

在这一点上,我不会担心Mongrel vs. Thin。如果Thin速度快两倍 - 那不是 - 那你的7秒就变成3.5。这足够好吗?

有些事情尝试...

我知道,我只是告诉你建立一个部署环境,但也许它不是在服务器端。您是否尝试过在您的网页上运行YSlowPageSpeed? I/O将占用7秒多的时间(免责声明:我假设你的网络设置没有问题)比服务器。 YSlow - Firebug实际上会告诉你页面的每个部分需要多长时间才能到达浏览器。

YSlow告诉我要做的一件事是在我的静态资产上放置一个很远的Expires标题,这是我知道的,但我仍然在优化,直到最后。那时我意识到至少有3 different places that I could specify that header。我相信自己在nginx中做到这一点是合适的地方。

如果您对这些结果感到满意,那么您可以查看服务器。关闭我的头顶,所以并不详尽

  1. 打开gzip响应。
  2. 结合您的样式表,所以每页只有一个请求。如果你不这样做,可能会有一些Rack Middleware。
  3. 缓存。我正在尝试Rack::Cache
  4. 使用精灵来减少您使用的图像下载数量。
  5. 缩小你的Javascript。再次,也许通过机架中间件。

机架中间件整洁,但它使用CPU。因此,手动缩小您的Javascript为您的工作流程添加了新的步骤,但在服务器上,它比中间件更快。这是一个折衷。

对不起,如果这是rambly。

+0

感谢您的彻底回应!你在失去头的时候失去了我,在那之后,我了解了我无知的深度。我想,我有很多事情要做。 – mmr 2010-02-04 16:07:31

+0

这是我从Yahoo! YSlow网站。 http://developer.yahoo.com/performance/rules.html。这仅仅意味着将Expires头部设置为将来的某个点。比如20年,说。 – dbrown0708 2010-02-04 17:46:21

+2

我选择这个作为答案纯粹是因为它导致在我过了Hello World之后学习了很多关于优化的知识。在这种情况下,修复是在webrick中进行调试。 – mmr 2010-04-26 02:29:13

4

尝试使用Thin作为服务器。我注意到与WEBrick和Mongrel相比,性能有所提高。

gem install thin 

当您运行使用ruby TestServer.rb您的应用程序,你会看到以下内容:

西纳特拉/ 0.10.1已经在舞台上4567可用于进行备份的发展从

+0

我从宝石中得到的sinatra版本是0.9.4;我是否应该获得其他更新的版本? – mmr 2010-01-26 14:14:40

+0

我从github获得版本0.10.1。 gem install sinatra-sinatra --source = http://gems.github.com – Trevor 2010-01-26 14:44:21

+0

就像一个侧面说明,如果没有nmake(例如,没有Windows 64位版本,显然),thin不起作用。 Mongrel应该工作得很好。 – mmr 2010-02-09 00:44:18

5

我用霰弹枪运行Sinatra时遇到了这个问题,但直接运行我的应用程序时(即ruby -rubygems app.rb)没有这个问题。这是因为霰弹枪为每个请求分叉并重新加载应用程序。

我发现一个thread in Sinatra's mailing list讨论了这个问题,那里的人建议使用rerun而不是霰弹枪。我很高兴地说它为我解决了这个问题。

+0

谢谢!刚刚安装的重新运行和应用程序再次正常加载。我认为霰弹枪会让速度变慢,但并不是说它实际上会为每个请求重新加载应用程序(包括所有资产,即使仅在开发模式下进行测试也会导致性能下降)。 – 2013-03-23 07:23:34

1

我正在使用Vagrant运行VMWare Fusion内部的Sinatra。我的应用程序运行缓慢(约10秒钟来处理请求)。然后我发现这个宝石:

Webrick is very slow to respond. How to speed it up?

似乎是使用WEBrick(默认),用于反向DNS查找每个请求,那就是减缓下来。

相关问题