AlpineLinux on Docker × Laravel이 느린 이야기
개발 환경 만 앱이 엄청 무겁다.
새로운 팀에 배속되어 최초의 감상입니다.
프로덕션에서는 엄청 빠르지만 개발 환경이 엄청 느리다.
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)를 사용하고 있다고 하는 상황이라면, 우선 일단 그 이미지의 타당성을 확인해야 할까.
다른 디스트리뷰션을 베이스로 한 경우와의 속도 계측을 해 올바른 기술 선정을 실시하는 것이 좋다고 생각하는 대로.
Reference
이 문제에 관하여(AlpineLinux on Docker × Laravel이 느린 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yoshiken/items/93d170b69d8cb8520bad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
긴 설명은 두고 있어 결론에서 말하면 "잘 모르지만 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)를 사용하고 있다고 하는 상황이라면, 우선 일단 그 이미지의 타당성을 확인해야 할까.
다른 디스트리뷰션을 베이스로 한 경우와의 속도 계측을 해 올바른 기술 선정을 실시하는 것이 좋다고 생각하는 대로.
Reference
이 문제에 관하여(AlpineLinux on Docker × Laravel이 느린 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yoshiken/items/93d170b69d8cb8520bad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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"]
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
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
여기까지 쓰고 있는데 왜 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)를 사용하고 있다고 하는 상황이라면, 우선 일단 그 이미지의 타당성을 확인해야 할까.
다른 디스트리뷰션을 베이스로 한 경우와의 속도 계측을 해 올바른 기술 선정을 실시하는 것이 좋다고 생각하는 대로.
Reference
이 문제에 관하여(AlpineLinux on Docker × Laravel이 느린 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yoshiken/items/93d170b69d8cb8520bad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(AlpineLinux on Docker × Laravel이 느린 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yoshiken/items/93d170b69d8cb8520bad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)