5分でdockerのjitでphp8を実行する

冬が来る!それに伴い、php8のリリースが近づいています。php8のベータ版でコードをテストするのが待ちきれず、同時にjitを感じる場合は、catの下でお願いします。



TL:DR;



すべての例はgithubからダウンロードして、すぐに実行できます:github.com/xtrime-ru/php8-test



トレーニング



まず、dockerとdocker-composeをインストールする必要があります。



次に、コンテナでopcacheとJITを有効にするopcache.iniファイルを作成しましょう。

; Extended PHP.ini file to enable JIT.
; ====================================
; Place this file under /usr/local/etc/php/conf.d/
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=32M
opcache.jit=1235




次に、作業フォルダーにDockerfileを作成する必要があります。

パッケージと拡張機能のリストは例として提供されています。これらの行を削除するか、必要な拡張子を指定できます。また、人気のある拡張機能のいくつかは、ベースイメージにすでに含まれています。したがって、json、xml、その他多くを含める必要はありません。



FROM php:8.0-rc-cli

COPY opcache.ini /usr/local/etc/php/conf.d/

RUN apt-get update && apt-get upgrade -y \
    && apt-get install apt-utils -y \
#
#      
    && apt-get install git zip vim libzip-dev libgmp-dev libffi-dev libssl-dev -y \
#
#      
    && docker-php-ext-install -j$(nproc) sockets zip gmp pcntl bcmath ffi \
#
#      pecl  ,   php 8 pecl  ,    
#    && PHP_OPENSSL=yes pecl install ev \
#    && docker-php-ext-enable ev \
#
#      
    && docker-php-source delete \
    && apt-get autoremove --purge -y && apt-get autoclean -y && apt-get clean -y




最後のファイルが残ります。これはdocker-compose.ymlであり、開発中にコンテナを簡単に管理できます。



version: '3.5'
services:
  php8-test:
    build: ./
    container_name: php8-test
    restart: unless-stopped
    volumes:
      - ./:/app
    working_dir: /app
    entrypoint: "php -S 0.0.0.0:8000"
    ports:
      - "127.0.0.1:8000:8000"
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "2"




これで、コンテナのビルドとテストを実行できます。



  1. イメージをビルドします:docker-compose build
  2. コンテナをバックグラウンドで実行します:docker-compose up -d
  3. コンテナに接続します:docker exec -it php8-test / bin / bash
  4. コンテナ上の現在のフォルダは、プロジェクトフォルダと同期されます。ファイルはローカルマシンで編集できます。
  5. ベンチマークファイルをダウンロードします:github.com/php/php-src/blob/master/Zend/bench.php
  6. ベンチを実行します:phpbench.php
  7. ここでコンテナ内のjitまたはopcacheを無効にできます:/usr/local/etc/php/conf.d/opcache.iniパフォーマンスの変化を確認するには
  8. docker-compose.ymlで、 `volumes`および` workdir`ディレクティブを変更して、他のディレクトリをコンテナにリンクできます。エントリポイントを変更して、コンテナの開始時に別のコマンドを実行することもできます。たとえば、laravelの「phpartisanserve」。
  9. すべてのファイルは、http

    ://127.0.0.1:8000 /のブラウザでも表示できます。entrypointおよびportsディレクティブがこれを担当します。




基準



公式phpリポジトリのベンチマークファイル:github.com/php/php-src/blob/master/Zend/bench.php



#########################
# php 7.4.9
# opcache.enable=1
# opcache.enable_cli=0

simple             0.053
simplecall         0.007
simpleucall        0.019
simpleudcall       0.022
mandel             0.182
mandel2            0.220
ackermann(7)       0.038
ary(50000)         0.006
ary2(50000)        0.005
ary3(2000)         0.045
fibo(30)           0.069
hash1(50000)       0.014
hash2(500)         0.008
heapsort(20000)    0.036
matrix(20)         0.034
nestedloop(12)     0.089
sieve(30)          0.014
strcat(200000)     0.006
------------------------
Total              0.867

#########################
# php 7.4.9
# opcache.enable=1
# opcache.enable_cli=1

simple             0.007
simplecall         0.003
simpleucall        0.004
simpleudcall       0.003
mandel             0.088
mandel2            0.113
ackermann(7)       0.036
ary(50000)         0.006
ary2(50000)        0.007
ary3(2000)         0.039
fibo(30)           0.055
hash1(50000)       0.012
hash2(500)         0.008
heapsort(20000)    0.030
matrix(20)         0.029
nestedloop(12)     0.041
sieve(30)          0.011
strcat(200000)     0.007
------------------------
Total              0.499

#########################
# php 8.0-rc
# opcache.enable=1
# opcache.enable_cli=1
# opcache.jit_buffer_size=128M
# opcache.jit=1235

simple             0.002
simplecall         0.001
simpleucall        0.001
simpleudcall       0.001
mandel             0.008
mandel2            0.009
ackermann(7)       0.016
ary(50000)         0.006
ary2(50000)        0.007
ary3(2000)         0.015
fibo(30)           0.030
hash1(50000)       0.016
hash2(500)         0.011
heapsort(20000)    0.014
matrix(20)         0.012
nestedloop(12)     0.010
sieve(30)          0.004
strcat(200000)     0.006
------------------------
Total              0.168




もちろん、JITはCPU関連の操作を大幅に高速化します。しかし、何か他のものが私を襲った。 Phpのデフォルトはopcache.enable_cli = 0です。このオプションを有効にすると、ベンチマークが2倍になります。個人的には、opcacheがcliコマンドをそれほど高速化できることを知りませんでした。



クリーンなコンテナで数回テストしたほか、opcacheを事前にクリーニングしました。結果は常に同じです。opcache.enable_cli= 1は、最初の実行からベンチマークを高速化します。opcache.enableドキュメントは言う:「無効の場合は、コードがされずに最適化され、キャッシュさ。」







残念ながら、実際のcliスクリプトでは、opcache.enable_cliとjitを有効にした後の結果は大きく異なる可能性があります。一方のプロジェクトでは5%(4.0秒-> 3.8秒)のゲインが得られ、もう一方のプロジェクトでは逆にスローダウン(0.088秒-> 0.11秒)が得られました。したがって、自分のプロジェクトで設定を確実にテストする必要があります。



All Articles