a) Potřebuji konfiguraci before_fork / after_fork jako v Unicornu, protože pracovníci Clusteru jsou rozvětvení?.
Obvykle ne, ale protože používáte preload_app
, Ano. Předběžné načtení aplikace spustí a spustí instanci a poté rozdělí paměťový prostor pro pracovníky; výsledkem je, že se vaše inicializátory spustí pouze jednou (možná alokace připojení db a podobně). V tomto případě váš on_worker_boot
kód je vhodný. Pokud nepoužíváte preload_app
, pak se každý pracovník sám nabootuje, v takovém případě by bylo ideální použít inicializátor pro nastavení vlastního připojení, jako to děláte vy. Ve skutečnosti bez preload_app
, váš on_worker_boot
blok by došlo k chybě, protože v tomto okamžiku ActiveRecord a přátelé nejsou ani načteni.
b) Jak vyladím počet vláken v závislosti na mé aplikaci – jaký by byl důvod, proč to shodit? / V jakých případech by to znamenalo rozdíl? Není 0:16 již optimalizováno?
Na Heroku (a mém testování) nejlépe odpovídáte min
/max
vlákna s max
<=DB_POOL
nastavení. min
vlákna umožňují vaší aplikaci uvolňovat prostředky, když není zatížena, což je obvykle skvělé pro uvolnění prostředků na serveru, ale pravděpodobně méně potřebné na Heroku; že dyno se již věnuje poskytování webových požadavků, může je také mít připravené. Při nastavování max
vlákna <=váš DB_POOL
Proměnná prostředí není vyžadována, riskujete, že spotřebujete všechna svá databázová připojení ve fondu, pak máte vlákno, které chce připojení, ale nemůže ho získat, a můžete získat starý "ActiveRecord::ConnectionTimeoutError - nemohl získat připojení k databázi do 5 sekund." chyba. To však závisí na vaší aplikaci, velmi dobře můžete mít max
> DB_POOL
a buď v pohodě. Řekl bych, že váš DB_POOL
by měla být alespoň stejná jako vaše min
hodnotu vláken, i když vaše připojení nejsou dychtivě načítána (vlákna 5:5 neotevře 5 spojení, pokud vaše aplikace nikdy nenarazí do databáze).
c) Databáze Heroku umožňuje 500 spojení. Jaká by byla dobrá hodnota pro DB_POOL v závislosti na počtu vláken, pracovníků a dyno? - Vyžaduje každé vlákno na pracovníka a dyno při paralelní práci jediné DB připojení?
Produkční vrstva umožňuje 500, aby bylo jasno :)
Každé vlákno na pracovníka a dyno mohlo využívat připojení v závislosti na tom, zda se všichni pokoušejí o přístup k databázi ve stejnou dobu. Obvykle jsou připojení znovu použita, jakmile jsou hotová, ale jak jsem zmínil v b)
, pokud jsou vaše vlákna větší než váš bazén, můžete mít špatný čas. Spojení budou znovu použita, to vše zvládá ActiveRecord, ale někdy ne ideálně. Někdy spojení přestanou fungovat nebo zemřou, a proto se doporučuje zapnout Reaper, aby bylo možné detekovat a obnovit mrtvá spojení.