Estou atualizando algum sistema do PHP 5.5 (instalado diretamente no AWS EC2), para o PHP 7.4 no Docker (rodando no AWS EC2 usando Docker Compose). O desempenho para redimensionamento de imagens usando ImageMagick diminuiu muito.
Roteiro de teste
Para diagnosticar o problema, criei o seguinte script simples, com um 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();
Medidas
Pelas minhas medições, parece que as resizeImage()
chamadas getImageBlob()
e levam a maior parte do tempo de execução, conforme esperado. Executei esse script 5 vezes no sistema antigo e no novo (através do nginx com php-fpm) e encontrei os seguintes tempos médios de execução:
- Sistema antigo (PHP 5.5): média de 2,5 segundos
- Novo sistema (PHP 7.4 no Docker): média de 14,8 segundos
Em outras palavras, a configuração do PHP 7.4 é6 vezes mais lentodo que a antiga configuração do PHP 5.5! (Os tempos foram medidos no script PHP, portanto, nginx/php-fpm não deveria ter desempenhado um papel.)
Para outros tipos de solicitações, a nova configuração está funcionando bem (um pouco mais rápida que a antiga, como pode ser esperado no PHP 7). Ambos os sistemas usam o mesmo tipo de instâncias EC2 e nenhuma limitação explícita de recursos é configurada para o contêiner Docker no novo sistema. Portanto, eu não esperaria que esse redimensionamento fosse mais lento do que antes.
Alguém tem alguma ideia do que poderia causar isso e, mais importante, como o desempenho pode ser melhorado no novo sistema?
Uso do sistema
O sistema antigo estava em uso durante a execução do script de teste, mas tinha bastante CPU/memória disponível. Durante a execução do script de teste, o uso da CPU foi superior a 300% (de acordo com top
).
O novo sistema não foi utilizado durante a execução do script de teste, portanto também tinha bastante CPU/memória disponível. No entanto, aqui o uso da CPU subiu apenas para 150-180%, de acordo com top
e docker stats
.
Configurar
Sistema antigo
No sistema antigo (usando x64 Amazon Linux AMI versão 1), o PHP era configurado da seguinte forma:
sudo yum install php55-pecl-imagick ...
E mostra as seguintes informações:
$ 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
Novo sistema
O novo sistema usa Docker ( sudo yum install docker
no x64 Amazon Linux 2) com o seguinte Dockerfile para o contêiner PHP:
FROM php:7.4-fpm
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions imagick
(O mesmo problema de desempenho estava presente ao instalar a extensão PHP imagick
e libmagickwand-dev
manualmente, sem mlocati/php-extension-installer
.)
Isso fornece as seguintes informações:
$ 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
Responder1
Consegui contornar o problema usando as php:alpine
imagens.
A causa exata ainda não está clara. Consulte o seguinte problema para obter mais detalhes:https://github.com/docker-library/php/issues/1100