Testskript

Testskript

Ich aktualisiere ein System von PHP 5.5 (direkt auf AWS EC2 installiert) auf PHP 7.4 in Docker (läuft auf AWS EC2 mit Docker Compose). Die Leistung bei der Größenänderung von Bildern mit ImageMagick hat stark nachgelassen.

Testskript

Um das Problem zu diagnostizieren, habe ich das folgende einfache Skript mit einem 5 MB großen JPEG als Eingabe erstellt:

<?php

$image_name = "imgbench.jpeg";
$image_size = 4000;
$image_quality = 50;

$image = new Imagick();
$image->readImage($image_name);
$image->stripImage();
$image->resizeImage($image_size, $image_size, Imagick::FILTER_LANCZOS, 1, true);
$image->setImageCompressionQuality($image_quality);
$image->setInterlaceScheme(Imagick::INTERLACE_JPEG);
$image_blob = $image->getImageBlob();

Messungen

Aus meinen Messungen geht hervor, dass die resizeImage()und getImageBlob()-Aufrufe erwartungsgemäß den Großteil der Ausführungszeit in Anspruch nehmen. Ich habe dieses Skript fünfmal auf dem alten und neuen System ausgeführt (über nginx mit php-fpm) und die folgenden durchschnittlichen Ausführungszeiten ermittelt:

  • Altes System (PHP 5.5): durchschnittlich 2,5 Sekunden
  • Neues System (PHP 7.4 in Docker): durchschnittlich 14,8 Sekunden

Mit anderen Worten, das PHP 7.4-Setup ist6 mal langsamerals das alte PHP 5.5-Setup! (Die Zeiten wurden innerhalb des PHP-Skripts gemessen, daher dürften nginx/php-fpm keine Rolle gespielt haben.)

Bei anderen Arten von Anfragen funktioniert das neue Setup einwandfrei (etwas schneller als das alte, wie man es von PHP 7 erwarten kann). Beide Systeme verwenden denselben Typ von EC2-Instanzen und für den Docker-Container im neuen System sind keine expliziten Ressourcenbeschränkungen eingerichtet. Daher würde ich nicht erwarten, dass diese Größenänderung langsamer als zuvor ist.

Hat jemand eine Idee, woran das liegen könnte und, noch wichtiger, wie die Leistung im neuen System verbessert werden kann?

Systemnutzung

Während der Ausführung des Testskripts war das alte System in Betrieb, hatte aber genügend CPU/Speicher zur Verfügung. Während der Ausführung des Testskripts stieg die CPU-Auslastung auf >300 % (laut top).

Das neue System war während der Ausführung des Testskripts unbenutzt und hatte daher auch viel CPU/Speicher zur Verfügung. Allerdings stieg die CPU-Auslastung hier laut und nur auf 150–180 top% docker stats.

Aufstellen

Altes System

Auf dem alten System (mit x64 Amazon Linux AMI Version 1) war PHP wie folgt eingerichtet:

sudo yum install php55-pecl-imagick ...

Und es zeigt die folgenden Informationen:

$ php -i
phpinfo()
PHP Version => 5.5.38

(...)

imagick

imagick module => enabled
imagick module version => 3.4.4
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator
Imagick compiled with ImageMagick version => ImageMagick 6.7.8-9 2016-06-22 Q16 http://www.imagemagick.org
Imagick using ImageMagick library version => ImageMagick 6.7.8-9 2016-06-22 Q16 http://www.imagemagick.org

Neues System

Das neue System verwendet Docker ( sudo yum install dockerauf x64 Amazon Linux 2) mit der folgenden Docker-Datei für den PHP-Container:

FROM php:7.4-fpm
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions imagick

(Dasselbe Leistungsproblem trat sowohl bei der Installation der PHP-Erweiterung imagickals auch libmagickwand-devmanuell ohne auf mlocati/php-extension-installer.)

Dies ergibt die folgenden Informationen:

$ docker-compose exec php php -i
phpinfo()
PHP Version => 7.4.13

(...)

imagick

imagick module => enabled
imagick module version => 3.4.4
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
Imagick compiled with ImageMagick version => ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Imagick using ImageMagick library version => ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org

Antwort1

Ich konnte das Problem umgehen, indem ich php:alpinestattdessen die Bilder verwendet habe.

Die genaue Ursache ist noch nicht klar. Weitere Einzelheiten finden Sie im folgenden Problem:https://github.com/docker-library/php/issues/1100

verwandte Informationen