Frage Ich arbeite für Heroku Unterstützung und Middleware/Rack/ActiveRecord::QueryCache#call
ist ein häufig als Problem von New Relic berichtet. Leider ist es in der Regel ein Ablenkungsmanöver, da die Quelle des Problems woanders liegt.
QueryCache
ist, wo Rails zuerst versucht, eine Verbindung für die Verwendung auschecken, so dass alle Probleme mit einer Verbindung hier als eine Anforderung angezeigt wird "warten" warten. Dies bedeutet nicht, dass der Datenbankserver nicht notwendigerweise über Verbindungen verfügt (wenn Sie Librarotabellen für Postgres haben, zeigen sie dies). Es bedeutet wahrscheinlich, dass etwas dazu führt, dass bestimmte Datenbankverbindungen in einen fehlerhaften Zustand geraten und neue Anforderungen für eine Verbindung warten. Dies kann in älteren Versionen von Puma auftreten, wo mehrere Threads verwendet werden und reaping_frequency
eingestellt ist - wenn einige Verbindungen in einen schlechten Zustand geraten und die anderen geerntet werden, führt dies zu Problemen.
Einige hochrangige Vorschläge sind wie folgt:
- Upgrade-Rubin & Puma
- die
rack-timeout
gem Wenn verwenden, aktualisieren Sie das auch
Diese Upgrades oft helfen. Wenn nicht, gibt es andere Möglichkeiten, wie zum Beispiel den Wechsel von Threads zu Worker-basierten Prozessen oder die Verwendung eines Postgres-Verbindungspools wie PgBouncer. Wir haben weitere Vorschläge zur Konfiguration von gleichzeitigen Webservern für die Verwendung mit Postgres hier: https://devcenter.heroku.com/articles/concurrency-and-database-connections
Antwort auf mich selbst: Überprüfen Sie nur die langsamste Datenbankabfragen, auch wenn sie selten angefordert werden, ihre Auswirkungen auf die restlichen Abfragen ist riesig. – user3029400
Welchen Cache-Speicher verwenden Sie?Das erste, was zu debuggen wäre, warum der Speicher so lange braucht, um zu antworten, oder (wenn der Cache-Speicher archiviert ist), dauert die Deserialisierung der Daten im Cache-Speicher zu lange? – jbielick