테스트 스크립트

테스트 스크립트

일부 시스템을 PHP 5.5(AWS EC2에 직접 설치)에서 Docker의 PHP 7.4(Docker Compose를 사용하여 AWS EC2에서 실행)로 업그레이드하려고 합니다. ImageMagick을 사용한 이미지 크기 조정 성능이 많이 저하되었습니다.

테스트 스크립트

문제를 진단하기 위해 5MB JPEG를 입력으로 사용하여 다음과 같은 간단한 스크립트를 만들었습니다.

<?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();

측정

resizeImage()내 측정에 따르면 예상대로 및 getImageBlob()호출이 대부분의 실행 시간을 차지하는 것으로 보입니다 . 나는 이 스크립트를 이전 시스템과 새 시스템에서 (php-fpm을 사용하는 nginx를 통해) 5번 실행했고 다음과 같은 평균 실행 시간을 발견했습니다.

  • 기존 시스템(PHP 5.5): 평균 2.5초
  • 새로운 시스템(Docker의 PHP 7.4): 평균 14.8초

즉, PHP 7.4 설정은 다음과 같습니다.6배 느림이전 PHP 5.5 설정보다! (시간은 PHP 스크립트 내에서 측정되었으므로 nginx/php-fpm이 역할을 하지 않아야 합니다.)

다른 종류의 요청의 경우 제대로 수행되면 새 설정이 적용됩니다(PHP 7에서 예상할 수 있듯이 이전 설정보다 약간 빠릅니다). 두 시스템 모두 동일한 유형의 EC2 인스턴스를 사용하며 새 시스템의 Docker 컨테이너에 대해 명시적인 리소스 제한이 설정되지 않습니다. 따라서 이 크기 조정이 이전보다 느려질 것이라고는 예상하지 않습니다.

이 문제의 원인이 무엇인지, 더 중요하게는 새 시스템에서 성능을 어떻게 향상시킬 수 있는지 아는 사람이 있습니까?

시스템 사용량

테스트 스크립트를 실행하는 동안 이전 시스템이 사용 중이었지만 사용 가능한 CPU/메모리가 충분했습니다. 테스트 스크립트를 실행하는 동안 CPU 사용량이 300% 이상으로 증가했습니다(에 따르면 top).

테스트 스크립트를 실행하는 동안 새 시스템은 사용되지 않았으므로 사용 가능한 CPU/메모리도 충분했습니다. 그러나 top및 에 따르면 여기서 CPU 사용량은 150~180%까지만 증가했습니다 docker stats.

설정

기존 시스템

이전 시스템(x64 Amazon Linux AMI 버전 1 사용)에서는 PHP가 다음과 같이 설정되었습니다.

sudo yum install php55-pecl-imagick ...

그리고 다음 정보가 표시됩니다.

$ 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

새로운 시스템

새 시스템은 sudo yum install dockerPHP 컨테이너에 대해 다음 Dockerfile과 함께 Docker(x64 Amazon Linux 2)를 사용합니다.

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

imagick(PHP 확장 프로그램을 설치하지 않고 libmagickwand-dev수동으로 설치할 때도 동일한 성능 문제가 발생했습니다 mlocati/php-extension-installer.)

이는 다음 정보를 제공합니다.

$ 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

답변1

대신 이미지를 사용하여 문제를 해결할 수 있었습니다 php:alpine.

정확한 원인은 아직 명확하지 않습니다. 자세한 내용은 다음 문제를 참조하세요.https://github.com/docker-library/php/issues/1100

관련 정보