2009-05-02 3 views
1

Wir haben eine recht umfangreiche Website (1 Million Seitenaufrufe/Tag) mit Apache-Mod-Proxy, die immer mit Verbindungen (> 1.000) im TIME_WAIT-Zustand überlastet wird. Die Verbindungen sind zu Port 3306 (mysql), aber mysql zeigt nur ein paar Verbindungen (show process list) und funktioniert gut. Wir haben versucht, eine Menge Dinge zu ändern (am Leben zu halten), aber nichts scheint zu helfen. Alle anderen Systemressourcen liegen in einem vernünftigen Rahmen.Zu viele TIME_WAIT-Verbindungen

Ich habe herum gesucht, was darauf hindeutet, das tcp_time_wait_interval zu ändern. Aber das scheint ein bisschen drastisch. Ich habe schon früher auf einer vielbeschäftigten Website gearbeitet, aber ich hatte dieses Problem nie.

Irgendwelche Vorschläge?

Antwort

0

Wir hatten ein ähnliches Problem, wo unsere Webserver alle erstarrten, weil unser php Verbindungen zu einem MySQL-Server herstellte, der eingerichtet wurde, Reverse-Host-Lookups bei eingehenden Verbindungen durchzuführen.

Wenn die Dinge langsam waren, funktionierte es gut, aber unter Last schossen die Antworten durch das Dach und alle Apache-Server blieben in time_wait stecken.

Die Art und Weise, wie wir das Problem herausgefunden haben, war die Verwendung von xdebug, um Profiling-Daten in den Skripten unter hoher Last zu erstellen und sich das anzusehen. Die Aufrufe von mysql_connect nahmen 80-90% der Ausführungszeit in Anspruch.

+0

Aber würden die Verbindungen nicht alle von demselben Server, Ihrem Webserver oder Ihrem Anwendungsserver stammen? Ich würde denken, dass mysql nur nach der ersten Verbindung seinen Host-Cache treffen würde. –

+0

sie taten, und es tat es nicht. – xkcd150

5

Jede time_wait-Verbindung ist eine Verbindung, die geschlossen wurde.

Wahrscheinlich verbinden Sie sich mit mysql, geben eine Abfrage aus und trennen dann. Wiederholen Sie dies für jede Abfrage auf der Seite. Erwägen Sie, ein Verbindungspooling-Tool oder zumindest eine globale Variable zu verwenden, die Ihre Datenbankverbindung unterstützt. Wenn Sie global verwenden, müssen Sie die Verbindung am Ende der Seite schließen. Hoffentlich haben Sie einen gemeinsamen Platz, den Sie wie eine Fußzeile einfügen können.

Als Bonus sollten Sie eine schnellere Seitenladung erhalten. MySQL ist schnell zu verbinden, aber nicht noch schneller neu zu verbinden.

+0

Wir verwenden PHP, daher können Sie das Verbindungs-Pooling nicht wirklich durchführen, da der Prozess endet, sobald die Seite geliefert wurde. –

+0

Sie können Ihre Verbindung innerhalb der Seite weiterhin verwenden, indem Sie Ihre dbconnection einer globalen Variablen zuweisen. Anstatt jedes Mal neu zu erschaffen. Sie können auch etwas wie http://httpd.apache.org/docs/2.2/mod/mod_dbd.html verwenden, um das Pooling außerhalb des PHP-Prozesses durchzuführen. – Trey

+0

@trey @craig jede PHP-Demo, wie diese globale Var erstellen –