Heim > Backend-Entwicklung > PHP-Tutorial > So beheben Sie HTTP 500: Interner Serverfehler mit PHP+Redis in tatsächlichen Projekten

So beheben Sie HTTP 500: Interner Serverfehler mit PHP+Redis in tatsächlichen Projekten

墨辰丷
Freigeben: 2023-03-28 08:08:01
Original
1885 Leute haben es durchsucht

Die Anzahl der Benutzer ist schnell gewachsen und die Anzahl der Besuche hat sich in kurzer Zeit verdoppelt. Aufgrund der guten frühen Kapazitätsplanung können die Hardwareressourcen dies unterstützen, es gibt jedoch ein großes Problem im Softwaresystem : 40 % der Anfragen geben HTTP 500 zurück: Interner Serverfehler

Problembeschreibung
Die Anzahl der Benutzer ist schnell gewachsen und die Anzahl der Besuche hat sich in kurzer Zeit verdoppelt Aufgrund der guten frühzeitigen Kapazitätsplanung können die Hardware-Ressourcen dies unterstützen, aber das Software-System ergab ein großes Problem:
40 % der Anfragen geben HTTP 500 zurück: Interner Serverfehler
Bei Betrachtung der Protokolle Es wurde festgestellt, dass der Fehler in der Verbindungsverarbeitung von PHP <-> lag Die Grundursache wurde zu Beginn nicht gefunden, daher konnten wir nur verschiedene fehlerbezogene Methoden ausprobieren, wie zum Beispiel:
PHP-Verbindungsnummer hinzufügen und das Timeout von 500 ms auf 2,5 s erhöhendeaktivieren Sie default_socket_timeout in den PHP-EinstellungenSYN-Cookies im Hostsystem deaktivieren

Überprüfen Sie die Anzahl der Dateideskriptoren in Redis und Webservern

Erhöhen Sie den Puffer des HostsystemsAnpassen Sie die Anzahl der TCP-Rückstände
...

Viele Methoden ausprobiert, aber alle sind wirkungslos


Beim zweiten Mal

Ich möchte vorinstallieren. Ich habe versucht, dieses Problem in der Release-Umgebung zu reproduzieren, aber leider ist es so Immer noch fehlgeschlagen. Es sollte daran liegen, dass der Datenverkehr nicht groß genug ist, um

Das dritte Mal

zu reproduzieren. Könnte es sein, dass Redis im Code nicht geschlossen ist? Normalerweise schließt PHP die Ressourcenverbindung am Ende der Ausführung automatisch, in älteren Versionen kommt es jedoch zu Speicherlecks. Um auf der sicheren Seite zu sein, ändern Sie den Code und schließen Sie die Verbindung manuell. Das Ergebnis ist immer noch ungültig

Das vierte MalVerdächtiges Ziel: PHPREDIS-Client-Bibliothek
Führen Sie A/B-Tests durch, ersetzen Sie die PREDIS-Bibliothek und stellen Sie sie für 20 % der Benutzer bereit das Rechenzentrum
Dank der guten Codestruktur wurden die Austauscharbeiten schnell abgeschlossen
Das Ergebnis ist zwar immer noch ungültig, aber es gibt auch eine gute Seite, die beweisen kann, dass phpredis in Ordnung ist

Das 5. Mal
Ich habe die Version von Redis überprüft und es war Version 2.8.9.
Versuchen Sie, Redis zu aktualisieren Aktualisieren.
Es ist in Ordnung. Das ist nicht praktisch.

Das 6. MalBeim Durchsuchen vieler Dokumente habe ich festgestellt Eine gute Debugging-Methode in den offiziellen Dokumenten: Redis Software Watchdog, öffnen Sie es und führen Sie Folgendes aus:


$ redis-cli --latency -p 6380 -h 1.2.3.4
min: 0, max: 463, avg: 2.03 (19443 samples)
Nach dem Login kopieren

Sehen Sie sich das Redis-Protokoll an:

...
[20398] 22 May 09:20:55.351 * 10000 changes in 60 seconds. Saving...
[20398] 22 May 09:20:55.759 * Background saving started by pid 41941
[41941] 22 May 09:22:48.197 * DB saved on disk
[20398] 22 May 09:22:49.321 * Background saving terminated with success
[20398] 22 May 09:25:23.299 * 10000 changes in 60 seconds. Saving...
[20398] 22 May 09:25:23.644 * Background saving started by pid 42027
...
Nach dem Login kopieren

Das Problem wurde gefunden:

jedes Es dauert nur ein paar Minuten, um Daten auf der Festplatte zu speichern. Warum dauert es etwa 400 ms, einen Hintergrundspeicher zu forken (Sie können es sehen). (die Zeit des ersten und zweiten Protokolls oben)

Hier habe ich endlich die Ursache des Problems gefunden. Da in der Redis-Instanz eine große Datenmenge vorhanden ist, ist es sehr zeitaufwändig, den Hintergrund zu forken Prozess für jeden Persistenzvorgang, und die Schlüssel werden in ihrem Geschäft häufig geändert, was zu häufigen Persistenzauslösern führt, was häufig zu Problemen mit der Redis-Blockierung führt

Lösung: Verwenden Sie einen separaten Slave für die Persistenz

Dieser Slave verarbeitet keine echten Verkehrsanfragen. Seine einzige Funktion besteht darin, die Persistenz zu verwalten und Persistenzoperationen für die vorherige Redis-Instanz durchzuführen.


Der Effekt ist sehr offensichtlich und das Problem ist grundsätzlich gelöst Manchmal werden immer noch Fehler gemeldet

Das 7. Mal

Beheben Sie die Langsamkeit, die Redis Query blockieren kann, und stellen Sie fest, dass irgendwo Schlüssel verwendet werden *

Denn es gibt mehr und Mehr Daten in Redis, dieser Befehl führt natürlich zu einer ernsthaften Überlastung

Sie können ihn durch Scannen ersetzen

Das 8. Mal

Nach den vorherigen Anpassungen ist das Problem behoben wurde in den folgenden Monaten gelöst, obwohl der Datenverkehr weiter zunahm, konnte er dem widerstehen

Aber sie erkannten neue Probleme:

Die aktuelle Methode besteht darin, eine Redis-Verbindung herzustellen Wenn eine Anfrage eingeht, führen Sie einige Befehle aus und trennen Sie dann die Verbindung. Wenn das Anfragevolumen groß ist, führt diese Methode zu erheblichen Leistungsverlusten. Mehr als die Hälfte davon werden für die Verarbeitung von Verbindungsvorgängen verwendet, die die Verarbeitung der Geschäftslogik übersteigen Redis verlangsamen

Lösung: Proxy einführen Sie haben sich für den Twemproxy von Twitter entschieden, der nur zu jedem Webserver hinzugefügt werden muss. Bei der Installation eines Proxys auf dem Computer ist Twemproxy für dauerhafte Verbindungen mit Redis-Instanzen verantwortlich, was die Reduzierung erheblich verringert Verbindungsvorgänge.
Twemproxy verfügt außerdem über zwei praktische Funktionen:

Unterstützt Memcached

Kann blockiert werden. Sehr zeitaufwändige oder gefährliche Befehle wie Tasten, Flushall

Der Effekt ist natürlich perfekt, und Sie müssen sich keine Sorgen mehr über frühere Verbindungsfehler machen

Das 9. Mal

durch Daten-Sharding Lassen Sie uns mit der Optimierung fortfahren:


Daten aufteilen und isolieren verschiedene Kontexte
Konsistentes Hash-Sharding für Daten im selben Kontext durchführen

Wirkung:

Reduzieren Sie die Anzahl der Anforderungen auf jeder Maschine. Die Anforderung und das Laden
verbessert die Zuverlässigkeit des Caches und nicht Sorgen Sie sich um einen Knotenausfall

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich sein wird.



Verwandte Empfehlungen:

PHP-Methode zum Erhalten von 6-stelligen Zufallszahlen, die in

Redis nicht vorhanden sind


PHP implementiert redisMethode zur Nachrichtenwarteschlangenveröffentlichung Weibo

CI-Framework (CodeIgniter)-Betriebredis Schritt Analyse

Das obige ist der detaillierte Inhalt vonSo beheben Sie HTTP 500: Interner Serverfehler mit PHP+Redis in tatsächlichen Projekten. 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