9 Stimmen

600+ memcache req/s Probleme - Hilfe!

Ich betreibe Memcached auf meinem Server und wenn es 600+ req/s erreicht, wird es instabil und verursacht eine große Menge an Problemen. Es scheint, wenn die Anforderungsrate so hoch wird, sind meine PHP-Anwendungen zu zufälligen Zeiten nicht in der Lage, sich mit dem memcache-Server zu verbinden, was zu langsamen Ladezeiten führt, was nginx und php-fpm ausflippen lässt und ich erhalte eine Reihe von 104: Connection reset by peer errors in meinen nginx-Protokollen.

Ich möchte darauf hinweisen, dass ich in meinem Memcache-Server "heiße Objekte" habe - Objekte, die zeitweise 90% der Memcache-Anfragen erhalten. Mir ist auch aufgefallen, dass, wenn so viele Anfragen auf ein einzelnes Objekt treffen, die Ladezeit der gesamten Seite etwas länger wird (wenn sie es schafft zu laden).

Ich wäre für jede Hilfe zu diesem Problem sehr dankbar. Vielen Dank!

7voto

Regan W Punkte 641

Wechseln Sie von der Verwendung von TCP-Sockets zu UNIX-Sockets (vorausgesetzt, Sie arbeiten auf einem Unix-basierten Server)

Starten Sie memcached mit einem aktivierten Socket: hinzufügen -s /tmp/memcached.socket in die Startzeile von memcached einfügen (Achtung, Sockets deaktiviert die Netzwerkunterstützung)

Verbinden Sie sich dann in PHP über persistente Verbindungen und mit dem neuen Memcache-Socket:

$memcache_obj = new Memcache;
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0);

Eine weitere Empfehlung: Wenn Sie mehrere "Typen" von zwischengespeicherten Objekten haben, starten Sie eine Memcached-Instanz für jeden "Typ" und verteilen Sie Ihre heißen Objekte auf diese.

Drupal tut dies, Sie können sehen, wie ihre Konfigurationsdatei und memcached init eingerichtet ist aquí .

Außerdem hört es sich für mich so an, als ob Ihr Memcached-Timeout VIEL zu hoch eingestellt ist. Wenn es irgendetwas über 1 oder 2 Sekunden ist, können Sie Skripte zu sperren. Die Zeitüberschreitung sollte erreicht sein, und das Skript sollte das Objekt standardmäßig über eine andere Methode abrufen (SQL, Datei usw.)

Wenn Ihr Cache kleiner ist als Ihr durchschnittlicher freier Speicherplatz, versuchen Sie, memcache mit der Option -k zu starten. Dadurch wird der Cache gezwungen, immer im Speicher zu bleiben und kann nicht ausgelagert werden.

Wenn Sie einen Multi-Core-Server haben, stellen Sie auch sicher, dass memcached mit Thread-Unterstützung kompiliert ist, und aktivieren Sie diese mit -t <numcores>

1voto

Dustin Punkte 85400

600 Anfragen pro Sekunde sind für Memcached ausgesprochen wenig.

Wenn Sie bei jeder Anfrage eine Verbindung aufbauen, verbringen Sie mehr Zeit mit dem Aufbau der Verbindung als mit der Abfrage und verbrauchen Ihre ephemeren Ports sehr schnell, was das Problem sein könnte, das Sie sehen.

0voto

Jon Skarpeteig Punkte 4058

Es gibt ein paar Dinge, die Sie versuchen könnten:

  • Wenn Sie memcached lokal laufen haben, können Sie den benannten Socket 'localhost' anstelle von '127.0.0.1' verwenden
  • Dauerhafte Verbindungen verwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X