ホームページ  >  記事  >  バックエンド開発  >  PHP 8 の新機能 JIT が PHP アプリケーションのパフォーマンスに与える影響

PHP 8 の新機能 JIT が PHP アプリケーションのパフォーマンスに与える影響

藏色散人
藏色散人転載
2020-10-30 16:25:105469ブラウズ

推奨: "PHP8 チュートリアル "

序文

次期 PHP 8 で最も注目を集める新機能は、 JIT サポートの概要として、JIT とは何か、および Opcache との違いを簡単に紹介しました。要約すると次のとおりです:

  • JIT は Opcache 最適化に基づいており、ランタイム情報と組み合わせてバイトコードをマシン コードにコンパイルします。キャッシュ済み
  • 既存の Opcache 最適化はまったく影響を受けず、PHP の JIT は Opcache で提供されます
  • JIT は Opcache の代替ではなく、拡張機能です。 、特定のバイトコードがマシン コードにコンパイルされていることを Zend 最下層が検出した場合、Zend VM をバイパスして CPU に直接マシン コードを実行させることができるため、コードのパフォーマンスが向上します。

非常にハイエンドに見えますが、JIT は主に CPU 集中型の操作に最適化されており、現在の主流の PHP Web アプリケーションはすべて 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 に比べるとまだはるかに遅れていますが、Windows 10 は開発者にとってますますフレンドリーになっていると言わざるを得ません。結局のところ、Mac はネイティブの Unix に似たシステムです。

話に戻り、WSL バージョンの Ubuntu 仮想マシンをインストールします。Windows は、対応するドキュメントを公式に提供しています: Windows Subsystem for Linux Installation Guide for Windows 10, それに従ってください。 Windows では非常に簡単です。ストアからダウンロードしてインストールした後、スタート ボタンをクリックして Ubuntu 仮想マシンを起動できます。

開いた後のインターフェイスは次のようになります。

この仮想マシンを使用するエクスペリエンスは、従来の仮想マシンよりも簡単です。たとえば、Windows ホスト プログラムを直接呼び出すことができます。 VS Codeなどの仮想マシン上でNginxを介して管理できるほか、ポートマッピングを設定せずにWindowsホストブラウザからWebアプリケーションに直接アクセスできるため、ローカルのLinuxテスト環境や開発環境としても非常に便利です。

もちろん、新しいことを試したくない場合は、従来の仮想マシンまたはネイティブの Ubuntu システムを使用できます。

デモ プロジェクトの初期化

次に、上で開いたターミナル ウィンドウから、次の手順に従って、この Ubuntu 仮想マシンに Nginx、PHP、Composer をインストールする必要があります。次のコマンドで実行できます:

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

次に、Composer を介して、デモンストレーション用の Laravel Web プロジェクトを Nginx のデフォルト Web ルート ディレクトリ /var/www にインストールします (ダウンロード速度が遅いため、 Composer をグローバルに設定できます。Mirror):

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

初期化が完了したら、php Artisan Serve を使用して、このプロジェクトへのアクセスが正常かどうかをテストできます。ここでは説明しません。

PHP 8 テスト版のコンパイルとインストール

上記の準備が完了したら、PHP 8 テスト版のコンパイルとインストールを開始できます。まず、以下から PHP 8 をダウンロードします。 Github テスト バージョンのソース コード (PHP 公式 Web サイトのソース コード パッケージのダウンロードが遅すぎる):

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 from ソース コード ディレクトリを 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

进入 /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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はxueyuanjun.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。