簡體   English   中英

如何調整在使用生產級別Heroku Postgres的Heroku上運行的Ruby on Rails應用程序?

[英]How to tune a Ruby on Rails application running on Heroku which uses production level Heroku Postgres?

我工作的公司決定將其整個堆棧移至Heroku。 其主要動機是易於使用:無需sysAdmin,無需哭泣。 但我對此仍有疑問...

我正在對應用程序平台和Postgres服務進行一些負載和壓力測試。 我正在使用blitz作為Heroku的插件。 我攻擊該網站的用戶數量在1到250之間。我得到了一些非常有趣的結果,我需要幫助評估它們。

測試堆棧:

應用規格

它沒有什么特別的。

  • Rails 4.0.4
  • 獨角獸
  • 設置database.yml以連接到Heroku postgres。
  • 不使用緩存。

數據庫

正確連接到應用程序的是標准Tengu (Heroku的命名約定有一天會殺死我:)。

Heroku配置

如“ 使用Unicorn部署Rails應用程序 ”一文中所述,我將所有內容都應用到了unicorn.rb 我有2個常規網絡測功機。

WEB_CONCURRENCY  : 2
DB_POOL          : 5

數據

  • episodes數達100.000〜
  • episode_urls表計數episode_urls
  • episode_images表計數為episode_images

episodes_controller.rb

  def index
    @episodes = Episode.joins(:program).where(programs: {channel_id: 1}).limit(100).includes(:episode_image, :episode_urls)
  end

episodes/index.html.erb

<% @episodes.each do |t| %>
<% if !t.episode_image.blank? %>
<li><%= image_tag(t.episode_image.image(:thumb)) %></li>
<% end %>
<li><%= t.episode_urls.first.mas_path if !t.episode_urls.first.blank?%></li>
<li><%= t.title %></li>
<% end %>

方案1:

Web dynos   : 2
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 10
End users   : 10

結果:

HITS 100.00% (484)
ERRORS 0.00% (0)
TIMEOUTS 0.00% (0)

這次搶注在30.00秒內產生了218次成功命中,我們將6.04 MB的數據傳入和傳出您的應用程序。 平均命中率為7.27 /秒,相當於每天約627,840次命中。

方案2:

Web dynos   : 2
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 20
End users   : 20

結果:

HITS 100.00% (484)
ERRORS 0.00% (0)
TIMEOUTS 0.00% (0)

這次搶注在30.00秒內成功產生了365次成功匹配,我們將10.12 MB的數據傳入和傳出您的應用程序。 平均點擊率為12.17 /秒,相當於每天點擊約1,051,200。 平均響應時間為622 ms。

方案3:

Web dynos   : 2
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 50
End users   : 50

結果:

HITS 100.00% (484)
ERRORS 0.00% (0)
TIMEOUTS 0.00% (0)

這次搶購在30.00秒內成功產生了371次成功匹配,我們將10.29 MB的數據傳入和傳出您的應用程序。 平均命中率為12.37 /秒,相當於每天約1,068,480次命中。 平均響應時間為2,631毫秒。

方案4:

Web dynos   : 4
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 50
End users   : 50

結果:

HITS 100.00% (484)
ERRORS 0.00% (0)
TIMEOUTS 0.00% (0)

這次搶購在30.00秒內成功產生了484次成功匹配,我們將13.43 MB的數據傳入和傳出您的應用程序。 平均點擊率為16.13 /秒,相當於每天約1,393,920次點擊。 平均響應時間為1856毫秒。

方案5:

Web dynos   : 4
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 150
End users   : 150

結果:

HITS 71.22% (386)
ERRORS 0.00% (0)
TIMEOUTS 28.78% (156)

高峰期在30.00秒內成功產生386次命中,並且我們將10.76 MB的數據傳入和傳出您的應用程序。 平均命中率為12.87 /秒,相當於每天約1,111,680次命中。 平均響應時間為5446毫秒。

方案6:

Web dynos   : 10
Duration    : 30 seconds
Timeout     : 8000 ms
Start users : 150
End users   : 150

結果:

HITS 73.79% (428)
ERRORS 0.17% (1)
TIMEOUTS 26.03% (151)

這次搶注在30.00秒內產生了428次成功命中,我們將11.92 MB的數據傳入和傳出您的應用程序。 14.27 /秒的平均命中率相當於每天約1,232,640命中。 平均響應時間為4793毫秒。 但是,您遇到了更大的問題:在這種高峰期間,有26.21%的用戶遇到超時或錯誤!

概述:

  • 即使150個用戶向應用程序發送請求,“命中率”也不會超過15。
  • Web dynos數量的增加無助於處理請求。

問題:

  1. 當我使用緩存和memcached(來自Heroku的Memcachier插件)時,甚至2個Web dynos每秒都可以處理> 180次點擊。 我只是想了解dynos和postgres服務可以在沒有緩存的情況下做什么。 這樣,我試圖了解如何調整它們。 怎么做?

  2. 據說標准天狗有200個並發連接。 那么為什么它從來沒有達到這個數字呢?

  3. 如果擁有prdbction級別的數據庫並增加Web dynos不能幫助擴展我的應用程序,那么使用Heroku有什么意義?

  4. 可能是最重要的問題:我做錯了什么? :)

感謝您閱讀這個瘋狂的問題!

我特別想出了這個問題。

首先,在視圖中記住我的代碼:

<% @episodes.each do |t| %>
<% if !t.episode_image.blank? %>
<li><%= image_tag(t.episode_image.image(:thumb)) %></li>
<% end %>
<li><%= t.episode_urls.first.mas_path if !t.episode_urls.first.blank?%></li>
<li><%= t.title %></li>
<% end %>

在這里,我得到了迭代中的每個情節episode_image集中的episode_image 即使我一直在控制器中使用includes ,我的表架構還是有一個大錯誤。 我的episode_images表中沒有episode_id索引! 這導致了極高的查詢時間。 我已經使用New Relic的數據庫報告找到了它。 所有其他查詢時間均為0.5毫秒或2-3毫秒,但episode.episode_image導致將近6500毫秒!

我對查詢時間和應用程序執行之間的關系了解不多,但是當我將索引添加到episode_images表中時,現在我可以清楚地看到兩者之間的區別了。 如果您的數據庫架構正確,那么通過Heroku進行擴展可能不會遇到任何問題。 但是,任何dyno都無法幫助您設計不良的數據庫。

對於可能遇到相同問題的人,我想告訴您一些有關Heroku網絡測功機,Unicorn工人與Postgresql活動連接之間關系的發現:

基本上,Heroku為您提供了dyno,它是一種具有1個核心和512MB ram的小型虛擬機。 在該小型虛擬機中,您的Unicorn服務器將運行。 獨角獸有一個主流程和工人流程。 您的每一個獨角獸工人有現有的PostgreSQL服務器自己的永久連接(不要忘記檢查 )基本上,它意味着,當你有一個Heroku的DYNO了在其上運行3組麒麟的工人,至少有4個活動連接。 如果您有2個Web dynos,則至少有8個活動連接。

假設您有一個具有200個並發連接限制的標准Tengu Postgres。 如果您的數據庫設計不佳而遇到問題查詢,那么數據庫或更多的dynos都無法在沒有緩存的情況下保存您的信息...如果您長時間運行的查詢除了緩存之外別無選擇。

以上是我自己的發現,如果有任何問題,請通過您的評論警告我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM