Ich führe eine ziemlich geschäftige Site aus und sehe während weniger Stunden mehr als 10.000 offene Verbindungen zu meinem Datenbankserver auf meinem Webserver, wenn ein netstat-Befehl ausgeführt wird. 99% der Verbindungen befinden sich im TIME_WAIT
Status.
Ich habe heute von dieser mysql-Variablen erfahren: wait_timeout
http://dev.mysql.com/doc/refman/5.1/de/server-system-variables.html#sysvar_wait_timeout . Meins ist immer noch auf den Standardwert von 28.800 Sekunden eingestellt.
Ist es sicher, diesen Wert zu senken?
Keine meiner Abfragen dauert in der Regel länger als eine Sekunde. Es ist also albern, eine Verbindung 480 Minuten lang offen zu halten.
Ich habe auch davon gehört, mysql_pconnect
anstatt zu verwenden mysql_connect
, aber ich habe nur Horrorgeschichten darüber gelesen, also denke ich, dass ich mich davon fernhalten werde.
wait_timeout
Verbindung unterbrochen wird, wenn die Software erwartet, dass sie geöffnet bleibt.Antworten:
Das Verringern des Werts ist ohne einen Neustart von MySQL ziemlich trivial
Angenommen, Sie möchten die Zeitüberschreitung auf 30 Sekunden senken
Fügen Sie dies zunächst zu my.cnf hinzu
Dann können Sie so etwas tun
Danach werden alle DB-Verbindungen in 30 Sekunden beendet
WARNUNG
Stellen Sie sicher, dass Sie mysql_close explizit verwenden. Ich vertraue Apache nicht wie die meisten Entwickler. Wenn nicht, gibt es manchmal eine Racebedingung, bei der Apache eine DB-Verbindung schließt, aber mysqld nicht benachrichtigt und mysqld diese Verbindung offen hält, bis das Timeout abgelaufen ist. Schlimmer noch, Sie sehen TIME_WAITs möglicherweise häufiger. Wählen Sie Ihre Zeitlimitwerte mit Bedacht aus.
UPDATE 2012-11-12 10:10 EDT
VORBEHALT
Erstellen Sie nach dem Anwenden meiner geposteten Vorschläge ein Skript
/root/show_mysql_netstat.sh
mit den folgenden Zeilen:Wenn Sie dies ausführen, sollte Folgendes angezeigt werden:
Wenn
TIME_WAITs
für einen bestimmten Webserver immer noch viele MySQL-Dateien angezeigt werden, müssen Sie zwei Eskalationsschritte ausführen :ESCALATION # 1
Melden Sie sich beim anstößigen Webserver an und starten Sie Apache wie folgt neu:
Führen Sie dies bei Bedarf auf allen Webservern durch
ESCALATION # 2
Sie können das Betriebssystem zwingen, TIME_WAITs für mysql oder eine andere App mit den folgenden Aktionen zu beenden:
Dadurch läuft TIME_WAITs in 1 Sekunde ab.
Kredite geben, wo Kredite fällig sind ...
TIME_WAIT
entsteht.quelle
Wenn Sie auf dem MySQL-Server viele TIME_WAIT-Verbindungen erhalten, bedeutet dies, dass der MySQL-Server die Verbindung schließt. In diesem Fall ist es am wahrscheinlichsten, dass ein Host oder mehrere Hosts auf eine Sperrliste gesetzt wurden. Sie können dies löschen, indem Sie Folgendes ausführen:
So erhalten Sie eine Liste der Anzahl der Verbindungen, die Sie pro IP-Lauf haben:
Sie können dies auch bestätigen, indem Sie sich an einen Ihrer Clients wenden, der Probleme mit der Verbindung hat, und eine Telnet-Verbindung zu Port 3306 herstellen.
quelle
Wenn Sie viele TIME_WAIT-Verbindungen zu Ihrem MySQL-Server haben, bedeutet dies, dass Ihr Code viele Abfragen für Ihre Datenbank ausführt und für jede Abfrage eine Verbindung öffnet / schließt.
In diesem Fall sollten Sie über die MySQLi-Erweiterung eine dauerhafte Verbindung zu Ihrem DB-Server herstellen.
http://php.net/manual/en/mysqli.persistconns.php
Wenn Sie MySQLi nicht verwenden können, sollten Sie stattdessen den Parameter thread_cache_size in Ihrer MySQL-Konfiguration verwenden.
quelle