Frage Wie finde ich die Ursache für "zu viele Verbindungen" Fehler in MySQL / PHP


Ich betreibe einen Webservice, der Algorithmen ausführt, die täglich Millionen von Anrufen bedienen und auch Hintergrundverarbeitung durchführen. Jedes Mal und dann sehe ich "zu viele Verbindungen" -Fehler beim Versuch, sich für ein paar Sekunden mit der MySQL-Box zu verbinden. Dies ist jedoch nicht unbedingt auf hohe Zugriffszeiten oder irgendetwas zurückzuführen, auf das ich meinen Finger legen kann.

Ich möchte den Engpass finden, der es verursacht. Anders als in den speziellen Zeiten, in denen dies geschieht, ist der Server nicht zu sehr in Bezug auf CPU und Arbeitsspeicher belastet und hat 2-3 Verbindungen (Threads) geöffnet und alles funktioniert reibungslos. (Ich benutze Zabbix zum Überwachen)

Irgendwelche kreativen Ideen, um es zu verfolgen?


9
2018-04-15 09:33


Ursprung


Antworten:


Welchen MySQL-Tabellentyp verwenden Sie? MyISAM oder InnoDB (oder ein anderes)? MyISAM verwendet Sperren auf Tabellenebene, sodass Sie in einem Szenario mit einer schweren Auswahl, gefolgt von einer Aktualisierung in der gleichen Tabelle und zahlreichen Auswahlabfragen, auftreten können. Die letzten Select-Abfragen müssen dann warten, bis das Update beendet ist (was wiederum warten muss, bis das erste - Heavy-Select beendet ist).

Für InnoDB könnte ein Tool wie innotop nützlich sein, um die Ursache des Deadlocks zu finden (siehe http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/).

BTW Die Abfrage, die die Sperre verursacht, sollte einer der nicht im gesperrten Zustand sein.


3
2018-04-26 09:27



Versuchen Sie, in diesem Fall eine offene mysql-Konsole zu haben, und geben Sie a ein

SHOW PROCESSLIST;
 um zu sehen, welche Anfragen ausgeführt werden. Alternativ können Sie die Protokollierung langsamer Abfragen aktivieren (in my.cnf fügen Sie diese Zeile ein:

log-slow-queries=/var/log/mysql-log-slow-queries.log

im Abschnitt [mysqld] und verwenden

set-variable = long_query_time = 1
  um zu definieren, wie lange eine Abfrage mindestens dauern sollte, um als langsam zu gelten. (Denken Sie daran, mysql neu zu starten, damit die Änderungen wirksam werden)


6
2018-04-15 09:44



Das SHOW OPEN TABLES Der Befehl zeigt den Sperrstatus aller Tabellen in MySQL an. Wenn eine oder mehrere Ihrer Abfragen das Verbindungsbacklock verursachen, wird das Kombinieren verwendet SHOW PROCESSLIST und die offenen Tabellen sollten es eingrenzen, um genau zu bestimmen, welche Abfrage die Werke hält.


2
2018-04-28 12:35



Altes Thema. Allerdings hatte ich gerade dieses Problem und es war, weil ich ein mysqldump-Skript für 3 Mal pro Tag geplant hatte. Zu dieser Zeit, wenn meine Web-Anwendung auch eine angemessene Menge an Nutzung bekam, stapelten sich alle Anfragen der Web-Anwendung einfach in die Warteschlange, während der mysqldump alle Tabellen in der Datenbank sperrte. Die beste Option besteht darin, einen Replikations-Slave auf einem separaten Rechner einzurichten und Ihre Backups vom Slave und nicht vom Produktionsserver zu übernehmen.


2
2018-04-25 21:16



Kann mit diesem Fehler in MySQL für die FULLTEXT-Suche in Verbindung stehen: http://bugs.mysql.com/bug.php?id=37067

In diesem Fall hängt die FULLTEXT-Initialisierung tatsächlich an MySQL. Leider scheint es keine Lösung zu geben.


1
2017-08-18 03:35



Ohne zu viel von Ihrer Implementierung und PHP im Allgemeinen zu wissen, aber sind Sie sicher, dass Sie keine Probleme mit veralteten DB-Verbindungen haben? ZB Verbindungen, die auch nach der Bearbeitung der Anfrage offen bleiben?

In PHP wird eine Verbindung normalerweise automatisch geschlossen, wenn das Skript beendet wird oder wenn ein Aufruf erfolgt mysql_close($conn); Wenn Sie jedoch eine Art von Verbindungs-Pooling verwenden, kann dies zu Problemen führen.


0
2018-04-28 17:52