如何启用 JIT 并选择 tracing 模式?

解读

国内生产环境普遍已迁移到 PHP 8+,JIT 作为性能热点常被面试官追问。
本题表面问“怎么开”,实则考察三层能力:

  1. 是否知道 JIT 只在 Opcache 打开时才生效;
  2. 能否把“开启”与“模式选择”拆成两步,用 ini 或环境变量准确落地;
  3. 是否理解 tracing 与 function 模式差异,能结合业务场景做权衡。
    回答时先给“最小可用配置”,再补“验证步骤”与“回滚方案”,体现工程化思维。

知识点

  • JIT 依赖 Opcache,php -m 必须看到 Zend OPcache
  • 三大 ini 指令:opcache.enable、opcache.jit_buffer_size、opcache.jit
  • opcache.jit 语法:4 位掩码,第 1 位固定为 1 表示启用;第 2 位 0=tracing、1=function;第 3、4 位控制寄存器分配与 CPU 优化级别
  • 国内镜像源(阿里云、腾讯云)的 PHP 8 系列包已默认带 JIT,编译时无需额外 --enable-jit
  • 验证:php -d opcache.enable_cli=1 -d opcache.jit_buffer_size=64M -r "var_dump(opcache_get_status()['jit']);"
  • 回滚:将 opcache.jit_buffer_size 置 0 即完全关闭 JIT,无需重启机器

答案

线上常规做法分三步:

  1. 确认 Opcache 已加载
    php -m | grep OPcache
    若无,yum/apt 安装 php-opcache 并重启 php-fpm。

  2. 在 php.ini 追加(或创建 99-opcache.ini)
    opcache.enable=1
    opcache.enable_cli=1 # 可选,方便命令行验证
    opcache.jit_buffer_size=128M # 国内 4 GB 内存容器建议 64–128 M
    opcache.jit=1255 # 1 启用 | 2 选 tracing | 5 寄存器分配优化 | 5 CPU 最高优化

  3. 重启 php-fpm,验证
    php -r "var_dump(opcache_get_status()['jit']['enabled']);"
    输出 bool(true) 且 mode=tracing 即成功。

灰度观察 10 min,若 CPU 不降反升或 502 增加,立即把 jit_buffer_size 改 0 重载,30 秒回滚完毕。

拓展思考

  1. 函数级热点场景(如纯计算类 API)可试 function 模式:opcache.jit=1455,压测对比 QPS 与 CPU 利用率,取最优。
  2. 国内 ARM 服务器(鲲鹏、倚天)需确认 JIT 后端是否开启 GPR 寄存器映射,必要时降级 opcache.jit 第 4 位为 4。
  3. 配合 Prometheus + Grafana,监控 opcache_get_status()['jit']['num_compiles'] 与 request_time,量化 JIT 收益,面试可展示数据驱动调优思路。