Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verlorene Verbindung zum MySQL-Server während der Abfrage bei zufälligen einfachen Abfragen

Die Verbindung zu MySQL kann auf verschiedene Weise unterbrochen werden, aber ich würde empfehlen, die Antwort von Mario Carrion erneut zu lesen, da sie eine sehr weise Antwort ist.

Es scheint wahrscheinlich, dass die Verbindung unterbrochen wird, weil sie mit den anderen Prozessen geteilt wird, was Kommunikationsprotokollfehler verursacht...

...dies könnte leicht passieren, wenn der Verbindungspool prozessgebunden ist, was meiner Meinung nach in ActiveRecord der Fall ist, was bedeutet, dass dieselbe Verbindung mehrere Male gleichzeitig in verschiedenen Prozessen "ausgecheckt" werden könnte.

Die Lösung besteht darin, dass Datenbankverbindungen erst NACH dem fork hergestellt werden müssen Anweisung im Anwendungsserver.

Ich bin mir nicht sicher, welchen Server Sie verwenden, aber wenn Sie ein warmup verwenden Funktion - nicht.

Wenn Sie vor der ersten Netzwerkanfrage irgendwelche Datenbankaufrufe ausführen, tun Sie es nicht.

Jede dieser Aktionen könnte möglicherweise den Verbindungspool vor fork initialisieren Dies führt dazu, dass der MySQL-Verbindungspool von Prozessen gemeinsam genutzt wird, während das Sperrsystem dies nicht tut.

Ich sage nicht, dass dies der einzig mögliche Grund für das Problem ist, wie von @sloth-jr angegeben, es gibt andere Möglichkeiten ... aber die meisten von ihnen scheinen nach Ihrer Beschreibung weniger wahrscheinlich zu sein.

Nebenbemerkung:

Jeder Prozess könnte eine Reihe von Verbindungen halten. In Ihrem Fall könnten Sie bis zu 500 x 36 Verbindungen haben . (siehe Bearbeiten)

Im Allgemeinen kann die Anzahl der Verbindungen im Pool oft gleich der Anzahl der Threads in jedem Prozess sein (sie sollte nicht geringer sein als die Anzahl der Threads, da Sie sonst durch Konflikte verlangsamt werden). Manchmal ist es gut, je nach Anwendung ein paar mehr hinzuzufügen.

BEARBEITEN:

Ich entschuldige mich dafür, dass ich die Tatsache ignoriert habe, dass die Prozesszählung auf die MySQL-Daten und nicht auf die Anwendungsdaten verwiesen hat.

Die von Ihnen angezeigte Prozessanzahl sind die MySQL-Serverdaten, die scheint ein Thread-per-Connection-IO-Schema zu verwenden . Die "Process"-Daten zählen tatsächlich aktive Verbindungen und nicht tatsächliche Prozesse oder Threads (obwohl es auch die Anzahl der Threads bedeuten sollte).

Das bedeutet, dass von 500 möglichen Verbindungen pro Anwendungsprozess (d. h. wenn Sie 8 Prozesse für Ihre Anwendung verwenden, wären das 8 x 500 =4.000 zulässige Verbindungen) Ihre Anwendung bisher nur 36 Verbindungen geöffnet hat.