PHP 中的 JIT 配置

发布于 2022-01-18  9741 次阅读


PHP8 在 PHP 的内核中添加了 JIT 编译器,开启后可以为程序增加一定的运行速度。

要使用 JIT 必须开启 opcache

opcache 的配置

// 加载 opcache
zend_extension=opcache.so
// 开启 opcache
opcache.enable=1
// OPcache 共享内存存储大小,单位 MB
opcache.memory_consumption=1024
// PHP 使用了一种叫做字符串驻留,默认是 4MB,建议设置为 64
opcache.interned_strings_buffer=64
// 这个选项用于控制内存中最多可以缓存多少个 PHP 文件, 这个选项必须得设置得足够大,大于你的项目中的所有 PHP 文件的总和
opcache.max_accelerated_files=80000
// 设置多少秒后重新验证脚本,如果设置为 0,需要手动在每次 PHP 代码更改后手动清除 opcache 缓存
opcache.validate_timestamps=0
// 设置缓存的过期时间(单位是秒), 为 0 的话每次都要检查
opcache.revalidate_freq=3
// 允许更快速关闭
opcache.fast_shutdown=1
// CLI 环境下,PHP 启用 OPcache
opcache.enable_cli=1

JIT 的配置

opcache.jit 是有点复杂的配置值。它接受 disable,on,off,trace,function 和按顺序排列的 4 个不同标志的 4 位值

  • disable:在启动时完全禁用 JIT 功能,并且在运行时无法启用
  • off:禁用,但是可以在运行时启用 JIT
  • on:启用 tracing 模式
  • tracing:细化配置,别名 1254
  • function:细化配置,别名 1205

其默认值为 tracing,它在运行代码时编译热代码,并允许使用 CPU 寄存器和 AVX 扩展

jit 标志

每个数字仅表示一个配置选项
以 CRTO 的形式,并接受 C,R,T,O 位置的以下值

C-CPU 特定的优化标志

code说明
0不使用
1使用

R-寄存器分配

code说明
0不执行寄存器分配
1使用本地线性扫描寄存器分配器
2使用全局线性扫描寄存器分配器

T-JIT 触发器

code说明
0PHP 脚本载入的时候就 JIT
1当函数第一次被执行时 JIT
2在一次运行后,JIT 调用次数最多的百分之(opcache.prof_threshold * 100)的函数
3当函数/方法执行超过 N(N 和 opcache.jit_hot_func 相关)次以后 JIT
4当函数方法的注释中含有 @jit 的时候对它进行 JIT
5当一个 Trace 执行超过 N 次(和 opcache.jit_hot_loop,jit_hot_return 等有关)以后 JIT

O-优化级别

code说明
0最小 JIT(调用标准 VM 处理程序)
1做 opline 之间的跳转部分的 JIT
2基于单个函数的静态类型推断的优化 JIT
4基于类型推断,过程调用图做函数级别 JIT
5基于类型推断,过程调用图做脚本级别的 JIT

基于以上的配置选项来说,应该尽量使用 12x5 型的配置,此时应该是效果最优的。
如果是脚本级别的,应该使用 1205
如果是 Web 服务的,应该使用 1255 或 1235

总之,应该根据自己项目的具体要求来配置 JIT

因此,JIT 的推荐配置如下

opcache.jit_buffer_size=64
opcache.jit=1255