Wir haben eine PHP-Image-API, die in Code Igniter geschrieben wurde und auf Imagemagic basiert. Wir haben die API hinter nginx/php-fpm. Wir wissen, dass der Imagemagic-Teil schwer ist, aber wir versuchen, den Gesamtdurchsatz immer weiter zu steigern.
Wir haben mehr als 30 Optimierungsartikel zu Nginx durchgearbeitet. Wir konnten die Ausgabe von 300 Anfragen/Minute auf 350 Anfragen/Minute steigern, indem wir die Artikel größtenteils befolgten und TCP-Optimierungen durchführten.
Dadurch haben wir die Serverladezeit erheblich beeinträchtigt. Ich kann Ihnen keine Durchschnittslast nennen, da es sich um eine neue Box handelt und sie auf Nginx basiert. Früher hatten wir Apache-Worker (weniger als 300 Anfragen/Minute). Jetzt haben wir mit 350 Anfragen/Minute eine Durchschnittslast von 20. Das ist viel zu viel und wir wollen uns verbessern.
Wenn wir htop verwenden, um die Prozesse zu untersuchen, sehen wir normalerweise etwa 20 Prozesse von php-fpm, die alle 16 CPUs stark beanspruchen, und der Speicher liegt bei etwa 2 GB von 24 GB.
Unser Ziel ist es, die Systemlast drastisch zu reduzieren. Ich möchte, dass erfahrene Benutzer ihr Wissen teilen, wo sie suchen und was sie versuchen sollten. Ich werde alle Zahlen veröffentlichen, die Sie anfordern, aber ich wollte den Beitrag am Anfang nicht damit füllen.
Wie würden Sie vorgehen, um die Systemlast zu reduzieren und dennoch den Durchsatz beizubehalten?
Antwort1
Da wir festgestellt haben, dass dies ein reines CPU-Problem ist (kein iowait), sehe ich wirklich keine Möglichkeit, den gleichen Durchsatz beizubehalten, ohne weitere Ressourcen hinzuzufügen. Reduzieren Sie entweder die maximale Anzahl von PHP-Prozessen oder fügen Sie weitere CPU-Kerne hinzu.
Oder bringen Sie die Entwickler dazu, etwas anderes als ImageMagick zu verwenden.
Antwort2
Wenn Sie wiederholte Anfragen haben, können Sie den FastCGI-Cache überprüfen (http://wiki.nginx.org/HttpFastcgiModule) oder verwenden Sie Varnish vor Nginx.
Dadurch können Sie die verarbeiteten Bilder zwischenspeichern und müssen die CPU-lastigen Prozesse nicht erneut ausführen.
Antwort3
Da Ihre Frage besagt, dass PHP-FPM-Prozesse in der TOP-CPU ausgeführt werden, gehe ich davon aus, dass Sie ImageMagick-PHP-Bibliotheken verwenden (http://php.net/imagick).
Bitten Sie Ihre Entwickler, das Szenario zu testen, in dem die Bildverarbeitung direkt durch die ImageMagick-Binärdatei durchgeführt wird (z. B. /usr/bin/[vergleichen, importieren, anzeigen …].
Wenn die direkte Verwendung der Binärdatei funktioniert, verwenden Sie die PHP-Funktion exec() und kapseln Sie den Aufruf der ImageMagick-Binärdateien ein und sehen Sie, wie das funktioniert (hinsichtlich CPU und Dauer).
@zusätzliche Information:https://stackoverflow.com/questions/4323672/wie-bekomme-ich-imagemagick-installiert
Antwort4
Entwicklerwege
- Versuchen Sie, den PHP-Overhead für die Bildverarbeitung zu verringern.
- Versuchen Sie, weniger Ressourcen für die Bildverarbeitung zu verwenden. Verwenden Sie vorbereitete Bilder oder ändern Sie einige Vorgänge mit geringeren Leistungsanforderungen
Admin-Weg
- Verwenden Sie leistungsstärkere CPUs