PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Puma-Cluster-Konfiguration auf Heroku

a) Brauche ich die before_fork / after_fork Konfiguration wie in Unicorn, da die Cluster Worker gegabelt sind?.

Normalerweise nein, aber da Sie preload_app verwenden , ja. Das Vorladen der App bringt eine Instanz zum Laufen und gibt dann den Speicherplatz für die Worker ab; Das Ergebnis ist, dass Ihre Initialisierer nur einmal ausgeführt werden (möglicherweise Zuweisung von DB-Verbindungen und dergleichen). In diesem Fall Ihr on_worker_boot Code passt. Wenn Sie preload_app nicht verwenden , dann bootet jeder Worker selbst, in diesem Fall wäre die Verwendung eines Initialisierers ideal, um die benutzerdefinierte Verbindung so einzurichten, wie Sie es tun. Und zwar ohne preload_app , Ihr on_worker_boot block würde einen Fehler verursachen, da ActiveRecord und seine Freunde zu diesem Zeitpunkt noch nicht einmal geladen sind.

b) Wie passe ich meine Fadenzahl in Abhängigkeit von meiner Anwendung an - was wäre der Grund, sie herunterzufahren? / In welchen Fällen würde es einen Unterschied machen? Ist 0:16 nicht bereits optimiert?

Auf Heroku (und meinen Tests) passen Sie am besten zu Ihrem min /max Threads, mit max <=DB_POOL Einstellung. Der min Threads ermöglichen Ihrer Anwendung, Ressourcen herunterzufahren, wenn sie nicht unter Last stehen, was normalerweise großartig ist, um Ressourcen auf dem Server freizugeben, aber wahrscheinlich weniger auf Heroku benötigt wird; dass dyno sich bereits der Bedienung von Webanfragen verschrieben hat, kann sie genauso gut bereit haben. Beim Einstellen Ihres max Threads <=Ihr DB_POOL Umgebungsvariable nicht erforderlich ist, laufen Sie Gefahr, alle Ihre Datenbankverbindungen im Pool zu verbrauchen, dann haben Sie einen Thread, der eine Verbindung wünscht, aber keine bekommt, und Sie können den alten "ActiveRecord::ConnectionTimeoutError - could not Stellen Sie innerhalb von 5 Sekunden eine Datenbankverbindung her." Error. Dies hängt jedoch von Ihrer Anwendung ab, Sie könnten sehr gut max haben> DB_POOL und gut sein. Ich würde sagen Ihr DB_POOL sollte mindestens gleich Ihrem min sein Threads wert, obwohl Ihre Verbindungen nicht eifrig geladen werden (5:5-Threads werden keine 5 Verbindungen öffnen, wenn Ihre App nie auf die Datenbank trifft).

c) Die Heroku-Datenbank erlaubt 500 Verbindungen. Was wäre ein guter Wert für DB_POOL in Abhängigkeit von Thread-, Worker- und Dyno-Anzahl? - Benötigt jeder Thread pro Worker pro Dyno eine einzige DB-Verbindung, wenn parallel gearbeitet wird?

Die Produktionsstufe erlaubt 500, um es klar zu sagen :)

Jeder Thread pro Worker pro Dyno könnte verbrauchen eine Verbindung, je nachdem, ob sie alle gleichzeitig versuchen, auf die Datenbank zuzugreifen. Normalerweise werden die Verbindungen wiederverwendet, sobald sie fertig sind, aber wie ich in b) erwähnt habe , wenn Ihre Threads größer sind als Ihr Pool, können Sie eine schlechte Zeit haben. Die Verbindungen werden wiederverwendet, all dies wird von ActiveRecord gehandhabt, aber manchmal nicht optimal. Manchmal gehen Verbindungen in den Leerlauf oder sterben, und deshalb wird empfohlen, den Reaper einzuschalten, um tote Verbindungen zu erkennen und zurückzugewinnen.