Heim  >  Artikel  >  Backend-Entwicklung  >  Die Auswirkungen der neuen JIT-Funktionen von PHP 8 auf die Leistung von PHP-Anwendungen

Die Auswirkungen der neuen JIT-Funktionen von PHP 8 auf die Leistung von PHP-Anwendungen

藏色散人
藏色散人nach vorne
2020-10-30 16:25:105597Durchsuche

Empfohlen: „PHP8-Tutorial

Vorwort

Die neue Funktion, die im kommenden PHP 8 die meiste Aufmerksamkeit auf sich zieht, ist die Einführung der Unterstützung für JIT. Ich habe kurz vorgestellt, was JIT ist und den Unterschied zu Opcache. Hier ist eine kurze Zusammenfassung:

  • JIT basiert auf Opcache-Optimierung in Kombination mit Laufzeitinformationen, um Bytecode in Maschinencode zu kompilieren und zwischenzuspeichern.
  • Die vorhandene Opcache-Optimierung wird in keiner Weise beeinträchtigt, und PHPs JIT wird im Opcache bereitgestellt
  • JIT ist kein Ersatz für Opcache, sondern eine Erweiterung. Wenn JIT aktiviert ist, kann die unterste Ebene von Zend feststellen, dass ein bestimmter Bytecode in Maschinencode kompiliert wurde, und so die CPU den Maschinencode direkt ausführen lassen Verbesserung der Codeleistung.

Es scheint sehr hochwertig zu sein, aber JIT ist hauptsächlich für CPU-intensive Vorgänge optimiert, und die aktuellen Mainstream-PHP-Webanwendungen sind alle E/A-intensive Vorgänge. Das in PHP 8 eingeführte JIT hat also die Leistung dieser Webanwendungen verbessert Anwendungen? Wollstoff? Zu diesem Zweck haben wir speziell die Alpha-Version von PHP 8 kompiliert und installiert und einfache Benchmark-Tests an Befehlszeilenanwendungen (CPU-intensive Vorgänge) und Laravel-Anwendungen (IO-intensive Vorgänge) durchgeführt, um dies herauszufinden.

Bereiten Sie eine virtuelle Ubuntu-Maschine vor

Hinweis: PHPs JIT kann nur unter der X86-Architektur wirksam werden, sodass PC-, Mac- und Linux-Umgebungen mit Intel-CPUs es alle unterstützen können.

Da PHP 8 noch nicht offiziell veröffentlicht wurde, können Sie nur den Quellcode herunterladen, kompilieren und installieren und müssen daher eine Linux-Umgebung als Testumgebung vorbereiten. Viele Studenten sagten mir, dass sie den Betriebsprozess unter Windows nicht demonstriert hätten, deshalb habe ich mich heute speziell dafür entschieden, Ubuntu 18.04 über WSL in Windows 10 Professional Edition als Demonstrationsumgebung zu installieren. Dies ist viel einfacher als die Installation einer virtuellen Maschine über Virtual Box oder VMWare Ich muss sagen, dass es ab Windows 10 immer freundlicher für Entwickler geworden ist, obwohl es immer noch einen gewissen Abstand zum Mac gibt. Schließlich ist Mac ein natives Unix-ähnliches System.

Zurück zum Geschäft, installieren Sie die WSL-Version der virtuellen Ubuntu-Maschine: Windows-Subsystem für Linux-Installationshandbuch für Windows 10 Es ist sehr einfach Speichern, Sie können auf die Schaltfläche „Start“ klicken, um die virtuelle Ubuntu-Maschine zu starten:

Die Benutzeroberfläche nach dem Öffnen sieht folgendermaßen aus und ähnelt einem Terminalfenster:

Die Verwendung dieser virtuellen Maschine ist einfacher als Das einer herkömmlichen virtuellen Maschine. Sie können beispielsweise Windows-Hostprogramme direkt aufrufen, z. B. VS-Code. Auf Webanwendungen, die von Nginx in der virtuellen Maschine verwaltet werden, kann auch direkt über den Windows-Hostbrowser zugegriffen werden, ohne dass eine Portzuordnung konfiguriert werden muss Als lokaler Linux-Test und -Entwicklung Die Umgebung ist sehr praktisch.

Wenn Sie nichts Neues ausprobieren möchten, können Sie natürlich eine herkömmliche virtuelle Maschine oder das native Ubuntu-System verwenden.

Demo-Projektinitialisierung

Als nächstes müssen wir Nginx, PHP und Composer über das oben geöffnete Terminalfenster in dieser virtuellen Ubuntu-Maschine installieren. Dies kann mit den folgenden Befehlen erfolgen:

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

Dann über Composer Install the Laravel-Webprojekt zur Demonstration im Nginx-Standard-Webstammverzeichnis /var/www (der globale Composer-Spiegel kann konfiguriert werden, wenn die Download-Geschwindigkeit langsam ist): /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
Nachdem die Initialisierung abgeschlossen ist, können Sie dies tun pass php artisan Serve Testen Sie, ob der Zugriff auf dieses Projekt normal ist. Es wird hier nicht demonstriert. 🎜🎜🎜Kompilieren und installieren Sie die PHP 8-Testversion🎜🎜🎜Nach Abschluss der oben genannten Vorbereitungen können Sie mit dem Kompilieren und Installieren der PHP 8-Testversion beginnen. Zuerst laden wir den Quellcode der PHP 8-Testversion von Github herunter (der Download der Das Quellcodepaket der offiziellen PHP-Website ist zu langsam):🎜
cd /usr/local/php8/etc
sudo cp php-fpm.conf.default php-fpm.conf
🎜Entpacken Sie das Quellcode-Stammverzeichnis und geben Sie es ein:🎜
pid = /run/php/php8.0-fpm.pid
🎜Starten Sie den Kompilierungs- und Installationsprozess:🎜
cd php-fpm.d
sudo cp www.conf.default www.conf
🎜Nachdem der letzte Schritt erfolgreich ausgeführt wurde, wird ein Eingabeaufforderungstext angezeigt dass PHP 8 erfolgreich installiert wurde. Sie können die erfolgreiche Installation auch mit dem folgenden Befehl überprüfen:🎜🎜 🎜🎜Derzeit ist PHP 8 in /usr /local/php8 diesem Verzeichnis installiert. 🎜🎜🎜Initialisierungskonfigurationsdatei🎜🎜🎜Kompilieren und installieren Sie PHP 8. Sie müssen die Konfigurationsdatei selbst kopieren und festlegen. Wir kopieren zunächst die Basiskonfigurationsdatei php.ini aus dem Quellcodeverzeichnis PHP-Installationsverzeichnis: 🎜
user = www-data
group = www-data

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

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
🎜Da JIT in der Opcache-Erweiterung bereitgestellt wird, müssen Sie diese Erweiterung zuerst starten, /usr/local/php8/php.ini öffnen und die folgenden Konfigurationselemente auskommentieren ( Löschen Sie die vorherigen Punkte) Nummer): 🎜
/usr/local/php8/bin/php -d opcache.jit_buffer_size=0 Zend/bench.php
🎜Dann initialisieren Sie die PHP-FPM-Konfigurationsdatei. 🎜🎜Kopieren Sie zunächst die Binärdatei php8.0-fpm in das Verzeichnis /etc/init.d (immer noch in php-8.0.0alpha2). Betrieb im Quellcodeverzeichnis): 🎜
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(每秒处理请求数):

Die Auswirkungen der neuen JIT-Funktionen von PHP 8 auf die Leistung von PHP-Anwendungen

最后,在 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 表示超时时间。

运行结果如下:

Die Auswirkungen der neuen JIT-Funktionen von PHP 8 auf die Leistung von PHP-Anwendungen

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

小结

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

Das obige ist der detaillierte Inhalt vonDie Auswirkungen der neuen JIT-Funktionen von PHP 8 auf die Leistung von PHP-Anwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:xueyuanjun.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen