a) Behöver jag konfigurationen before_fork / after_fork som inUnicorn, eftersom klusterarbetarna är splittrade?
Normalt inte, men eftersom du använder preload_app
, ja. Genom att förinläsa appen får en instans igång och delar sedan upp minnesutrymmet för arbetarna; resultatet är att dina initialiserare bara körs en gång (möjligen allokerar db-anslutningar och så). I det här fallet, din on_worker_boot
koden är lämplig. Om du inte använder preload_app
, sedan startar varje arbetare sig själv, i vilket fall att använda en initialiserare skulle vara idealiskt för att ställa in den anpassade anslutningen som du gör. Faktiskt utan preload_app
, din on_worker_boot
blocket skulle felas ut eftersom ActiveRecord och vänner inte ens är inlästa.
b) Hur justerar jag mitt antal trådar beroende på min applikation - vad skulle vara anledningen till att släppa det? / I vilka fall skulle det göra skillnad? Är inte 0:16 redan optimerad?
På Heroku (och mina tester) är du bäst på att matcha din min
/max
trådar, med max
<=DB_POOL
miljö. min
trådar låter din applikation snurra ner resurser när den inte är belastad, vilket normalt är bra för att frigöra resurser på servern, men troligen mindre behövs på Heroku; att dyno redan är dedikerad till att leverera webbförfrågningar, kan lika gärna ha dem klara. När du ställer in ditt max
trådar <=din DB_POOL
miljövariabel krävs inte, du riskerar att konsumera alla dina databasanslutningar i poolen, sedan har du en tråd som vill ha en anslutning men kan inte få det, och du kan få det gamla "ActiveRecord::ConnectionTimeoutError - kunde inte skaffa en databasanslutning inom 5 sekunder." fel. Detta beror på din applikation men du kan mycket väl ha max
> DB_POOL
och må bra. Jag skulle säga din DB_POOL
bör vara minst samma som din min
trådars värde, även om dina anslutningar inte laddas ivrigt (5:5-trådar öppnar inte 5 anslutningar om din app aldrig träffar databasen).
c) Heroku-databasen tillåter 500 anslutningar. Vad skulle vara ett bra värde för DB_POOL beroende på antal trådar, arbetare och dyno? - Kräver varje tråd per arbetare per dyno en enda DB-anslutning när man arbetar parallellt?
Produktionsnivån tillåter 500, för att vara tydlig :)
Varje tråd per arbetare per dyno kunde förbrukar en anslutning, beroende på om de alla försöker komma åt databasen samtidigt. Vanligtvis återanvänds anslutningarna när de är klara, men som jag nämnde i b)
, om dina trådar är större än din pool kan du ha dålig tid. Anslutningarna kommer att återanvändas, allt detta hanteras av ActiveRecord, men ibland inte idealiskt. Ibland försvinner anslutningar eller dör, och det är därför det rekommenderas att slå på Reaper för att upptäcka och återvinna döda anslutningar.