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.