sql >> Databáze >  >> RDS >> PostgreSQL

Jak vyladit aplikaci Ruby on Rails běžící na Heroku, která využívá produkční úroveň Heroku Postgres?

Zejména jsem přišel na problém.

Nejprve si zapamatujte můj kód v zobrazení:

<% @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 %>

Zde dostávám jednotlivé epizody episode_image uvnitř mé iterace. I když jsem používal includes v mém ovladači došlo k velké chybě ve schématu tabulky. Neměl jsem index pro episode_id v mých episode_images stůl! . To způsobilo extrémně dlouhou dobu dotazování. Našel jsem to pomocí zpráv databáze New Relic. Všechny ostatní doby dotazu byly 0,5 ms nebo 2–3 ms, ale episode.episode_image způsobilo téměř 6500 ms!

Nevím toho moc o vztahu mezi dobou dotazu a spouštěním aplikace, ale když jsem přidal index do svých episode_images stůl, teď jasně vidím rozdíl. Pokud máte správně schéma databáze, pravděpodobně nebudete čelit žádnému problému se škálováním přes Heroku. Ale žádný dyno vám nemůže pomoci se špatně navrženou databází.

Pro lidi, kteří by se mohli setkat se stejným problémem, bych vám rád řekl o některých svých zjištěních týkajících se vztahu mezi webovými dynos Heroku, pracovníky Unicornu a aktivními spojeními Postgresql:

Heroku vám v podstatě poskytuje dyno, což je jakýsi malý virtuální stroj s 1 jádrem a 512 MB RAM. Uvnitř tohoto malého virtuálního stroje běží váš server Unicorn. Unicorn má hlavní proces a pracovní procesy. Každý z vašich pracovníků Unicorn má své vlastní trvalé připojení k vašemu stávajícímu serveru Postgresql (nezapomeňte se podívat na toto ) V podstatě to znamená, že když máte dyno Heroku, na kterém běží 3 pracovníci Unicorn, máte alespoň 4 aktivní připojení. Pokud máte 2 webové dyno, máte alespoň 8 aktivních připojení.

Řekněme, že máte standardní Tengu Postgres s limitem 200 souběžných připojení. Pokud máte problematické dotazy se špatným designem db, ani db, ani více dynos vás nemůže zachránit bez mezipaměti... Pokud máte dlouho běžící dotazy, nemáte jinou možnost než ukládání do mezipaměti, myslím.

Vše výše uvedené jsou moje vlastní zjištění, pokud je s nimi něco v nepořádku, prosím varujte mě svými komentáři.




  1. Jak pomocí SSDT vyřeším chyby SQL71561, když mám pohled, který odkazuje na objekty v jiné databázi?

  2. Jak správně zavolat uloženou funkci fnd_concurrent.wait_for_request přes cx_Oracle module API?

  3. Jak spustit nezpracovaný SQL v SQLAlchemy

  4. Analýza I/O výkonu pro SQL Server