阿尔派Linux在Docker上使用Laravel速度慢的问题
只有在开发环境下,应用程序才非常卡顿。
我被分配到新的团队,这是我的第一印象。
虽然在正式环境下非常快,但开发环境却异常缓慢。
由于DX非常差,进行了调查后发现,据说从Alpine转换为CentOS后速度提升了大约3倍。
基准测试 (jī cè shì)
不管多么冗长的解释,总结起来就是“虽然不太清楚,但是我只知道用Docker运行的PHP异常地占用资源大”。
我并不是说这个应用程序的代码很重,而是因为在Docker上的Alpine Linux上运行的Laravel整体处理速度感觉很慢,所以我决定进行实际测量。
以下のPHPコードをAlpineとCentOSで動かして比較してみる。CentOSのDockerfileはPHP入れる処理だけなので省略。
<?php
ini_set('memory_limit', '-1');
function benchmark($i) {
if($i ==! 0) {
benchmark($i - 1);
}
function() { return sha1("test${i}");};
function() { return md5("test${i}");};
}
$time_start = microtime(true);
foreach (range(1, 10000) as $i) {
benchmark($i);
}
$time = microtime(true) - $time_start;
echo "{$time} sec";
コードの内容は至って簡単で、メモリ上限を無くし再帰的処理でハッシュを取得していくだけ。
/t/test docker run --rm -v /tmp/test/test.php:/test.php centos-php php /test.php
8.2858350276947 sec
/t/test docker run --rm -v /tmp/test/test.php:/test.php centos-php php /test.php
8.2832388877869 sec
/t/test docker run --rm -v /tmp/test/test.php:/test.php centos-php php /test.php
8.2994618415833 sec
/t/test docker run --rm -v /tmp/test/test.php:/test.php php:7.4.1-fpm-alpine php /test.php
8.1350269317627 sec
/t/test docker run --rm -v /tmp/test/test.php:/test.php php:7.4.1-fpm-alpine php /test.php
8.0924451351166 sec
/t/test docker run --rm -v /tmp/test/test.php:/test.php php:7.4.1-fpm-alpine php /test.php
8.0950059890747 sec
这似乎没有什么问题(事实上Alpine更快)
在Laravel框架中进行基准测试。
我会在下面附上实际使用Laravel进行测量时的结果。
因为准备工作繁琐,所以我们决定在开发环境中对我们公司的LP页面进行测量。
以下是alpine上的dockerfile
FROM php:7.3-fpm-alpine
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
RUN apk --no-cache update \
&& apk add --no-cache $PHPIZE_DEPS postgresql-dev libpng-dev libjpeg-turbo-dev icu-dev \
&& docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \
&& docker-php-ext-configure intl --enable-intl \
&& docker-php-ext-install exif pdo_pgsql gd intl opcache pcntl
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
WORKDIR /var/www/html
对于基于CentOS的Dockerfile,其内容如下所示。
FROM centos:7.5.1804
#locale 追加
RUN sed -i -e '/override_install_langs/s/$/,ja_JP.utf8/g' /etc/yum.conf
RUN curl -sL https://rpm.nodesource.com/setup_10.x | bash - \
&& yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
https://s3-ap-northeast-1.amazonaws.com/sen-infra/rpms/centos/7/x86_64/pgdg-centos10-10-2.noarch.rpm \
&& yum install -y postgresql10 \
nodejs \
zlib-devel \
glibc-common \
make \
libpng-devel \
cronie \
&& yum install -y --enablerepo=remi,remi-php73 \
php \
php-opcache \
php-mbstring \
php-pdo \
php-pecl-memcache \
php-pecl-memcached \
php-pecl-redis \
php-pecl-imagick \
php-mcrypt \
php-mysqlnd \
php-xml \
php-gd \
php-devel \
php-pgsql \
php-pecl-ssh2 \
php-process \
php-intl \
php-pear \
php-pecl-apcu \
php-pecl-apcu-bc \
php-pecl-zip \
php-fpm \
&& rm -rf /var/cache/yum/* \
&& yum clean all
COPY ./php-fpm.conf /etc/php-fpm.conf
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin \
&& mv /usr/local/bin/composer.phar /usr/local/bin/composer \
&& composer global require hirak/prestissimo
WORKDIR /var/www/html
CMD ["/usr/sbin/php-fpm","-F","-y","/etc/php-fpm.conf"]
由于这是一个LP页面,所以应该没有中间件或提供者(应该没有)。
首先从Alpine开始
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.392s
user 0m0.013s
sys 0m0.004s
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.392s
user 0m0.013s
sys 0m0.000s
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.409s
user 0m0.012s
sys 0m0.004s
平均大约为0.4秒。
就CentOS基础系统而言
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.064s
user 0m0.007s
sys 0m0.007s
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.062s
user 0m0.003s
sys 0m0.012s
yoshiken@yskn:~/Git/sen/album$ time curl localhost
real 0m0.052s
user 0m0.014s
sys 0m0.000s
大约在0.06秒左右。
よくわからん
写到这里,我突然想知道为什么作为一种性能更高的PHP版本,Alpine在与Laravel一起使用时会突然变慢。
调查显示,有许多人发现Alpine在速度方面存在问题,但是具体的解决方案和根本原因尚未明确。
[5.2] PHP-7 Docker容器中运行时响应时间较慢 · 问题 #12228 · laravel/framework
在Docker上,php – PHP7 + Laravel + Nginx的性能非常差 – Stack Overflow
据说Alpine中Python运行缓慢是由于Alpine的独特软件包引起的差异,但在PHP方面,在最初的基准测试时并没有明显差异。
我想说的话 (Wǒ shuō de huà)
在许多文章中,可以看到”使用Docker和Alpine快速进行环境搭建!”这样的句子,但请先稍等一下。
在本地环境下,不需要快速扩展,因此无论镜像大小有多大,都没有特别的问题。重要的是使用与框架和语言相匹配的优化环境。
如果在生产环境中使用容器运行,并且使用与开发相同的镜像(尤其是AlpineLinux),那么首先应该确认该镜像的有效性。
我认为应该进行与基于其他发行版的情况下的速度测试,以进行正确的技术选择。