2010-01-25 75 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查找每個請求,那就是減緩下來。

相關問題