一部のシステムを 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 の最新版は、こちらです。