AlpineLinux on Docker × Laravel이 느린 이야기

11040 단어 alpine도커라라벨

개발 환경 만 앱이 엄청 무겁다.



새로운 팀에 배속되어 최초의 감상입니다.

프로덕션에서는 엄청 빠르지만 개발 환경이 엄청 느리다.

DX가 최악이었기 때문에 원인을 조사한 결과 Alpine에서 CentOS로 갈아타면 3배 정도 빨라졌다는 이야기입니다.






벤치마크



긴 설명은 두고 있어 결론에서 말하면 "잘 모르지만 docker로 움직이고 있는 php가 비정상적으로 무겁다"는 것만을 알 수 있었다.

이 애플리케이션 코드가 무겁다는 것은 아니고, Alpine Linux on Docker에서 움직이고 있는 Laravel이 전체적으로 처리가 느리다는 체감이 있었으므로 실제로 계측해 보았다.

아래의 PHP 코드를 Alpine과 CentOS에서 움직여 비교해 본다. CentOS의 Dockerfile은 PHP 넣는 처리뿐이므로 생략.

test.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 페이지이므로 미들웨어도 프로파이더도 끼지 않습니다.

우선 알파인에서
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.4sec

반대로 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.06sec 전후라고 하는 곳.

잘 모르겠다.



여기까지 쓰고 있는데 왜 PHP로서의 퍼포먼스가 위의 Alpine이 Laravel을 통해 급격히 느려질지 모르겠다.

조사한 느낌 Alpine이라고 느리다는 점에서는 여러가지 곤란한 사람이 발견되고 있지만, 구체적인 해결책, 근본 원인은 아직 해명되어 있지 않다.

[5.2] Slow response times running within a php-7 Docker container · Issue #12228 · laravel/framework

php - PHP7 + Laravel +Nginx is terribly slow on Docker - Stack Overflow

Alpine에서 Python이 느려지는 것은 Alpine의 독자적인 패키지에 의한 차이가 원인이 되고 있지만, PHP에서는 최초의 벤치마크의 시점에서는 큰 괴리가 없었다.
htps // 스페루세 r. 코 m / 쿠에 s 치온 s / 1219609 / why-s s-te-a-l-pine-do c-r-mae-o-r-50-s-u-r-chan 부츠 즈게

말하고 싶은 것



여러 기사에서 "Docker와 Alpine을 사용하여 폭속으로 환경 구축!!"이라는 문장을 보지만 일단 기다려달라.

로컬 환경에서는 급속한 스케일을 할 필요도 없기 때문에 이미지가 크지만 특히 문제는 없는 것이며, 중요한 것은 사용하는 프레임워크나 언어에 최적화된 환경이다.

만약, 프로덕션 환경에서 컨테이너 운용해 개발과 같은 이미지(특히 AlpineLinux)를 사용하고 있다고 하는 상황이라면, 우선 일단 그 이미지의 타당성을 확인해야 할까.
다른 디스트리뷰션을 베이스로 한 경우와의 속도 계측을 해 올바른 기술 선정을 실시하는 것이 좋다고 생각하는 대로.

좋은 웹페이지 즐겨찾기