Menjalankan php 8 dengan jit in docker dalam 5 menit

Musim dingin akan datang! Dan bersamaan dengan itu, rilis php 8. Jika Anda tidak sabar untuk menguji kode Anda dalam versi beta dari php 8, dan pada saat yang sama merasa jit, silakan, di bawah cat.



TL: DR;



Semua contoh dapat diunduh dari github dan segera dijalankan: github.com/xtrime-ru/php8-test



Latihan



Pertama, Anda perlu menginstal docker dan docker-compose.



Sekarang mari buat file opcache.ini yang akan mengaktifkan opcache dan JIT di container kita.

; 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




Sekarang Anda perlu membuat Dockerfile di folder kerja Anda.

Daftar paket dan ekstensi disediakan sebagai contoh. Anda dapat menghapus baris ini atau menentukan ekstensi yang Anda butuhkan. Selain itu, beberapa ekstensi populer sudah disertakan dalam gambar dasar. Jadi tidak perlu menyertakan json, xml dan banyak lainnya.



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




File terakhir tetap ada. Ini adalah docker-compose.yml, yang membuatnya mudah untuk mengelola container selama pengembangan.



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"




Sekarang Anda dapat menjalankan build dan pengujian container.



  1. Bangun image: docker-compose build
  2. Jalankan container di latar belakang: docker-compose up -d
  3. Hubungkan ke wadah: buruh pelabuhan exec -it php8-test / bin / bash
  4. Folder saat ini di wadah disinkronkan dengan folder proyek. File-file tersebut dapat diedit di mesin lokal.
  5. Unduh file benchmark: github.com/php/php-src/blob/master/Zend/bench.php
  6. Jalankan bangku: php bench.php
  7. Anda dapat menonaktifkan jit atau opcache di dalam penampung di sini: /usr/local/etc/php/conf.d/opcache.ini untuk melihat bagaimana kinerja berubah
  8. Di docker-compose.yml, Anda dapat mengubah direktif `volumes` dan` workdir` untuk menautkan direktori lain ke container. Anda juga dapat mengubah titik masuk untuk menjalankan perintah lain saat penampung dimulai. Misalnya `php artisan serve` untuk laravel.
  9. Semua file juga dapat dilihat di browser di http://127.0.0.1:8000/

    Direktif entrypoint dan port bertanggung jawab untuk ini.




Tolok ukur



File benchmark dari repositori php resmi: 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, tentu saja, sangat mempercepat operasi terkait CPU. Tapi ada hal lain yang mengejutkanku. Php default ke opcache.enable_cli = 0. Jika Anda mengaktifkan opsi ini, Anda bisa mendapatkan peningkatan ganda dalam patokan. Secara pribadi, saya tidak tahu bahwa opcache dapat mempercepat perintah cli sebanyak itu.



Saya telah menguji beberapa kali pada wadah bersih, serta pembersihan awal opcache. Hasilnya selalu sama: opcache.enable_cli = 1 mempercepat benchmark sejak pertama kali dijalankan.



The dokumentasi opcache.enable mengatakan: "Jika dinonaktifkan, kode tersebut tidak akan dioptimalkan dan cache."



Sayangnya, dalam skrip cli yang sebenarnya, hasil setelah mengaktifkan opcache.enable_cli dan jit bisa sangat berbeda. Pada satu proyek saya mendapat keuntungan 5% (4,0 detik -> 3,8 detik), dan pada proyek lain, sebaliknya, terjadi perlambatan (0,088 detik -> 0,11 detik). Oleh karena itu, Anda harus menguji pengaturan pada proyek Anda sendiri.



All Articles