テストスクリプト

テストスクリプト

一部のシステムを 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 回実行し (php-fpm を使用した nginx 経由)、平均実行時間は次のようになりました。

  • 旧システム(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)。

topテスト スクリプトの実行中は新しいシステムは使用されなかったので、CPU/メモリも十分に利用可能でした。ただし、およびによると、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 dockerでは、PHP コンテナ用に次の 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

(PHP 拡張機能をインストールした場合とimagick、を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

正確な原因はまだ明らかになっていません。詳細については次の問題を参照してください。参考: docker-library.php の最新版は、こちらです。

関連情報