>  기사  >  백엔드 개발  >  PHP 8의 새로운 기능 JIT가 PHP 애플리케이션 성능에 미치는 영향

PHP 8의 새로운 기능 JIT가 PHP 애플리케이션 성능에 미치는 영향

藏色散人
藏色散人앞으로
2020-10-30 16:25:105597검색

추천: "PHP8 Tutorial"

머리말

곧 출시될 PHP 8에서 가장 주목받는 새로운 기능은 JIT 지원 도입입니다. JIT가 무엇인지, Opcache와의 차이점을 간략하게 소개했습니다. 간략한 요약은 다음과 같습니다.

  • JIT는 바이트코드를 기계 코드로 컴파일하고 캐시하기 위해 런타임 정보와 결합된 Opcache 최적화를 기반으로 합니다.
  • 기존 Opcache 최적화는 어떤 식으로든 영향을 받지 않으며 PHP의 JIT는 Opcache에 있습니다.
  • 제공된 JIT는 Opcache를 대체하는 것이 아니라 향상된 기능입니다. JIT를 활성화하면 Zend 하위 계층에서 특정 바이트 코드가 기계어 코드로 컴파일된 것을 발견하면 Zend VM을 우회하고 CPU가 기계어 코드를 직접 실행할 수 있습니다. 코드 성능 향상.

매우 고급스러워 보이지만 JIT는 주로 CPU 집약적인 작업에 최적화되어 있으며 현재 주류 PHP 웹 애플리케이션은 모두 IO 집약적인 작업이므로 PHP 8에 도입된 JIT가 이러한 웹의 성능을 향상시켰습니까? 응용 프로그램? 이를 위해 특별히 PHP 8 Alpha 버전을 컴파일하고 설치했으며, 이를 알아보기 위해 명령줄 애플리케이션(CPU 집약적 작업)과 Laravel 애플리케이션(IO 집약적 작업)에 대해 간단한 벤치마크 테스트를 수행했습니다.

Ubuntu 가상 머신 준비

참고: PHP의 JIT는 X86 아키텍처에서만 적용될 수 있으므로 Intel CPU를 사용하는 PC, Mac 및 Linux 환경은 모두 이를 지원할 수 있습니다.

PHP 8은 아직 공식적으로 출시되지 않았기 때문에 소스코드를 다운로드하고 컴파일, 설치만 하면 되기 때문에 테스트 환경으로 Linux 환경을 준비해야 합니다. 많은 학생들이 Windows에서 작동 프로세스를 시연하지 못했다고 말했기 때문에 오늘은 데모 환경으로 Windows 10 Professional Edition에서 WSL을 통해 Ubuntu 18.04를 설치하기로 선택했습니다. 이는 Virtual Box 또는 VMWare를 통해 가상 머신을 설치하는 것보다 훨씬 간단합니다. , Windows 10부터 개발자에게 점점 더 친숙해 졌다고 말해야하지만 Mac과 비교하면 여전히 약간의 거리가 있습니다.

다시 돌아와서 Ubuntu 가상 머신의 WSL 버전을 설치하세요. Windows는 공식적으로 해당 문서를 제공합니다: Windows 10용 Linux 하위 시스템 설치 가이드 Windows에서 다운로드하고 설치하면 됩니다. 시작 버튼을 누르면 Ubuntu 가상 머신이 시작됩니다.

열고 나면 인터페이스는 다음과 같습니다. 터미널 창과 비슷해 보입니다.

이 가상 머신을 사용하는 경험은 다음보다 간단합니다. 예를 들어 VS Code와 같은 Windows 호스트 프로그램을 직접 호출할 수 있으며, 가상 머신에서 Nginx로 관리되는 웹 애플리케이션도 포트 매핑을 구성하지 않고 Windows 호스트 브라우저에서 직접 접근할 수 있으므로 사용됩니다. 로컬 Linux 테스트 및 개발 환경이 매우 편리합니다.

물론, 새로운 것을 시도하고 싶지 않다면 기존 가상 머신이나 기본 Ubuntu 시스템을 사용할 수 있습니다.

데모 프로젝트 초기화

다음으로 위에 열려 있는 터미널 창을 통해 이 Ubuntu 가상 머신에 Nginx, PHP 및 Composer를 설치해야 합니다.

sudo apt install nginx
sudo apt install php php-zip php-mbstring
sudo apt install composer

그런 다음 Composer를 통해 설치합니다. Nginx 기본 웹 루트 디렉터리 /var/www에서 시연하기 위한 Laravel 웹 프로젝트(다운로드 속도가 느린 경우 Composer 전역 미러를 구성할 수 있음): /var/www 目录下安装用于演示的 Laravel Web 项目(下载速度慢可以配置 Composer 全局镜像):

sudo composer create-project --prefer-dist laravel/laravel blog 6.* -vvv

初始化完成后,可以通过 php artisan serve 测试下这个项目访问是否正常。这里就不演示了。

编译安装 PHP 8 测试版

完成上述准备工作后,就可以开始 PHP 8 测试版本的编译安装了,首先,我们从 Github 下载 PHP 8 测试版本源码(PHP 官网源码包下载太慢):

wget https://github.com/php/php-src/archive/php-8.0.0alpha2.tar.gz

解压并进入源码根目录:

tar zxvf php-8.0.0alpha2.tar.gz
cd php-8.0.0alpha2

开始编译安装流程:

// 1、安装相关依赖库
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev \
libsqlite3-dev libssl-dev libcurl4-openssl-dev libpng-dev libonig-dev libzip-dev

// 2、生成 configure 文件
./buildconf --force

// 3、配置构建流程
./configure --prefix=/usr/local/php8 \
--with-config-file-path=/usr/local/php8 \
--enable-mbstring  \
--enable-ftp  \
--enable-gd   \
--enable-mysqlnd \
--enable-pdo   \
--enable-sockets   \
--enable-fpm   \
--enable-xml  \
--enable-soap  \
--enable-pcntl   \
--enable-cli   \
--enable-json  \
--enable-tokenizer \
--enable-ctype \
--enable-bcmath  \
--with-openssl  \
--with-pear   \
--with-zlib  \
--with-iconv  \
--with-curl  \
--with-zip

// 4、构建
make

// 5、安装
sudo make install

最后一步执行成功后,会有 PHP 8 安装成功的提示文本,你也可以通过如下命令验证安装成功:

当前 PHP 8 被安装到了 /usr/local/php8 这个目录下。

初始化配置文件

编译安装的 PHP 8 需要自行拷贝和设置配置文件,我们首先将基础配置文件 php.ini 从源代码目录拷贝到 PHP 的安装目录:

sudo cp php.ini-production /usr/local/php8/php.ini

由于 JIT 是在 Opcache 扩展中提供的,所以需要先启动这个扩展,打开 /usr/local/php8/php.ini,取消对如下配置项的注释(删除前面的分号即可):

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

然后来初始化 PHP-FPM 的配置文件。

先把 php8.0-fpm 二进制文件拷贝到 /etc/init.d 目录下(还是在 php-8.0.0alpha2

sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php8.0-fpm
sudo chmod +x /etc/init.d/php8.0-fpm
초기화가 완료된 후 다음을 수행할 수 있습니다. pass php artisan Serve 이 프로젝트에 대한 접근이 정상적인지 테스트합니다. 여기서는 설명하지 않습니다. 🎜🎜🎜PHP 8 테스트 버전 컴파일 및 설치🎜🎜🎜위의 준비가 완료되면 PHP 8 테스트 버전 컴파일 및 설치를 시작할 수 있습니다. 먼저 Github에서 PHP 8 테스트 버전 소스 코드를 다운로드합니다. PHP 공식 웹사이트 소스 코드 패키지가 너무 느립니다.) :🎜
cd /usr/local/php8/etc
sudo cp php-fpm.conf.default php-fpm.conf
🎜압축을 풀고 소스 코드 루트 디렉터리를 입력하세요:🎜
pid = /run/php/php8.0-fpm.pid
🎜컴파일 및 설치 프로세스를 시작하세요:🎜
cd php-fpm.d
sudo cp www.conf.default www.conf
🎜마지막 단계가 성공적으로 실행되면 프롬프트 텍스트가 표시됩니다. 다음 명령을 통해 PHP 8이 성공적으로 설치되었는지 확인할 수도 있습니다. .jpg" alt=""/>🎜🎜현재 PHP 8은 /usr /local/php8 이 디렉터리에 설치되어 있습니다. 🎜🎜🎜초기화 구성 파일🎜🎜🎜PHP 8을 컴파일하고 설치합니다. 구성 파일을 직접 복사하고 설정해야 합니다. 먼저 소스 코드 디렉터리에서 기본 구성 파일 php.ini를 복사합니다. PHP 설치 디렉터리: 🎜
user = www-data
group = www-data

listen = /run/php/php8.0-fpm.sock

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
🎜Opcache 확장에서 JIT가 제공되므로 먼저 이 확장을 시작하고 /usr/local/php8/php.ini를 열고 다음 구성 항목의 주석 처리를 제거해야 합니다( 이전 포인트 삭제) 아니요.): 🎜
/usr/local/php8/bin/php -d opcache.jit_buffer_size=0 Zend/bench.php
🎜그런 다음 PHP-FPM 구성 파일을 초기화하세요. 🎜🎜먼저 php8.0-fpm 바이너리 파일을 /etc/init.d 디렉터리에 복사합니다(아직 php-8.0.0alpha2에 있음). 소스 코드 디렉토리에서 작동): 🎜
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php8.0-fpm
sudo chmod +x /etc/init.d/php8.0-fpm

进入 /usr/local/php8/etc 目录,初始化 PHP-FPM 配置文件:

cd /usr/local/php8/etc
sudo cp php-fpm.conf.default php-fpm.conf

通过 vim 编辑器打开 php-fpm.conf,修改如下配置项(同时取消前面的分号注释):

pid = /run/php/php8.0-fpm.pid

然后进入当前目录下的 php-fpm.d 子目录:

cd php-fpm.d
sudo cp www.conf.default www.conf

打开 www.conf,修改如下配置项(同时取消前面的分号注释):

user = www-data
group = www-data

listen = /run/php/php8.0-fpm.sock

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

命令行应用基准测试

完成上述准备工作后,就可以正式开始测试工作了。

首先,我们来测试命令行应用,PHP 官方在源码中提供了一个基准测试文件,我们进入源码所在目录 php-8.0.0alpha2,通过如下命令测试不启动 JIT 情况下代码运行情况:

/usr/local/php8/bin/php -d opcache.jit_buffer_size=0 Zend/bench.php

运行结果如下(运行时间,单位为 s):

然后,再通过下面这条命令测试启动 JIT 的情况下命令行代码的运行情况:

/usr/local/php8/bin/php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php

注:关于 opcache.jit_buffer_size 配置项比较好理解,而 opcache.jit 配置项对应配置值的每个数字代表不同含义,具体可以参考鸟哥的这篇博客:PHP 8 新特性之 JIT 简介,里面讲得非常详细,一般对于命令行应用,将该配置值配置为 1205,对于 Web 应用,配置为 1235 或者 1255。

最终运行结果如下:

可以看到,在 CPU 密集型操作的命令行应用中,启用 JIT 与不启用相比,耗时降低了接近 60%,性能提升了 2 倍

Web 应用基准测试

接下来,我们以 Laravel 演示项目为例,演示 PHP Web 应用中启用 JIT 与不启用性能有没有提升。

启动 PHP-FPM:

sudo /etc/init.d/php8.0-fpm start

在 Nginx 中配置一个新的虚拟主机(/etc/nginx/sites-available/blog):

server {
    listen 80;
    server_name blog.test;
    root /var/www/blog/public;

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

然后进入 /etc/nginx/sites-enable 目录,创建这个虚拟主机的软连接:

sudo ln -s /etc/nginx/sites-available/blog blog

启动 Nginx:

sudo service nginx start

在 Windows 系统的 C:\Windows\System32\drivers\etc\hosts 文件中添加虚拟域名与主机地址的映射:

127.0.0.1 blog.test

此时可以在 Windows 宿主机中通过浏览器访问对应的 Laravel 项目,表示部署成功:

然后,我们还是在 Windows 中,通过 ab 命令对 blog.test 首页进行压力测试(此时尚未启用 JIT):

ab -n 10 -c 10 http://blog.test/

注:-n 表示总请求数,-c 表示最大并发请求数。

测试结果如下,重点关注 RPS(每秒处理请求数):

PHP 8의 새로운 기능 JIT가 PHP 애플리케이션 성능에 미치는 영향

最后,在 Ubuntu 虚拟机中,打开 PHP 8 的配置文件 /usr/local/php8/php.ini,在 Opcache 配置项下新增 JIT 配置:

opcache.jit=1235
opcache.jit_buffer_size=64M

配置完成后,重启 PHP-FPM 服务,再次回到 Windows 宿主机,通过 ab 命令对 http://blog.test 页面进行压力测试:

ab -n 10 -c 10 -s 60 http://blog.test/

注:-s 表示超时时间。

运行结果如下:

PHP 8의 새로운 기능 JIT가 PHP 애플리케이션 성능에 미치는 영향

可以看到在 IO 密集型操作的 Web 应用中,启用 JIT 与不启用相比,性能不但没有提升,反而有 10% 左右的损耗,至少在 Laravel 应用中是如此。

小结

当然,这里的测试仅限于的 Ubuntu 虚拟机环境(Windows WSL 版,配置是 8C8G),并且我也只是将 JIT 参数调整为官方建议的参数,没有做更多的对比测试,但是可以肯定的是 JIT 对 CPU 密集型操作优化效果很好,对 Web 应用性能是否有提升,取决于你的环境和配置的调优,因此 JIT 对 IO 密集型操作应用的性能优化效果有限,更适用于 CPU 密集型操作场景的性能优化,比如图像处理、机器学习等。

위 내용은 PHP 8의 새로운 기능 JIT가 PHP 애플리케이션 성능에 미치는 영향의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 xueyuanjun.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제