我正在使用 ImageMagick 版本 7 中的 kmeans 功能。
time convert in.png -kmeans 20 out.png
这个命令在我的机器上完成得相当快(
1.7s
)
但是,当在 docker 中运行时,速度要慢得多(
48.8s
)。
我在同一台机器上尝试过 docker,也在 AWS Lambda 中尝试过 docker。我使用什么类型的图像似乎也不重要。 docker 内到处都是同样慢的速度。
我正在使用这个 docker:
FROM amazon/aws-lambda-nodejs:20.2024.02.07.18 as build
并通过源代码编译 ImageMagic 7(因为只有 ImageMagick 版本 6
可以通过 AmazonLinux2023 上的 dnf
作为软件包使用)。
我编译 ImageMagick 时可能做错了什么吗?缺少库或某种优化?
这是在 docker 中运行的 ImageMagick 版本:
bash-5.2# convert -version
Version: ImageMagick 7.1.1-29 Q16-HDRI x86_64 cfc71f0aa:20240225 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI
Delegates (built-in): bzlib fontconfig freetype jng jpeg lzma png xml zlib
Compiler: gcc (11.4)
这是直接在我的机器上运行的速度更快的 ImageMagick:
Version: ImageMagick 7.1.1-25 Q16-HDRI aarch64 21883 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(5.0)
Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib zstd
Compiler: gcc (4.2)
为了在 Docker 中编译 ImageMagick,我使用了这种方法:
FROM amazon/aws-lambda-nodejs:20.2024.02.07.18 as build
RUN dnf -y update && dnf install -y g++ gdb ninja-build gcc cpp cmake make automake autoconf chkconfig pkgconfig clang clang-libs gcc-c++ dos2unix bzip2 bzip2-libs zlib-devel libpng libpng-tools libpng-devel openjpeg2 openjpeg2-tools openjpeg2-devel libwebp-devel giflib-devel fftw-libs fontconfig-devel libtool xz xz-libs tar bc && dnf clean all
ADD build /root/build
RUN /root/build/imagemagick.sh
使用此构建脚本:
#!/usr/bin/env bash
set -e
# libjpg
cd /root
curl https://github.com/winlibs/libjpeg/archive/refs/tags/libjpeg-9c.tar.gz -L -o tmp-libjpeg.tar.gz
tar xf tmp-libjpeg.tar.gz
cd libjpeg*
dos2unix *
dos2unix -f configure
chmod +x configure
PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
./configure \
CPPFLAGS=-I/root/build/cache/include \
LDFLAGS=-L/root/build/cache/lib \
--disable-dependency-tracking \
--disable-shared \
--enable-static \
--prefix=/root/build/cache
dos2unix -f libtool
make
make install
# libpng
cd /root
curl http://prdownloads.sourceforge.net/libpng/libpng-1.6.37.tar.xz -L -o tmp-libpng.tar.xz
tar xf tmp-libpng.tar.xz
cd libpng*
PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
./configure \
CPPFLAGS=-I/root/build/cache/include \
LDFLAGS=-L/root/build/cache/lib \
--disable-dependency-tracking \
--disable-shared \
--enable-static \
--prefix=/root/build/cache
make
make install
# imagemagick
cd /root
curl https://github.com/ImageMagick/ImageMagick/archive/refs/tags/7.1.1-29.tar.gz -L -o tmp-imagemagick.tar.gz
tar xf tmp-imagemagick.tar.gz
cd ImageMagick*
PKG_CONFIG_PATH=/root/build/cache/lib/pkgconfig \
./configure \
CPPFLAGS=-I/root/build/cache/include \
LDFLAGS="-L/root/build/cache/lib -lstdc++" \
--disable-dependency-tracking \
--disable-shared \
--enable-static \
--prefix=/root/result \
--enable-delegate-build \
--disable-installed \
--without-modules \
--disable-docs \
--without-magick-plus-plus \
--without-perl \
--without-x \
--disable-openmp \
--with-openjp2=no \
--with-webp=no \
--with-tiff=no
make clean
make all
make install
*编辑:在读到它可以提高性能后,我也尝试在没有
disable-openmp
的情况下重新编译。使用和不使用该编译选项的时间相同。
这里有一些你可以尝试的事情...
在两台机器上运行以下命令,查看每个版本构建时使用的确切选项并比较输出:
identify -list configure
尝试构建 Q8 版本,看看是否更快:
./configure --with-quantum-depth=8 ...
尝试使用编译器优化并针对您机器的确切架构,具体取决于您的编译器:
./configure CFLAGS="-O3 -march=native" CPPFLAGS="-O3 -march=native" ...
尝试禁用 OpenCL:
./conigure --disable-opencl ...
检查您的 docker 配置文件,了解它为您的容器提供了多少 RAM 和多少 CPU 核心。