如何启用 JIT 并选择 tracing 模式?
解读
国内生产环境普遍已迁移到 PHP 8+,JIT 作为性能热点常被面试官追问。
本题表面问“怎么开”,实则考察三层能力:
- 是否知道 JIT 只在 Opcache 打开时才生效;
- 能否把“开启”与“模式选择”拆成两步,用 ini 或环境变量准确落地;
- 是否理解 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,无需重启机器
答案
线上常规做法分三步:
-
确认 Opcache 已加载
php -m | grep OPcache
若无,yum/apt 安装 php-opcache 并重启 php-fpm。 -
在 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 最高优化 -
重启 php-fpm,验证
php -r "var_dump(opcache_get_status()['jit']['enabled']);"
输出 bool(true) 且 mode=tracing 即成功。
灰度观察 10 min,若 CPU 不降反升或 502 增加,立即把 jit_buffer_size 改 0 重载,30 秒回滚完毕。
拓展思考
- 函数级热点场景(如纯计算类 API)可试 function 模式:opcache.jit=1455,压测对比 QPS 与 CPU 利用率,取最优。
- 国内 ARM 服务器(鲲鹏、倚天)需确认 JIT 后端是否开启 GPR 寄存器映射,必要时降级 opcache.jit 第 4 位为 4。
- 配合 Prometheus + Grafana,监控 opcache_get_status()['jit']['num_compiles'] 与 request_time,量化 JIT 收益,面试可展示数据驱动调优思路。