2010-02-10 4 views
5

Wir sehen ein seltsames Verhalten und wir sind nicht sicher, ob es ein Problem mit Apache, PHP, MySQL oder dem Betriebssystem ist, also zu den großen Gehirnen von Stackoverflow!Apache/PHP-Prozesse hängen während der Interaktion mit MySQL

Wir haben Apache und mod_php im Gespräch mit einem mysql5 Server. Manchmal entscheidet sich ein Prozess zu hängen und versucht, von einem Dateideskriptor zu lesen.

Anzündung Strace eine auf von ihnen (alle hängen Prozesse die gleichen Ergebnisse zeigten) ergab dies:

[[email protected] ~]# strace -p 8450 
Process 8450 attached - interrupt to quit 
read(57, <unfinished ...> 

Also, was es versucht, zu lesen?

[[email protected] ~]# lsof -p 8450 
... 
... 
httpd 8450 apache 57u IPv4 5546599    TCP 
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED) 

Das ist unser MySQL-Server! Ok, vielleicht versuchte es die Ergebnisse einer Anfrage zu lesen, dachte ich. Beim Überprüfen der Prozessliste auf dem MySQL-Server wurde die Verbindung hergestellt, jedoch im Status SCHLAF.

Hmmmm.

Also habe ich netstat überprüft, wer versucht hat, was zu senden/zu erhalten.

auf dem Webserver:

[[email protected] ~]# netstat -t -n -a | grep 36615 
tcp  0  5 172.23.179.6:36615   172.23.179.67:3306   
ESTABLISHED 

und auf dem MySQL-Server gibt es eine etablierte Verbindung aber 0 in der Sende- oder Empfangswarteschlangen.

Irgendeine Idee, was diese mysteriösen 5 Bytes sein könnten, oder warum sie zufällig den mysql Server nicht bekommen?

Prost!

Mike

+0

Können Sie die Datenbank selbst und/oder von anderen Anwendungen aus verbinden und abfragen? – jdizzle

+0

Sind Sie sicher, dass dies zufällig geschieht und dass es nicht an ein bestimmtes Skript gebunden ist? –

+0

Ich bin Mikes Kollege; Wenn Sie sich in diesem Fehlerzustand befinden, können Sie einen neueren Browser öffnen (eine neue PHP-Sitzung erhalten) und die Site verwenden, als ob nichts passiert wäre. Die Datenbank ist also immer noch in Ordnung. Es kann an ein Skript gebunden sein, das auf allen Seiten enthalten ist, aber es ist (bis jetzt) ​​zufällig, welche Seite den Fehler auslöst. – crb

Antwort

1

Welche MySQL-Engine verwenden Sie (myisam, innodb, ...)? Verwenden Sie die mysql- oder mysqli-Schnittstelle auf der PHP-Seite?

Ich würde die "log" und "log_slow_queries" in der mysql config-Datei versuchen (möglicherweise zu einer ramdisk) zusammen mit wading durch die Ausgabe für "SHOW GLOBAL STATUS;" in der mysql-Shell (jede Servervariable, die mit "* _wait" endet oder mit der Verbindung verbunden ist).

Haben Sie irgendeinen Teil im "Fine tuning" Abschnitt der mysql Konfigurationsdatei geändert? Einige Puffer geändert?

Haben Sie in der php.ini einen Standardwert (60) für mysql.connect_timeout? Die Einstellung von "mysql.trace_mode" auf "on" wird für eine Weile nicht schaden.

Sie könnten auch versuchen, wenn möglich, verschiedene Teile/URLs Ihrer App mit einem Werkzeug wie "ab" zu testen, um es einzugrenzen.

Oder: Wenn Sie Apache mit Prefork-Modul verwenden, starten Sie lokal nur einen Server ("Startservers 1", "MaxSpareServers 0", so etwas) und einen Stresstest, bis er aufhört. Dann könnten die Protokolle von mehr Wert sein.

1

Jemand E-mailled mich auf dieser Seite, also ging ich zurück zum OP und bekam dieses Update auf der eventuellen fix wir verwendet:

Es ist schon eine Weile, aber so weit ich mich erinnere war aufgrund einiger Netzwerkfehler zwischen dem Webserver und dem MySQL-Server.Wir waren mit persistenten Verbindungen, so dass die Ressource noch von Apache geöffnet gehalten wurde, obwohl irgendwo im Netzwerk die Verbindung gestorben war, ohne dass jeder Server davon bewusst ist, ich denke, dass eine schlecht konfigurierte (oder geschriebene) Firewall war .

Wir haben aufgehört persistente Verbindungen zu verwenden und das Problem ging weg.

Verwandte Themen