sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan tuner man en Ruby on Rails-applikation, der kører på Heroku, som bruger produktionsniveau Heroku Postgres?

Jeg fandt især ud af problemet.

Husk først min kode i visningen:

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

Her får jeg hver episode episode_image inde i min iteration. Selvom jeg har brugt includes i min controller var der en stor fejl ved mit bordskema. Jeg havde ikke indeks for episode_id i mine episode_images bord! . Dette forårsagede en ekstrem høj forespørgselstid. Jeg har fundet det ved hjælp af New Relics databaserapporter. Alle andre forespørgselstider var 0,5 ms eller 2-3 ms, men episode.episode_image forårsagede næsten 6500ms!

Jeg ved ikke meget om forholdet mellem forespørgselstid og applikationsudførelse, men da jeg tilføjede indeks til mine episode_images tabel, nu kan jeg tydeligt se forskellen. Hvis du har dit databaseskema korrekt, vil du sandsynligvis ikke stå over for noget problem med skalering via Heroku. Men enhver dyno kan ikke hjælpe dig med en dårligt designet database.

For folk, der kan løbe ind i det samme problem, vil jeg gerne fortælle jer om nogle af mine resultater af forholdet mellem Heroku webdynos, Unicorn-arbejdere og Postgresql aktive forbindelser:

Grundlæggende giver Heroku dig en dyno, som er en slags lille virtuel maskine med 1 kerne og 512 MB ram. Inde i den lille virtuelle maskine kører din Unicorn-server. Unicorn har en mesterproces og arbejdsprocesser. Hver af dine Unicorn-arbejdere har deres egen permanente forbindelse til din eksisterende Postgresql-server (Glem ikke at tjekke dette ) Det betyder dybest set, at når du har en Heroku dyno oppe med 3 Unicorn-arbejdere kørende på den, har du mindst 4 aktive forbindelser. Hvis du har 2 webdynoer, har du mindst 8 aktive forbindelser.

Lad os sige, at du har en Standard Tengu Postgres med en grænse på 200 samtidige forbindelser. Hvis du har problematiske forespørgsler med dårligt db-design, kan hverken db eller flere dynos redde dig uden cache... Hvis du har langvarige forespørgsler, har du ikke andet valg end at cache, tror jeg.

Alt ovenfor er mine egne resultater, hvis der er noget galt med dem, så advar mig venligst ved dine kommentarer.




  1. How Now() virker i PostgreSQL

  2. SequelizeConnectionRefusedError:tilslut ECONNREFUSED 127.0.0.1:3306

  3. MySQL rækkefølge efter primær nøgle

  4. Brug af en sagserklæring med IS NULL og IS NOT NULL