Maison  >  Article  >  développement back-end  >  L'impact des nouvelles fonctionnalités de PHP 8 JIT sur les performances des applications PHP

L'impact des nouvelles fonctionnalités de PHP 8 JIT sur les performances des applications PHP

藏色散人
藏色散人avant
2020-10-30 16:25:105586parcourir

Recommandé : "Tutoriel PHP8"

Avant-propos

La nouvelle fonctionnalité qui attire le plus l'attention dans le prochain PHP 8 est l'introduction du support JIT, j'ai brièvement présenté ce qu'est JIT et la différence avec Opcache. Voici un bref résumé :

  • JIT est basé sur l'optimisation Opcache et combiné avec les informations d'exécution pour compiler le bytecode en code machine. cached
  • L'optimisation Opcache existante n'est en aucun cas affectée et le JIT de PHP est fourni dans Opcache
  • JIT ne remplace pas Opcache, mais une amélioration, lorsque JIT est activé. Dans ce cas , si la couche inférieure de Zend découvre qu'un bytecode spécifique a été compilé en code machine, elle peut contourner Zend VM et laisser directement le CPU exécuter le code machine, améliorant ainsi les performances du code.

Cela semble très haut de gamme, mais JIT est principalement optimisé pour les opérations gourmandes en CPU, et les applications Web PHP grand public actuelles sont toutes des opérations gourmandes en E/S, donc le JIT introduit dans PHP 8 est très efficace pour ces sites Web Les performances de l'application ont-elles été améliorées ? À cette fin, nous avons spécialement compilé et installé la version PHP 8 Alpha et effectué des tests de référence simples sur les applications en ligne de commande (opérations gourmandes en CPU) et les applications Laravel (opérations gourmandes en IO) pour le savoir.

Préparez une machine virtuelle Ubuntu

Remarque : le JIT de PHP ne peut prendre effet que sous l'architecture X86, utilisez donc les environnements PC, Mac et Linux avec Intel CPU Tout peut être pris en charge.

Comme PHP 8 n'est pas encore officiellement publié, vous pouvez uniquement télécharger le code source, le compiler et l'installer, vous devez donc préparer un environnement Linux comme environnement de test. De nombreux étudiants m'ont dit qu'ils n'avaient pas démontré le processus de fonctionnement sous Windows, j'ai donc choisi aujourd'hui spécifiquement d'installer Ubuntu 18.04 via WSL dans Windows 10 Professional Edition comme environnement de démonstration. C'est beaucoup plus simple que d'installer une machine virtuelle via Virtual Box ou VMWare. , je dois dire qu'à partir de Windows 10, il est devenu de plus en plus convivial pour les développeurs, même s'il y a encore une certaine distance par rapport à Mac. Après tout, Mac est un système natif de type Unix.

Pour en revenir au sujet, Windows fournit officiellement les documents correspondants pour l'installation de la version WSL de la machine virtuelle Ubuntu : Guide d'installation du sous-système Windows pour Linux pour Windows 10, suivez-le simplement, c'est très simple, sous Windows Après le téléchargement et l'installation depuis le store, vous pouvez cliquer sur le bouton Démarrer pour démarrer la machine virtuelle Ubuntu :

L'interface après ouverture est comme ça, elle ressemble à une fenêtre de terminal :

L'expérience d'utilisation de cette machine virtuelle est plus simple que celle des machines virtuelles traditionnelles. Par exemple, vous pouvez appeler directement des programmes hôtes Windows, tels que. en tant que VS Code, et les gérer via Nginx dans la machine virtuelle. Les applications Web sont également accessibles directement à partir du navigateur hôte Windows sans configurer le mappage des ports, il est donc très pratique de les utiliser comme environnement de test et de développement Linux local.

Bien sûr, si vous ne voulez pas essayer quelque chose de nouveau, vous pouvez utiliser une machine virtuelle traditionnelle ou le système Ubuntu natif.

Initialisation du projet de démonstration

Ensuite, nous devons installer Nginx, ainsi que PHP et Composer dans cette machine virtuelle Ubuntu via la fenêtre de terminal ouverte ci-dessus, via ce qui suit Vous pouvez le faire avec la commande :

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

Ensuite, installez le projet Web Laravel pour démonstration dans le répertoire racine Web par défaut de Nginx /var/www via Composer (la vitesse de téléchargement est lente, vous pouvez configurer le miroir global de Composer) :

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

Une fois l'initialisation terminée, vous pouvez utiliser php artisan serve pour tester si l'accès à ce projet est normal. Cela ne sera pas démontré ici.

Compilez et installez la version de test de PHP 8

Après avoir terminé les préparatifs ci-dessus, vous pouvez commencer à compiler et à installer la version de test de PHP 8. Tout d'abord, nous téléchargeons PHP 8. à partir du code source de la version Github Test (le téléchargement du package de code source du site officiel PHP est trop lent) :

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

Décompressez et entrez le répertoire racine du code source :

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

Démarrez la compilation et l'installation process :

// 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

La dernière étape a été exécutée avec succès. Ensuite, un texte d'invite s'affichera indiquant que PHP 8 a été installé avec succès. Vous pouvez également vérifier l'installation réussie via la commande suivante :

.

Le PHP 8 actuel est installé dans le répertoire /usr/local/php8.

Fichier de configuration d'initialisation

Pour compiler et installer PHP 8, vous devez copier et définir vous-même le fichier de configuration. Nous copions d'abord le fichier de configuration de base php.ini de. le répertoire du code source dans le répertoire d'installation de PHP :

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

Étant donné que JIT est fourni dans l'extension Opcache, vous devez d'abord démarrer cette extension, ouvrir /usr/local/php8/php.ini et décommenter les éléments de configuration suivants (supprimez simplement le point-virgule précédent ):

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

Puis initialisez le fichier de configuration PHP-FPM.

Copiez d'abord le fichier binaire php8.0-fpm dans le répertoire /etc/init.d (fonctionnez toujours dans le répertoire de code source 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(每秒处理请求数):

Limpact des nouvelles fonctionnalités de PHP 8 JIT sur les performances des applications 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 表示超时时间。

运行结果如下:

Limpact des nouvelles fonctionnalités de PHP 8 JIT sur les performances des applications PHP

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

小结

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer