Frage

Vor kurzem habe ich in Zeiten des hohen Verkehrs angefangen, MySQL "zu viele Verbindungs" -Fehler zu bekommen. Meine Rails -App läuft auf einem Mischling -Cluster mit 2 Instanzen auf einem gemeinsamen Host. Einige jüngste Änderungen, die es möglicherweise antreiben:

  • Der Verkehr auf meiner Website hat zugenommen. Ich bin jetzt im Durchschnitt etwa 4K Seiten pro Tag.
  • Die Datenbankgröße hat zugenommen. Mein größter Tisch hat ~ 100.000 Reihen. Einige Assoziationen könnten im schlimmsten Fall mehrere hundert Fälle zurückgeben, obwohl die meisten weitaus weniger sind.
  • Ich habe einige Funktionen hinzugefügt, die die Anzahl und Größe von Datenbankaufrufen in einigen Aktionen erhöht haben.

Ich habe eine Codeüberprüfung durchgeführt, um Datenbankaufrufe zu reduzieren, SQL -Abfragen zu optimieren, fehlende Indizes hinzuzufügen und zu verwenden: für eifriges Laden einschließen. Viele meiner Methoden tätigen jedoch immer noch 5-10 separate SQL-Anrufe. Die meisten meiner Aktionen haben eine Reaktionszeit von rund 100 ms, aber eine meiner häufigsten Aktionen beträgt durchschnittlich 300-400 ms, und einige Aktionen erreichen zufällig mit über 1000 ms.

Die Protokolle sind wenig Hilfe, da die Fehler zufällig zu erfolgen scheinen oder zumindest das Muster nicht mit den aufgerufenen Aktionen oder den auf Daten zugegriffenen Daten zugeordnet zu sein scheinen.

Könnte ich den Fehler lindern, indem ich zusätzliche Mischling -Instanzen hinzufügt? Oder sind die MySQL -Verbindungen durch den Server begrenzt und daher nichts mit der Anzahl der Prozesse zu tun, über die ich meinen Datenverkehr teile?

Ist dies höchstwahrscheinlich ein Problem bei meiner Codierung oder sollte ich meinen Host für mehr Kapazität/weniger Last auf dem gemeinsam genutzten Server drücken?

War es hilfreich?

Lösung

Zwischenst zwischen etwas? Es ist ein wichtiger Bestandteil der Linderung von Anwendungen und Datenbanklast. Das Rails Guides haben einen Abschnitt zum Ausschneiden.

Andere Tipps

ActivereCord hat seit Rails 2.2 Datenbankverbindungen gepoolt, und es ist wahrscheinlich, dass dies Ihre überschüssigen Verbindungen hier verursacht. Versuchen Sie, den Wert von abzulehnen pool in deiner database.yml für diese Umgebung (es ist standardmäßig 5).

Dokumente können gefunden werden hier.

Irgendwas stimmt nicht. Eine Mongrelinstanz verarbeitet 1 Anfrage zu einem Zeitpunkt. Wenn Sie also 2 Mongrel -Instanzen haben, sollten Sie nicht mehr als 2 aktive MySQL -Verbindungen sehen (mindestens die Mischling)

Sie können die Ausgabe des SHOW -Status wie 'threads_connected' im Laufe der Zeit protokollieren oder grafisch darstellen.

PS: Dies sind nicht sehr viele Mischlinge. Wenn Sie in der Lage sein möchten, mehr als 2 gleichzeitige Anfragen zu bedienen, möchten Sie mehr. ... Wenn der Speicher eng ist, können Sie zu Phusionspassger und Ree wechseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top