測試腳本

測試腳本

我正在將某些系統從 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()佔用了大部分執行時間,正如預期的那樣。我已經在新舊系統上執行這個腳本 5 次(透過 nginx 和 php-fpm),發現平均執行時間如下:

  • 舊系統(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

新系統

新系統使用 Docker(sudo yum install docker在 x64 Amazon Linux 2 上)以及用於 PHP 容器的以下 Dockerfile:

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

相關內容