So reduzieren Sie den Leerverbindungsprozess von Sleep in PHP und MySQL

伊谢尔伦
Freigeben: 2023-03-11 08:38:02
Original
1770 Leute haben es durchsucht

Im entwickelten System wurde eine große Anzahl leerer Verbindungen im Ruhezustand der Datenbank angezeigt. Gleichzeitig wurde durch das Protokoll festgestellt, dass es im Feedback des Drittanbieters eine große Anzahl von Ausnahmen gab Durch Curl von PHP im System angeforderte API-Schnittstelle. Ich konnte nicht anders, als die beiden zu verbinden, um die Gründe zu analysieren. Das Protokoll zeigt, dass die Schnittstelle des Drittanbieters langsam reagiert und das Ergebnis leer ist. Der Grund ist unbekannt, aber es ist denkbar, dass PHP nach dem Ausgeben einer Curl-Anfrage auf die Rückkehr der Verbindung wartet Ruhezustand, bis das Curl-Timeout abläuft und die Datenbankverknüpfung freigegeben wird, nachdem der Prozess ausgeführt wurde.

1. PHP+MySQL+Memcache praktischer technischer Test

Es gibt zwei ungewöhnliche Fragen, aber es handelt sich um reale Fälle, die im tatsächlichen Kampf auftreten

1: Ich schreibe ein Programm, das sowohl MySQL

als auch Memcache verwendet Die erste Zeile ist

mysql_connect

und die zweite Zeile ist memcache_connectSchreiben Es ist vorbei, die erste Zeile ist memcache_connect und die zweite Zeile ist mysql_connect

caoz hat festgestellt, dass es in der Praxis einen großen Unterschied zwischen diesen beiden Schreibweisen gibt.

2: Ich habe ein Programm mit MySQL geschrieben, eine Seite generiert und schließlich echo $html zur Ausgabe verwendet

Eine Möglichkeit, es zu schreiben, ist

mysql_close

();echo $html;

Das andere ist

echo $html;

mysql_close();

caoz hat festgestellt, dass es in der Praxis einen großen Unterschied gibt.

Beide Fälle werden in der Praxis entdeckt und angepasst.

caoz ist nicht jemand, der BT beim Schreiben von Programmen anstrebt. Caoz betont gegenüber Ingenieuren oft, dass es nicht um extremen technischen Ausdruck oder technische Angeberei geht Da eine bestimmte Schreibmethode besser ist als eine bestimmte Schreibressourcenbelastung oder etwas anderes, ist dies wirklich nicht die ursprüngliche Absicht von caoz.

Diese beiden Fragen sind typische Fälle, die in realen Betriebsumgebungen auftreten. Wo sind die typischen Fälle? Das heißt, wenn Sie auf einen Systemfehler stoßen, wie analysieren Sie, wie denken Sie und wie beurteilen Sie die Auswirkungen mehrerer zusammengehöriger Faktoren? Daher spielt es keine Rolle, ob Sie diese Frage beantworten können ist, wie man über die Beziehung zwischen Systemen nachdenkt.

Ein typischer Systemfehler sind zu viele MySQL-Verbindungen. Dieses Problem hat uns schon lange beschäftigt. Wenn dies durch Indizierung oder gleichzeitige Datenanfragen verursacht wird, ist es nicht kompliziert. Aber nachdem das oben genannte Problem gelöst wurde, trat ein seltsames Phänomen auf. Es gab fast keinen Druck auf die Datenbank, keine blockierten Prozesse und keine langsamen Abfragen, aber es gab viele MySQL-Verbindungen, und es waren alles Schlafverbindungen. Derzeit gibt es auch viele Links zum Webserver. Mit anderen Worten: Da die PHP-Ausführung blockiert ist, kann der MySQL-Link nicht schnell freigegeben werden. Eine Breakpoint-für-Breakpoint-Analyse ergab, dass sich das Echo am längsten verzögerte.

Dieser Vorfall hat caoz einige Erfahrungen beschert. Ich hätte noch nie gedacht, dass Echo ein Zeitblockierungspunkt ist (wenn Sie es auf dieser Maschine testen, werden Sie denken, dass seine Zeitverzögerung fast 0 ist), aber die Instanzverfolgung festgestellt, dass Echo tatsächlich den Prozess der Netzwerkübertragung in unserer Arbeitsumgebung darstellt. Zu diesem Zeitpunkt ist die MySQL-Verbindung noch vorhanden und wurde nicht freigegeben Die Frage wird jeder denken, dass mysql_close nach Echo platziert werden sollte, aber warum Echo die Zeit verzögert, werden nur wenige darüber nachdenken. Natürlich hängt dies auch mit der Arbeitsumgebung zusammen. Caoz weiß, dass es einen anderen Konfigurationsmodus gibt, den Caoz nicht getestet hat, aber die Erfahrung hier ist Wenn mysql_close vor echo platziert wird, nimmt eine große Anzahl von Sleep-Links schnell ab.

Echo verbraucht nicht zu viele Systemressourcen, wartet jedoch auf die Netzwerkübertragung. In einer Netzwerkumgebung mit hoher Parallelität ist es gut, dass die Datenbank darauf achtet.

Nachdem dieses Problem gelöst war, wurde MySQL viel gesünder, aber gelegentlich trat das Problem zu vieler Links auf, das mich laut einigen

Fehlermeldungen

lange Zeit beunruhigte Von Benutzern berichtet, Es wurde festgestellt, dass der Memcached-Server zu hoch und blockiert war und der PHP-Prozess auf Links wartete, was dazu führte, dass eine große Anzahl von MySQL-Links wartete Ursprung der ersten Frage Tatsächlich gibt es keine Standardantwort auf diese Frage selbst, aber Sie sollten sich darüber im Klaren sein, dass Sie dies nicht garantieren können, wenn Sie zwei Links A und B gleichzeitig in einem Skript starten Zwei Links müssen unbedingt zuverlässig sein (normalerweise kann dies nicht garantiert werden). Sobald der letztere blockiert ist, wartet der erstere auf eine große Anzahl von Links. Während der erstere blockiert, hat dies normalerweise keine Auswirkungen auf den letzteren. Die Antwort hängt also davon ab, welcher Link für Ihre Anwendung wichtiger ist und welcher Link eine bessere Parallelitätsunterstützung bietet. Beide Fragen bedeuten letztendlich dasselbe. Wenn Sie auf Systemprobleme und -ausfälle stoßen, denken Sie mehr über die Auswirkungen einiger verwandter Faktoren und die Logik der Antwortsequenz der gesamten Datenbank nach Es muss an der Datenbank liegen. Es ist nicht notwendig, den Webserver zu optimieren. Nur durch die Lösung der Grundursache können die Probleme behoben werden.

2. Effektive Methode zur Reduzierung des MySQL-Schlafprozesses

1. Der Grund, warum MySQL eine große Anzahl von Sleep-Prozessen hat, liegt darin, dass es die MySQL-Long-Link-Datenbankmethode verwendet, d. h. die Verwendung von mysql_pconnect um „kurze“ Links zu verwenden.
2. Wenn Sie die Kurzlink-Methode mysql_connect zum Öffnen der Datenbank verwenden, führt jede Seite nach dem Öffnen der Datenbank SQL aus. Wenn das Seitenskript endet, wird die MySQL-Verbindung automatisch geschlossen und Speicher freigegeben. Es gibt jedoch immer noch eine große Anzahl von Sleep-Prozessen. Sie können überprüfen, ob auf der Website die folgenden Probleme auftreten.
A. Es gibt eine große Anzahl statischer Dateien auf der Festplatte oder der WEB-Server ist zu stark ausgelastet und die HTTP-Anfrageantwort wird zu langsam. Dies kann auch zu einer großen Anzahl von Sleep-Prozessen führen Um die Parameter und Dateien des WEB-Dienstes entsprechend anzupassen, sind statische oder zwischengespeicherte Webinhalte blind kein Allheilmittel.
B. In Webskripten können einige Berechnungen und Anwendungen sehr zeitaufwändig sein. Beispielsweise verbringt das Webskript nach dem Öffnen der Datenbank bei 0 Sekunden und der Ausführung eines SQL-Codes 20 Sekunden damit, einen komplexen Vorgang auszuführen Eine riesige PHP-Datei (z. B. eine Filterfunktion mit Tausenden illegaler Schlüsselwörter). Zu diesem Zeitpunkt hat MySQL während dieses 20-sekündigen Prozesses nichts unternommen und war bis dahin immer im Ruhezustand Wenn die Seite die Ausführung abschließt oder den Wert „wait_timeout“ erreicht (wird zwangsweise geschlossen), optimieren Sie das Webseitenskript und versuchen Sie, das Programm so schnell wie möglich auszuführen, oder führen Sie mysql_close aus, um den aktuellen MySQL-Link während dieses zeitaufwändigen laufenden Prozesses zwangsweise zu schließen.
C. In der Sammelstation ist das Phänomen einer großen Anzahl von Schlafprozessen in MySQL besonders offensichtlich (viele Internetnutzer fragten beispielsweise nach der großen Anzahl von Schlafprozessen in MySQL von DeDeCMS), da dies bei den meisten Sammelseiten der Fall ist Erstellen Sie im Voraus einen MySQL-Link (möglicherweise zur Überprüfung der Benutzerberechtigungen usw.) und verwenden Sie dann Vorgänge wie file_get_contents, um den Inhalt einer Remote-Webseite abzurufen Die Geschwindigkeit ist zu langsam, zum Beispiel dauert es 10 Sekunden, um die Webseite abzurufen. Daher ist das aktuelle Sammlungsskriptprogramm hier immer blockiert, MySQL führt nichts aus und befindet sich immer im Ruhezustand. Die Lösung ist die gleiche wie oben. Wenn Sie file_get_contents zum Sammeln von Remote-Webseiten ausgeben, verwenden Sie mysql_close, um das Schließen der MySQL-Verbindung zu erzwingen. Warten Sie, bis die Sammlung abgeschlossen ist, und führen Sie dann bei Bedarf erneut mysql_connect aus.

Das obige ist der detaillierte Inhalt vonSo reduzieren Sie den Leerverbindungsprozess von Sleep in PHP und MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!