Ik heb het probleem vooral ontdekt.
Onthoud eerst mijn code in de weergave:
<% @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 %>
Hier krijg ik elke aflevering episode_image
binnen mijn iteratie. Ook al gebruik ik includes
in mijn controller was er een grote fout in mijn tabelschema. Ik had geen index voor episode_id
in mijn episode_images
tafel! . Dit zorgde voor een extreem hoge zoektijd. Ik heb het gevonden met behulp van de databaserapporten van New Relic. Alle andere zoektijden waren 0,5 ms of 2-3 ms, maar episode.episode_image
veroorzaakte bijna 6500 ms!
Ik weet niet veel over de relatie tussen querytijd en toepassingsuitvoering, maar toen ik index aan mijn episode_images
toevoegde tafel, nu kan ik duidelijk het verschil zien. Als u uw databaseschema correct heeft, zult u waarschijnlijk geen problemen ondervinden met schalen via Heroku. Maar geen enkele dyno kan je helpen met een slecht ontworpen database.
Voor mensen die mogelijk tegen hetzelfde probleem aanlopen, wil ik u vertellen over enkele van mijn bevindingen over de relatie tussen Heroku-webdyno's, Unicorn-werkers en actieve verbindingen van Postgresql:
Kortom, Heroku biedt je een dyno, een soort kleine virtuele machine met 1 kern en 512 MB RAM. In die kleine virtuele machine draait je Unicorn-server. Unicorn heeft een masterproces en werkprocessen. Elk van je Unicorn-werkers heeft zijn eigen permanente verbinding met je bestaande Postgresql-server (vergeet niet om dit ) Het betekent in feite dat wanneer je een Heroku-dyno hebt met 3 Unicorn-werkers erop, je ten minste 4 actieve verbindingen hebt. Als je 2 webdyno's hebt, heb je minstens 8 actieve verbindingen.
Stel dat u een standaard Tengu Postgres hebt met een limiet van 200 gelijktijdige verbindingen. Als je problematische vragen hebt met een slecht db-ontwerp, kunnen db en meer dyno's je niet redden zonder cache... Als je langlopende vragen hebt, heb je geen andere keuze dan caching, denk ik.
Al het bovenstaande zijn mijn eigen bevindingen, als er iets mis mee is, waarschuw me dan alsjeblieft door je opmerkingen.