Estoy actualizando un sistema de PHP 5.5 (instalado directamente en AWS EC2) a PHP 7.4 en Docker (que se ejecuta en AWS EC2 usando Docker Compose). El rendimiento para cambiar el tamaño de imágenes usando ImageMagick ha disminuido mucho.
Guión de prueba
Para diagnosticar el problema, creé el siguiente script simple, con un archivo JPEG de 5 MB como entrada:
<?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();
Mediciones
Según mis mediciones, parece que las resizeImage()
llamadas y getImageBlob()
toman la mayor parte del tiempo de ejecución, como se esperaba. Ejecuté este script 5 veces en el sistema antiguo y nuevo (a través de nginx con php-fpm) y encontré los siguientes tiempos de ejecución promedio:
- Sistema antiguo (PHP 5.5): 2,5 segundos promedio
- Nuevo sistema (PHP 7.4 en Docker): 14,8 segundos de media
En otras palabras, la configuración de PHP 7.4 es6 veces más lentoque la antigua configuración PHP 5.5! (Los tiempos se midieron desde el script PHP, por lo que nginx/php-fpm no debería haber influido).
Para otros tipos de solicitudes, la nueva configuración funciona bien (un poco más rápida que la anterior, como se puede esperar de PHP 7). Ambos sistemas utilizan el mismo tipo de instancias EC2 y no se configuran limitaciones de recursos explícitas para el contenedor Docker en el nuevo sistema. Por lo tanto, no esperaría que este cambio de tamaño fuera más lento que antes.
¿Alguien tiene una idea de qué podría causar esto y, lo que es más importante, cómo se puede mejorar el rendimiento en el nuevo sistema?
Uso del sistema
El sistema antiguo estaba en uso mientras se ejecutaba el script de prueba, pero tenía mucha CPU/memoria disponible. Mientras ejecutaba el script de prueba, su uso de CPU fue >300% (según top
).
El nuevo sistema no se utilizó mientras se ejecutaba el script de prueba, por lo que también tenía suficiente CPU/memoria disponible. Sin embargo, aquí el uso de la CPU solo aumentó entre 150% y 180%, según top
y docker stats
.
Configuración
Antiguo sistema
En el sistema antiguo (que usaba la versión 1 de la AMI de Amazon Linux x64), PHP se configuró de la siguiente manera:
sudo yum install php55-pecl-imagick ...
Y muestra la siguiente información:
$ 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
Nuevo sistema
El nuevo sistema utiliza Docker ( sudo yum install docker
en x64 Amazon Linux 2) con el siguiente Dockerfile para el contenedor PHP:
FROM php:7.4-fpm
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions imagick
(El mismo problema de rendimiento se presentó al instalar la extensión PHP imagick
y libmagickwand-dev
manualmente, sin mlocati/php-extension-installer
.)
Esto proporciona la siguiente información:
$ 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
Respuesta1
Pude solucionar el problema utilizando las php:alpine
imágenes en su lugar.
La causa exacta aún no está clara; consulte el siguiente problema para obtener más detalles:https://github.com/docker-library/php/issues/1100