Rails 4 Datenbankverbindungspoolfehler

8

Ich habe eine Rails-App, die mit NGINX und Puma gehostet wird. Alle 10 Stunden oder so wird die App unbrauchbar. Wenn ein Benutzer versucht, eine Verbindung herzustellen, wird folgende Fehlermeldung angezeigt:

%Vor%

Dies wird fortgesetzt, bis die App neu gestartet wird.

Ich habe gelesen, dass dies darauf zurückzuführen ist, dass der Datenbankverbindungspool voll ist und dass in der App "rails" Threads erstellt werden müssen, die ihre Verbindung zur Datenbank nach Abschluss nicht schließen.  Nach meinem Wissen gibt es nur einen Platz im App-Code, in dem Threads verwendet werden: Ein Block verwendet das Ruby Timeout-Modul, aber dieser greift nicht auf die Datenbank zu.

Dieser Anleitung folgen Ссылка (Ich benutze Heroku nicht wirklich) Ich habe die Größe des Datenbankverbindungspools auf 5 gesetzt, mit der folgenden Konfigurationsdatei:

%Vor%

Ende

Die Website wird mit Rails 4.0.0 gehostet. Ich habe gelesen, dass dies in der Tat ein Rails 4.0.0 Problem sein könnte, und dass dies in späteren Versionen behoben wurde, bin mir aber nicht sicher. ConnectionTimeoutError auf Heroku mit Postgres

  1. Gibt es eine Möglichkeit, die Anzahl der aktiven Datenbankverbindungen im Verbindungspool zu überwachen? Dies würde das Debugging viel einfacher machen.
  2. Wird das Timeout-Modul innerhalb des Rails App-Codes wahrscheinlich auf die Ursache dieses Problems angewendet?
  3. Ist das wahrscheinlich ein Problem mit Rails 4.0.0 und nicht ein Problem mit meiner App?

Die App rails läuft in der Produktionsumgebung. Ich kann bei Bedarf mehr Informationen über meine Puma, NGINX-Konfiguration geben.

    
user3868925 23.07.2014, 13:30
quelle

2 Antworten

2

Die Tatsache, dass die fehlersichere Antwort versucht, eine Datenbankverbindung zuzuweisen, kann eine rauchende Waffe sein. Es könnte Ihnen helfen, zu beschreiben, was in der fehlersicheren Antwort passiert. Die fehlersichere Antwort wurde vermutlich ausgelöst, wenn die ursprüngliche Anforderung eine Ausnahme ausgelöst hat. Die Rails-show_exception-Routine, die die Failsafe-Antwort aufruft, wird aufgerufen, nachdem der ConnectionManager clear_active_connections aufgerufen hat! für die aktuelle Anforderung (die mit einer Ausnahme fehlgeschlagen ist), was bedeutet, dass Rails Datenbankverbindungen nicht automatisch freigeben, nachdem die fehlersichere Antwort fehlschlägt. Dies bedeutet, dass der fehlersichere Antworthandler für das Bereinigen seiner eigenen Datenbankverbindungen zuständig ist. Ich bin mir nicht sicher, ob es gut ist, wenn der fehlersichere Antworthandler versucht, eine Verbindung zur Datenbank herzustellen, aber wenn dies das gewünschte Verhalten ist, müssen Sie möglicherweise clear_active_connections aufrufen! explizit am Ende Ihres Failsafe-Handlers (in einem Sicherheitsblock).

Ich habe ein ähnliches Problem in meiner eigenen App untersucht und festgestellt, dass dies ein nützlicher Leitfaden für die Funktionsweise von Verbindungen ist: Ссылка . Während der Code, auf den hier verwiesen wird, einige Optimierungen erfordert, gibt es eine gute Übersicht darüber, wie man beim Erstellen einer impliziten Datenbankverbindung vorgeht.

    
ashanbrown 22.11.2014 01:04
quelle
0

Ich glaube nicht, dass es ein Problem von rails 4.0.0 ist.

Wie in der Ruby-Timeout-Modul-Dokumentation erwähnt, wird also ein neues Thema. Ich denke, dass es eine Chance gibt, dass es lang laufenden Thread spawnen kann, der db-Verbindung ein Leben hält. Um laufende Threads zu überprüfen, können Sie Thread.list method verwenden. Denken Sie auch daran, dass Ihre Poolgröße & gt; = sein muss, da Puma-Threads Puma-Worker multiplizieren.

    
mixan946 02.11.2014 20:00
quelle